本文是腾讯深度学习系列文章的第三篇,聚焦于腾讯深度学习平台Mariana中深度卷积神经网络Deep CNNs的多GPU模型并行和数据并行框架。算法
将深度卷积神经网络(Convolutional Neural Networks, 简称CNNs)用于图像识别在研究领域吸引着愈来愈多目光。因为卷积神经网络结构很是适合模型并行的训练,所以以模型并行+数据并行的方式来加速Deep CNNs训练,可预期取得较大收获。Deep CNNs的单机多GPU模型并行和数据并行框架是Mariana的一部分,Mariana技术团队实现了模型并行和数据并行技术加速Deep CNNs训练,证明模型拆分对减小单GPU上显存占用有效,而且在加速比指标上获得显著收益,同时能够以较快速度训练更大的深度卷积神经网络,提高模型准确率。性能优化
图像识别是深度卷积神经网络得到成功的一个典型应用范例。服务器
图1揭示了一个具备5个卷积层和3个全链接层的深度卷积神经网络,该模型可应用于图像分类。网络
图1 ImageNet深度卷积神经网络模型框架
使用GPU训练深度卷积神经网络可取得良好的效果[1][2],自2012年使用Deep CNNs模型在ImageNet图像分类挑战中取得突破性成绩,2013年的最佳分类结果也是由Deep CNNs模型取得。基于此,Mariana技术团队指望引入Deep CNNs来解决或优化图像分类问题和图像特征提取问题,以提高在相应用例场景中的效果。性能
在将CNN应用于图像相关领域的算法研究以及CNN训练平台搭建的实践过程当中,受限于单个GPU上的显存大小(例如:服务器采购的显卡Tesla K20c可用显存为4.8GB,ImageNet 2012论文[1]中用到的网络占用显存大约3.9GB),在尝试调整参数和网络规模的实验中,每每难以存储下更大规模的深度卷积神经网络模型,使得包含较多参数的网络不能在单GPU上训练,须要经过多GPU模型并行技术,拆分模型到多个GPU上存储和训练来解决。学习
随着训练数据集扩充、模型复杂度增长,即便采用GPU加速,在实验过程当中也存在着严重的性能不足,每每须要十余天时间才能达到模型的收敛,不能知足对于训练大规模网络、开展更多试验的需求。测试
考虑到上述问题,在Mariana的Deep CNNs多GPU并行训练框架中,经过设计模型拆分方法、模型并行执行引擎和优化访存性能的Transfer Layer,并吸取在数据并行方面设计经验,实现了多GPU加速的模型并行和数据并行版本。优化
本文描述多GPU加速深度卷积神经网络训练系统的模型并行和数据并行实现方法及其性能优化,依托多GPU的强大协同并行计算能力,结合目标Deep CNNs模型在训练中的并行特色,实现快速高效的深度卷积神经网络训练。ui
多GPU模型并行+数据并行指望达到下述目标:充分利用Deep CNNs模型的可并行特色,结合SGD(Stochastic Gradient Descent,随机梯度降低)训练的数据并行特性,加速模型训练过程;突破显存大小限制,使得训练超过单GPU显存的模型成为可能,并预期经过训练更复杂的网络来得到更好的模型效果。
上述目标完成后,系统能够更快地训练图1中目标Deep CNNs模型。模型拆分到不一样GPU上可减小对单GPU显存占用,适用于训练更深层次、更多参数的卷积神经网络。
在图像识别应用中,深度卷积神经网络模型的卷积层计算量大,全链接层参数多。所以,如何划分计算资源,经过模型并行和数据并行两个数据/计算组织层次上来加速训练是框架设计首要解决的问题。
图像做为输入数据,其数据量庞大,且须要预处理过程,所以在Batch训练时磁盘I/O、数据预处理工做也要消耗必定时间。经典的用计算时间掩盖I/O时间的方法是引入流水线,所以如何设计一套有效的流水线方法来掩盖I/O时间和CPU处理时间,以使得总体耗时只取决于实际GPU训练时间,是一个重要问题。
模型并行是将一个完整Deep CNNs网络的计算拆分到多个GPU上来执行而采起的并行手段,结合并行资源对模型各并行部分进行合理调度以达到模型并行加速效果是实现模型并行的关键步骤。
多GPU系统经过UVA(Unified Virtual Address,统一虚拟地址)技术,容许一颗GPU在kernel计算时访问其余GPU的设备内存(即显存),但因为远程设备存储访问速度远远低于本地存储访问速度,实际性能不佳。所以在跨GPU的邻接层数据访问时,须要关注如何高效利用设备间数据拷贝,使全部计算数据本地化。
模型并行是:适当拆分模型到不一样的计算单元上利用任务可并行性达到整个模型在计算过程当中并行化效果。
如图2所示,揭示了从单GPU训练到多GPU模型并行训练的相异之处,主要在于:在使用单GPU训练的场景下,模型不进行拆分,GPU显存上存储整个模型;模型并行的场景下,将模型拆分到多个GPU上存储,所以在训练过程当中每一个GPU上实际只负责训练模型的一部分,经过执行引擎的调度在一个WorkerGroup内完成对整个模型的训练。
图2从单GPU训练到多GPU模型并行训练的概要视图
多GPU并行系统从功能上划分为用于读取和分发数据的Training Data Dispatcher和用于作模型并行训练的GPU Worker,如图3所示。训练数据从磁盘文件读取到CPU主存再拷贝到GPU显存,故此设计在各Worker计算每batch数据时,由Training Data Dispatcher从文件中读取并分发下一batch数据,以达到用计算时间掩盖I/O时间的设计目标。
图3 2 GPU模型并行系统框架示意
基于mini-batch的训练,现有技术方案在训练深度卷积神经网络时,每次从数据文件中读入和处理1个batch数据,在GPU计算某一batch时由CPU预读取和预处理下一batch。
可是随着训练集图片像素数增大,读取和处理时间随之增长,因为采用多GPU技术加速了单个batch计算时间,数据处理的性能问题随之而来,须要减小数据处理的用时,以使最终加速效果取决于计算用时。
如图4所示,整体看来,在深度卷积神经网络训练过程当中始终是在执行一条三阶段并行的流水线:计算本次batch数据——处理下次batch数据——读入再下次batch数据。
图4数据处理和计算流水线
数据并行以划分Worker Group为基本组织形式,模型并行以在Worker Group内划分Worker为基本组织形式,并行训练的调度资源来源于CPU线程,计算资源来源于GPU卡。因为GPU卡一般意义上被当作是一种加速卡或协处理器卡,必须在基于CPU的主机上下文中被调用来作计算,所以遵循1个CPU线程绑定1张GPU卡可以发挥多GPU共同参与计算时的并行性效能。
表1 4 GPU模型并行+数据并行CPU线程、GPU与Worker Group、Worker绑定关系
在实际生产环境中,安装多GPU服务器的硬件体系结构如图5所示,示例中揭示了一个8 GPU节点服务器的硬件配置,每两个GPU Slot链接在一个GPU专用PCI槽位上再经过PCIe Switch将GPU Slot 0,1,2,3链接在一颗CPU上,GPU Slot 4,5,6,7链接在另外一颗CPU上,两颗CPU经过IOH(Input Output Hub)链接。
图5硬件体系结构
模型并行的来源是Deep CNNs网络只在特定层(如输入层、全链接层)与其余层有全面的链接,而其余较为独立的直线链接关系便可做为模型的可并行部分。将模型的可并行部分拆分到多个GPU上,同时利用多个GPU的计算能力各执行子模型的计算,能够大大加快模型的单次前向-后向训练时间。
图6模型并行中的模型划分方案示意
Deep CNNs网络的层次模型其实是一张有向无环图(DAG图),分配到每一个模型并行Worker上的层集合,是有向无环图的拓扑排序子集,全部子集组成整个网络的1组模型。
考虑极端情景:须要训练超大规模Deep CNNs模型,或者使用计算能力相对较强、显存较小(通常在1GB~3GB)的桌面级GeForce系列GPU,则利用模型自己的并行性这种基本的模型划分方法将再也不适用。须要将模型再作拆分以保证单个GPU都能存储下对应的子模型。
如图7所示,描述了将模型按“十字形”划分到4 Worker上训练的情景,不只拆分了模型的可并行部分,也虽然这样的划分在Worker 0和Worker2之间,Worker 1和Worker 3之间达到并行加速效果,却能使得整个模型得以存储在4 GPU上。这种模型划分方法可以适用于训练超大规模网络等特殊模型的需求。
图7 “十字形”模型划分方案示意
每一个模型并行Worker上以一个模型并行执行引擎负责调度本Worker上子模型的执行过程。执行引擎控制全部Worker上的子模型完成前向和后向计算,各自对子模型完成参数更新后,到达主线程同步点,开始下一mini-batch训练。
多GPU模型并行和数据并行的Deep CNNs模型replicas及划分结构如图8所示,在使用4 GPU的场景下,划分了2组Worker Group用于数据并行;每一个Worker Group内划分2个Worker用于模型并行。
图8对ImageNet网络的模型并行和数据并行划分
实验环境为一台搭载8核心Intel(R) Xeon(R) CPU E5-2640 v2 @ 2.00GHz的服务器,内存为48GB,服务器安装了4块NVIDIA Tesla K20c GPU,单GPU显存大小为4.8GB。
训练一样的Deep CNNs模型,相比于单GPU,使用多GPU结合不一样并行模式的加速效果以下表所示:
表2不一样并行配置的加速比
对于目标Deep CNNs模型,在单GPU训练时(对照实验)显存占用量为3.99GB;使用2 GPU模型并行训练时单个GPU上显存占用量为2.15GB,而且在训练相同迭代时训练集、测试集错误率效果都与对照实验彻底相同;抽样比照参数一致性,被抽样的参数(同对照实验相比)也都是同样。
尝试更改Deep CNNs模型,训练一个更大的网络,增长滤波器数目,减少步长,增长中间卷积层feature map数目,训练时所需显存将达到9GB以上,使用单个Tesla K20c GPU(4.8GB显存)没法开展训练实验;而多GPU模型并行训练实验中该模型的错误率对比图1模型下降2%。
图9为图像标签识别的示例,经过对两千多类物体的图像进行训练,可实现对常见物体的自动识别。
图9应用效果展现
本文描述了腾讯深度学习平台Mariana中深度卷积神经网络Deep CNNs的多GPU模型并行和数据并行框架,经过多个Worker Group实现了数据并行,同一Worker Group内多个Worker实现模型并行。框架中实现了三阶段并行流水线掩盖I/O、CPU处理时间;设计并实现了模型并行引擎,提高了模型并行计算执行效率;经过Transfer Layer解决了数据存储访问效率问题。此框架显著提高了深度卷积神经网络训练速度,解决了当前硬件条件下训练大模型的难题。
深度卷积神经网络有着普遍的应用场景:在图像应用方面,Deep CNNs可应用于类似图片检索、图片的自动标注和人脸识别等。在广告图片特征提取方面,考虑Deep CNNs可以很好地学习到图像特征,咱们尝试将其用于广告点击率预估(Click-Through Rate Prediction,pCTR)模型中。
[1] Alex Krizhevsky, Ilya Sutskever, and Geoffrey E. Hinton. (2012) ImageNet Classification with Deep Convolutional Neural Networks. In Advances in Neural Information Processing 25 (NIPS 2012), MIT Press, Cambridge, MA.
[2] Ossama Abdel-Hamid, Abdel-rahman Mohamed, Hui Jiang, Gerald Penn. (2012) Applying Convolutional Neural Networks Concepts to Hybrid NN-HMM Model for Speech Recognition. ICASSP’12, 2012.
[3] Jeffrey Dean, Greg S. Corrado, Rajat Monga, et al, and Andrew Y. Ng. (2012) Large Scale Distributed Deep Networks. In Advances in Neural Information Processing 25 (NIPS 2012), MIT Press, Cambridge, MA.
[4] Omry Yadan, Keith Adams, Yaniv Taigman, Marc’Aurelio Ranzato. (2014) Multi-GPU Training of ConvNets. arXiv: 1312.5853v4 [cs.LG], Feb. 18th, 2014.