本篇文章4344字,读完约11分钟

雷锋。(公开号码:雷锋。com)出版社:本文作者王红喜。原文包含在作者的个人博客中。雷锋。com已被授权。

在之前的博客中,deep neural network已经以两种方式进行了训练:独立训练和spark分布式训练,但事实上,deeplearning4j也支持多gpu训练。

在本文中,我将总结用gpu训练和评估dnn/cnn的过程。并给出了cpu、gpu和多卡gpu的性能对比图。然而,由于重点是解释在gpu上的mnist数据集的训练过程,所以将不详细描述一些环境的部署,例如java环境和cuda安装。

软件环境的部署主要在于两个方面,一是jdk的安装,二是cuda。目前,deeplearning4j和nd4j的最新版本支持cuda-8.0,jdk高于1.7。

环境部署后,使用java版本和nvidia-smi来确认环境部署是否正确。如果出现以下信息,说明环境部署正确;否则,需要重新安装。

Gpu配置:

java环境截图:

根据系统返回的信息,jdk是openjdk1.7,gpu是两张p40卡。

下面解释了代码的组成:因为我使用了deeplearning4j - v0.8的最新版本,所以对上一个博客的pom文件做了一些修改,如下所示:

4.0.0

深度学习

深度学习

2.0

utf-8

0.8.0

0.8.0

0.8.0

2.11

org.nd4j

nd4j-本地

${nd4j.version}

org.deeplearning4j

深度学习4j-core

${dl4j.version}

org.nd4j

nd4j-cuda-8.0

${nd4j.version}

org.deeplearning4j

deep learning 4j-parallel-wrapper _ $ { Scala . binary . version }

${dl4j.version}

org.apache.maven.plugins

maven-jar-插件

2.4

1.7

1.7

cn . live . wangonxi . cv . CNN NIST

创建maven项目并添加上面pom文件的内容后,您可以开始构建上层应用程序逻辑。这里我指的是官方网站的例子,它由以下几个部分组成:

●初始化cuda环境(底层逻辑包括硬件检测、cuda版本检查和一些gpu参数)

●读取mnist二进制文件(与以前的博客内容一致)

●有线电视新闻网的定义,我在这里仍然使用

●模型的培训和评估指标

首先,发布第一部分的代码:

//精度设置,常用精度包括单精度、双精度和半精度

//半:半精度

datatypeutil . setdtypeforcontext(data buffer . type . half);

//浮点:单精度

//datatypeutil . setdtypeforcontext(data buffer . type . float);

//双精度:双精度

//datatypeutil . setdtypeforcontext(data buffer . type . double);

//创建cuda上下文实例并设置参数

cudaenvironment.getinstance()。getconfiguration()

//是否允许多个图形处理器

。allowmultigpu(false)

//设置视频内存中缓存数据的容量,以字节为单位

。setmaximumdevicecache(2l * 1024 l * 1024 l * 1024 l)

//是否允许多个图形处理器之间的p2p内存访问

。allowcrossdeviceaccess(false);

通常,我们需要根据需要设置gpu计算的精度。如代码中所写,有三种常用精度:单精度、双精度和半精度。通过在databuffer中定义的枚举类型中选择值来设置精度。如果未设置,默认值为单精度。

接下来,我们设置cuda的一些上下文参数,如代码中列出的缓存数据的内存大小、p2p访问内存和多gpu操作的标志位等。当网络结构相对简单且数据量较少时,默认参数就足够了。在这里,我们只需设置几个参数,这就足够用lenet训练mnist数据集了。

第2~4部分的逻辑与上一篇博客中的几乎相同,因此您可以直接编写代码:

int nchannels = 1;

int outputnum = 10

int batchsize = 128

int nepochs = 10

int迭代= 1;

int seed = 123

log.info("加载数据...");

dataset iterator mnisttrain = new mnistdatasetiterator(batch size,true,12345);

dataset iterator mnisttest = new mnistdatasetiterator(batch size,false,12345);

