本篇文章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