搜索

百度PRNN:增强GPU伸缩性RNN训练最高提速30倍

gecimao 发表于 2019-07-01 13:20 | 查看: | 回复:

  尽管有各种深度学习加速器,神经网络的大小依然受限于计算平台的能力。百度硅谷人工智能实验室高级研究员Greg Diamos在最近的ICML 2016上发表了一篇PRNN(Persistent RNNs)的论文(相关英文访谈),介绍了他在深度学习平台GPU可扩展性方面的最新工作。但在此之前,Greg Diamos已经在Github上发布一篇博客文章简要解释了PRNN的工作和效果,本文为这篇文章的译文。PRNN已经在Github上开源,感兴趣的读者可以自行下载。

  在SVAIL(百度硅谷人工智能实验室),我们的使命是创造能够对数以亿计的人们产生深远影响的AI技术。我们相信,达到这个目标的一种良好方式是提高语音识别的准确性,这将通过在更大数据集上使用深度学习算法实现。这些算法需要大量的运算,所以系统的内存大小和计算吞吐量会限制数据量以及我们可以训练的神经网络大小。所以搞清楚如何更有效地运行深度学习是一大挑战。这么做可以让我们在更大数据集上训练更大的模型,目前已经提高了语音识别的准确性。在这里,我们将要讨论一项新技术,它能加快深度递归神经网络(Recurrent Neural Networks)的训练。

  我们两个语音识别模型的密集计算集中于递归层(上图中蓝色部分),所以这种优化直接针对这部分网络。

  通常实现递归神经网络的方式是进行一系列的矩阵乘法操作,参见前一篇博文以及上图。这包括从片外存储器中为每一个时间步长加载递归权重矩阵U和活化向量H。

  在高性能存储器上,比如GPU,片外存储器要比片上存储器(如寄存器文件和高速缓存)慢的多,效率更低。所以当小批量数据相对较大(每GPU大约64或更高)时,矩阵乘法最高效,因为递归权重可以从片外存储器上一次性加载,并在小批量的每个样例上重复使用。

  应该清楚,在每块GPU上使用较大的小批量会占用更多的内存。在许多时间步长上训练RNN时,存储活化向量需要的内存要比网络权重多许多。

  例如,存储一个有1200个单元,每个单元是32位浮点数的简单RNN的权重,大约需要5.7MB的内存,但是存储一个小批量大小为64和700个时间步长的活化向量,则需要215MB的内存。所以,增加小批量的大小会直接导致训练模型所需内存的增加。

  还需要明确的是,每个GPU上使用较大的小批量会并行地耗尽可用的数据,这些数据可能已经用于多GPU上传播计算。使用512小批量大小的算法,每GPU小批量大小为4,可以使用128块GPU,但是每GPU小批量大小为64的线块GPU以最高效率来训练单个模型对许多读者来说似乎有些苛刻,但这对我们很重要,因为这可以让我们测试语音识别精度是否会随着网络大小和数据容量的增长而持续提高。

  最后,在每块GPU上使用大批量,会复杂化模型部署,因为在同一GPU上,多用户流需要被同时调度处理。这在嵌入式应用(比如运行在手机上的语音识别)中非常困难,因为通常只有单个用户。在云服务上部署也同样困难,因为多用户流必须在单个服务器上同时调度以达到良好的能源效率,但是不能有太多的流,因为会增加时延。

  所以,我们想找到一种方法来一次性加载递归权重并且多次使用它们,而不增加小批量大小。

  对于GPU,片上存储器上最大的资源分布于数千个线程的各个寄存器文件中。例如,英伟达TitanX GPU的寄存器文件内存有6.3MB,足够存储约有1200个活化向量的递归层。持久内核利用这个寄存器文件内存来缓存递归权重并且在多个时间步长上重复使用它们。

  然而,如果单个线程在网络权重的各个子集上工作,那么它们必须进行通信,对于当前的时间步长,需要将每个部分的计算结果结合在一起,同时还要为其他线程创建的下一个时间步长读取更新的活化向量。这意味着,数千个GPU线程需要在每个时间步长内保持通信并且相互同步。这种类型的同步不受CUDA或OpenCL的支持,因为相比单线程块而言,GPU不能保证更多的线程会同时运行。然而,它们通常是许多线程同时运行,特别是在像TitanX这样的更大GPU上。我们可以通过在GPU上实现一种形式的抢先多任务处理来解决这个限制,各个线程使用全局障碍直接进行同步,但最终会超时并退出。CPU上的一个运行时系统监控着过早退出的线程,然后重启内核(重新从内存中加载权重)直到所有任务都成功。在实践过程中,如果只有这个程序使用GPU,并且我们不启动太多的线程,那么全局障碍几乎不会超时。

  比起基于矩阵乘法的实现,这种方法在小批量上显著提高了性能。批量大小为4的情况下,性能从90GFLOPs变成了2.8TFLOPs,大约提升了30倍。

  为解决性能问题,通常会有多种可能的解决方案。本节会介绍除了持久RNN以外的技术来减少训练RNN的内存使用量以及每块GPU小批量的大小。我们已经发现,对于我们的语音识别模型,它们没有持久RNN有效。然而这种技术可能在其他情况下效果不错。

  随时间截短反向传播能够减少反向传播过程中存储活化向量所需的内存,在处理语义剩余部分之前,它会以固定数量的时间步长进行前向和反向传播。这种方法会显著减少训练网络所需的内存,因为只有固定数量的时间步长的活化向量需要被存储,但这样做会在长时间依赖上丢失梯度信息。在我们的系统中,我们发现,相比于在整个语义上使用反向传播,使用随时间截短反向传播会丢失大约20%的语音识别精度。所以对于我们的语音识别模型,我们不采用随时间截短反向传播这种方式。

  另外一种规避GPU内存限制的方式是在CPU的片外存储器上缓存用于反向传播的活化数据,CPU片外存储器通常比GPU片外存储器大很多。这是以系统分级存储体系(例如CPU DRAM,SSD缓存,磁盘等)的更高级别,存储用于反向传播的活化向量一般策略的一种特殊情况。如果从CPU中向后、向前拷贝数据所需的时间比网络中前向传播和反向传播中算术运算所需的时间少,那么这种方法有效。然而,对于我们的情况,单个节点上,网络在8块GPU的速度已经够快了,从CPU DRAM中向后、向前传播数据会导致整个系统2-4倍的性能下降。此外,它还会占用我们用来实现节点之间并行化数据规约操作的处理器内连接带宽。所以对我们的系统来说这么做没有意义。一般而言,这种方法更适合于每块CPU上有更少GPU的系统,或者更慢的RNN实现的系统。

  最后一种减少每块GPU所需内存的方式是使用并行化模型对多GPU上的各个递归层进行分区。这种方式仍然使用矩阵乘法来进行RNN的前向和反向传播操作,但在多GPU上对各个矩阵乘法进行分布式计算。仍然需要使用较大的小批量来使矩阵乘法更高效,但它分配于多个GPU上,所以每块GPU上小批量的效率会降低。这种方法在每个时间步长内进行高昂的GPU之间的同步操作,用来结合分布式乘法的结果,所以当递归层非常大时,这么做才有意义,比如在4块TitanX GPU上每个递归层有5000个活化向量。这种方法可以结合使用持久RNN,持久RNN在中等大小的递归层上效率更佳,模型并行RNN在超大递归层上效果更好。

  这项工作表明,RNN权重可以高效地存储在GPU寄存器中,并可以通过这种方法来进行高吞吐量计算。这大大提高了在低小批量大小上的性能,从而能够在同样硬件上训练更深的模型,并在更多的GPU上大规模训练模型。

  将小批量大小从64降低到4,活化内存的占用节省了16倍。训练语音识别所需的大部分内存是用来为反向传播存储活化向量的,而不是用来存储网络权重,所以这种节省直接增加了我们可以训练的模型大小。我们现在可以在GPU内存中使用110层的深度递归网络,这比我们之前的7层模型深了一个数量级。

  减少每块GPU的小批量大小同样可以将数据并行化扩展到多个GPU上,而不需要改变算法批量大小。我们通常使用512或1024的算法小批量大小来训练网络,因为更大的值会减慢模型训练速度。在每块GPU上使用小批量大小为64可以在8到16块GPU上训练一个模型,而使用大小为4的小批量可以在128到256块GPU上训练同样的模型。

  随着未来GPU有更多的硬件线程,更大的片上存储容量,以及更低精度的浮点运算操作,使用这种方式训练出模型的层的大小会随之增加。这项工作重点在于深度语音网络中的RNN,但这种方法同样可以应用于GRU和LSTM,这将通过分布式GPU线程中权重矩阵实现。

  原则上,这种方法也可以应用于其他类型的处理器上,例如AMD或Intel的大型GPU可以在线程寄存器文件中缓存递归权重。多核处理器,比如Intel Xeon和Xeon PHI可以将递归权重缓存在L1和L2缓存中。FPGA可以将权重分布在芯片RAM块上。

  我们希望社区中的其他人可以将持久RNN运用于在更大数据集上训练更大、更深的递归神经网络。

  比RNN快136倍!上交大提出SRNN,现在RNN也能做并行计算   论文和开源代码地址:博文来自:jacke121的专栏

  场景:某台机器上有三块卡,想同时开三个程序,放到三块卡上去训练。策略:CUDA_VISIBLE_DEVICES=1pythontrain.py就可以指定程序在某块卡上训练。...博文来自:lujiandong1的专栏

  使用神经网络训练,一个最大的问题就是训练速度的问题,特别是对于深度学习而言,过多的参数会消耗很多的时间,在神经网络训练过程中,运算最多的是关于矩阵的运算,这个时候就正好用到了GPU,GPU本来是用来处...博文来自:luchi007的专栏

  之前用人脸识别库face_recognition做人脸识别,根据网上的demo试了试,发现当加入图片过多时,在启动该文件时需要预处理对图像编码的时间会非常长,影响体验,前两天看了CSD...博文来自:龙性的腾飞的博客

  岳排槐发自LZYY量子位出品公众号QbitAI去年,谷歌大脑团队发布神经网络自动架构搜索(NAS)。这个方法理论上能够更好地、自动化地设计神经网络的架构。尽管NAS表现出色,但却要耗费大量的计算资源...博文来自:量子位

  对于GPU来说,一定要注意的是,要分别在两个GPU上,或者不同时的在一个GPU上运行train和evaluation的部分,否则限于GPU擅长迭代而不擅长逻辑的特性,会发生OOM(outofmemor...博文来自:GZKPeng的博客

  深度学习的多gpu并行尝试——工作学习中的一点体会目录一、深度学习并行常用方法二、代码解析三、实验结果四、一些细节(一)并行常用方法:一般有两种方法,一种是模型并行,另一种是数据并行。模型并行:由于b...博文来自:qjzcy的博客

  主流深度学习硬件速度对比(CPU,GPU,TPU)个人主页--我们基于CNN实现Cifar10数据集分类把这段相同的代码在不同主流深度学习进行...博文来自:深度思考

  具体到cnn,利用gpu加速主要是在conv(卷积)过程上。conv过程同理可以像以上的向量加法一样通过cuda实现并行化。具体的方法很多,不过最好的还是利用fft(快速傅里叶变换)进行快速卷积。NV...博文来自:Black eyes的博客

  下载Windows.Mac.Linux客户端添加这个微信获取,第一步: Windows: 把下载好的客户端.exe文件放在一个没有空格和汉字的文件夹下,复制文件夹路径;打开 我的电脑-属性-高级系统设...博文来自:靳江海

  crfasrnn官网:官网中有相关的代码、论文、在线演示,可以参考。但本人在下载官网中的代码使用时遇到的一些问题或者...博文来自:绅商的博客

  作为全球最大的中文互联网搜索提供商,百度在其产品数据服务系统方面经验丰富。在本案例研究中,百度的高级架构师刘少山分享了他们在生产环境中使用Alluxio的经验,以及为什么......博文来自:Spark高级玩法

  GPU由于擅长矩阵运算,在深度学习尤其是计算机视觉方面得到了广泛的应用。前几天在我废了好大劲在我的的电脑上安装了Tensorflow2.0-GPU,然后就迫不及待地去体验一下GPU的速度。我去Tens...博文来自:的博客

  在深度学习训练中,我们经常遇到GPU的内存太小的问题,如果我们的数据量比较大,别说大批量(largebatchsize)训练了,有时候甚至连一个训练样本都放不下。但是随机梯度下降(SGD)中,如果能使...博文来自:gqixf的博客

  我们知道百度云管家对于非VIP用户了进行了下载限速,即使你的带宽再高只要没有开通VIP特权,使用百度云管家下载资源都是非常慢的,那等着真是干着急,现在我列举一些可用的方法供大家选择,可以告别卡、慢的百...博文来自:weixin_39568041的博客

  自从360网盘关闭以后,百度网盘一家独大,不开通超级会员基本给你限速,开通超级会员有时也没啥卵用分享一个提速的工具网盘地址:博文来自:程序员

  目标:优化代码,利用多进程,进行近实时预处理、网络预测及后处理:本人尝试了pytorch的multiprocessing,进行多进程同步处理以上任务。fromtorch.multiprocessing...博文来自:小小码农的博客

  晓查发自凹非寺量子位报道公众号QbitAI9102年,人类依然不断回想起围棋技艺被AlphaGo所碾压的恐怖。却也有不以为然的声音:只会下棋的AI,再厉害......博文来自:量子位

  一.权值共享什么是权值共享,看了博客上的很多东西感激写的很复杂,其实很简单,举个例子:如果你用全连接层,每一个神经元对一个50×50图像上的每个像素点都需要权重去计算,而如果采用卷积的话,如果你的卷积...博文来自:zxyhhjs2017的博客

  MTCNN训练数据    人脸检测和人脸框回归:WIDER_FACE    特征点标定:Celeba解释下什么全卷积网络,就是用一个卷积核卷积图片,所以只要图片的宽高大于卷积核的尺寸,都可以卷,卷出来...博文来自:u010039305的博客

  今天终于吧caffe配好了,迫不及待的测试了两个例子:一个是caffe自带的mnist例子。另一个是网上有人改了caffe的例子cpp_classification,功能是识别猫。配的比较困难,因为用...博文来自:的博客

  AlexNet的讲解,适应和对相应的参数的理解。博文来自:yuzhou164的博客

  前面提到了利用caffe训练模型时,只用单个CPU核的问题,通过openblas的方式解决了,但即使多个核用上了,但速度还是超级慢。就目前使用的网络而言,1min只能跑30iter(1个iter128...博文来自:keep forward, go, go, go

  中文词向量深度学习在NLP领域大展身手,而深度学习处理文本,离不开文本的向量化。英语独特的语法规则,使得单用空格就能将句子中的单词分割开来,从而取得词向量,这极大简化了英语的NLP预处理过程,工业界学...博文来自:xiezj007的博客

  构建DenseNet实现Cifar10数据集90%+准确率Cifar-10数据集本文使用的数据集基于Cifar-10,关于这个数据集本身的来历和细节网上有太多的文章了,这里不做多余的介绍了,基本上下面...博文来自:Kexiii的博客

  正常情况下,在百度云盘下载文件速度只有几百KB,这是因为百度对下载速度做了限制。如何突破百度的速度限制呢?这里使用一款名为InternetDownloadManager的软件来实现。百度搜索下载,安装...博文来自:Donny的专栏

  Xt代表输入序列中的第t步元素,例如语句中的一个汉字。一般使用一个one-hot向量来表示,向量的长度是训练所用的汉字的总数(或称之为字典大小),而唯一为1的向量元素代表当前的汉字。 St代表第...博文来自:cuipanguo的博客

  apollo项目中,感知模块使用了cnn,预测模块使用了rnn另外,还单独提供了一个endtoend的深度神经网络模型众所周知,在感知和预测领域,传统的基于数学或者控制理论的算法准确度都根本没法和深度...博文来自:lijianhua1205的专栏

  jquery/js实现一个网页同时调用多个倒计时(最新的)nn最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦!nnnn//jsn...博文来自:Websites

本文链接:http://windsorflowers.net/diguixiangliang/308.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部