log.info("构建模型…");

multilateryconfiguration conf = new neuralnetcconfiguration . builder()

。种子

。迭代(迭代)

。正则化(真)l2(0.0005)

。学习率(. 01)

。鲁西尼特(鲁西尼特.泽维尔)

。optimization go(optimization gorithm . random _ gradient _下降)

。updater(updater . nesterov)。动量(0.9)

。列表()

。图层(0,新卷积图层。生成器(5,5)

。nin(nchannels)

。步幅(1,1)

。nout(20)

。激活(activation.identity)

。构建())

。层(1,新的子扩增层.构建器(子扩增层. poolingtype.max)

。kernelsize(2,2)

。步幅(2,2)

。构建())

。图层(2,新的卷积图层。构建器(5,5)

。步幅(1,1)

。nout(50)

。激活(activation.identity)

。构建())

。层(3,新的子扩增层.构建器(子扩增层. poolingtype.max)

。kernelsize(2,2)

。步幅(2,2)

。构建())

。第4层,新denselayer.builder()。激活(activation.relu)

。nout(500)。构建())

。第5层,新的output layer . builder(loss functions . loss function . negative eloglilience)

。nout(outputnum)

。激活(activation.softmax)

。构建())

。setinputtype(inputtype .卷积flat(28,28,1))

。backprop(真)。预审(假)。构建();

多边网络模型=新多边网络(conf);

model . init();

log.info("火车模型…");

model.setlisteners(新的score iterationlistener(100));

long time x = system . current timemillis();

for(int I = 0;ilong time 1 = system . current timemillis();

model . fit(mnist train);

long time 2 = system . current timemillis();

log.info("***完成纪元{},时间:{} *** ",I,(时间2 -时间1));

{}

long time y = system . current timemillis();

log.info("***培训完成,时间:{} *** ",(timey-Timex));

log.info("评估模型…");

评估评估=新评估(output num);

while(mnisttest.hasnext()){

数据集ds = mnisttest . next();

in array output = model . output(ds . getfeaturematrix(),false);

eval.eval(ds.getlabels(),输出);

{}

log . info(eval . stats());

log . info(* * * * * * * * * * * * * * * * * * * *示例完成* * * * * * * * * * * * * * * * * * *);

上述逻辑是用gpu卡训练和评估mnist数据集的逻辑。如果你想在多个图形处理器下进行并行训练,你需要修改一些设置。例如,在第一步创建cuda环境上下文时,您需要允许多个GPU和p2p内存访问,也就是说,将其设置为true。然后将并行训练逻辑添加到逻辑中:

parallel rapper wrapper = new parallel rapper . builder(模型)

。预取缓冲器(24)

。工人(4)

。平均频率(3)

。report score after average(true)

。useregacyaveraging(true)

。构建();

这样,如果有多张gpu卡,就可以进行单机和多张卡的并行训练。

让我们发布cpu/gpu/ multi-gpu下的训练列表数据集与训练期间gpu使用情况的性能比较:

单卡培训截图:

双卡并行培训截图:

培训时间评估:

最后,做一个简短的总结。因为deeplearning4j本身支持gpu单卡、多卡和集群训练方法,并且底层接口已经打包了很多,所以暴露的接口都是高级接口,所以设置一些属性就足够了。当然,前提是包括cuda在内的硬件应该安装正确。

雷锋。com相关阅读:

选择哪个NVIDIA图形处理器进行深度学习?仅有性价比排名是不够的!

谷歌称tpu优于gpu,英伟达对此表示不满,并向谷歌扔了一辆特斯拉v100

Nlp实践培训课:阿里idst9专家带你到门口

Idst的九名工程师首次在网上授课,带您快速了解nlp技术

课程链接:m.leiphone/special/mooc03

雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。

来源:搜狐微门户

标题:DeepLearning4j 实战:手写体数字识别的 GPU 实现与性能对比

地址:http://www.shwmhw.com/shxw/61810.html