4. Caffe多GPU并行方案
4.1 多GPU并行概述
得益于训练数据的爆炸性增长和计算性能的巨大提升,深度学习算法能够学习数据的分布和分层的特征表示,从而更好地解决模式分析和分类等任务。面对巨大的数据规模和复杂的深度学习模型,目前主流的单GPU训练方式已经无法满足计算性能和存储空间的要求,多GPU模型训练成为了发展趋势。本小节主要介绍深度学习系统的多GPU并行模式与训练方法,概述Caffe源生的多GPU数据并行方案。
深度学习领域的并行模式分为数据并行(data parallelism)和模型并行(model parallelism),在Jeff Dean和Andrew Ng针对深度学习的CPU集群框架DsitBelief[4]的论文中被提出。数据并行是指将训练数据划分为多份,每份数据有一个模型实例进行训练,再将多个模型实例产生的梯度合并后更新模型。模型并行是指将模型划分为多个分片,每个分片在一台服务器,全部分片协同对一份训练数据进行训练。Caffe实现了单机多GPU数据并行,通过I/O模块给每个GPU预缓冲batch数据,然后使用同步随机梯度下降算法进行训练。数据并行训练中,每个GPU卡持有一份模型的完整拷贝,各自训练后计算得到梯度值,然后进行参数交换。
多GPU数据并行训练的主要任务是维护全局模型参数的数据一致性,通过优化算法更新模型参数,最终使模型收敛,同时拥有较高的资源利用率和尽量低的延迟。在这一过程中,影响并行训练速度的瓶颈是参数交换。参数交换过程从逻辑上看,梯度收集阶段将全部梯度值累加起来,然后应用到当前模型以更新参数得到新模型,最后在模型分发阶段将新模型下发给全部GPU卡。采用数据并行后,相对于单卡训练过程,关键的问题是参数交换过程引入额外时间消耗,拖累了并行性能,使得加速比很难提高。可以通过精心设计多GPU参数交换的拓扑结构,提升系统的整体性能。Caffe采用树形拓扑结构进行梯度的归约和模型参数的分发。为了保证模型参数的数据一致性,所有GPU同时训练一个批次的训练数据,完成后经过同步等待,再同时交换参数。
从上文可知,多GPU并行训练系统从功能上划分为数据读取和分发以及数据并行训练两大部分。本文将在接下来的4.2和4.3小节详细分析Caffe并行训练方案的设计与实现,并在4.4小节提出当前Caffe多GPU并行方案的优缺点。
4.2 数据读取分发
数据并行是指对训练数据做切分,同时采用多个模型实例,对多个分片的数据并行训练。多个分片的训练数据从磁盘文件读取到CPU主存再拷贝到GPU显存,故此设计在各GPU计算每batch数据时,由Caffe的I/O模块从文件中读取并分发下一batch数据,以达到用计算时间掩盖I/O时间的目标。本节首先介绍Caffe对多个GPU的组织管理,然后在3.3小节的基础上阐释Caffe的I/O模块对多GPU数据并行训练的支持。在Caffe的多GPU并行训练方案中,主进程为每个GPU开启一个线程,分别完成Solver->Net->Layer的模型初始化工作,从而拥有一份模型的副本。主进程的Solver模型叫做根求解器(root_solver),它是GPU树形拓扑的根节点,在参数交换过程中用于归并梯度和分发新参数,保持模型参数的数据一致性。Caffe中的求解器Solver负责对模型优化,它首先根据模型参数对网络Net和各层初始化,模型初始化完成后调用Forward->调用Backward->更新权值,反复迭代优化模型。为了便于管理多个GPU,Caffe设计了独立于线程的全局管理器,包含GPU设备信息、模型拷贝个数solver_count。全局管理器保存系统的基础配置信息,具有线程独立性,进程和线程访问它时,将提供不同的结果。
Caffe的Layer类拥有一个ShareInParallel成员变量,用于声明是否允许该层在数据并行时被多个模型共享。由于Caffe采用数据并行方案,每个GPU上的模型训练是相互独立的,所以涉及训练模型的层默认不能被共享。数据输入层DataLayer是一个例外,还可以设置为共享,从而保证每个GPU上的solver按顺序地访问数据。当数据输入层DataLayer设置为不共享时,每个Solver都有一个私有的数据输入层DataLayer,类DataLayer拥有一个DataReader对象reader_。Reader_在实例化时会开辟一个双阻塞队列(QueuePair)类型的缓冲区,其大小等于预缓冲Batch数目和Batch大小的乘积。DataReader类中包含Body类,它实际上是第一级I/O的数据预读取线程,每个Body的对象控制一个数据源的读取。当多个DataLayer读取同一个数据库时,会实例化对应数目的缓冲区,但是只实例化一个Body对象,这样可以防止多个训练任务同时读取一个数据库。这是一种单生产者多缓冲区的生产者-消费者模型,示意图见图4-1。在第一级缓冲的生产过程中,数据预读取线程顺序地读取数据库,循环地均摊数据到多个DataLayer的缓冲区中。
图4-1 单生产者多缓冲区I/O
当数据层DataLayer设置为共享时,所有线程的Solver共享同一个数据输入层,此时只有一个第一级缓冲区,属于单生产者单缓冲区模型,如图4-2所示。当采用单生产者单缓冲区时,多个Solver的第二级数据预取线程并行地阻塞式读取同一个缓冲区,需要增大预缓冲Batch的数量。
图4-2 单生产者单缓冲区
Caffe中多GPU在同一个数据集训练时,数据输入层DataLayer无论是否允许共享,都只能有一个线程读取数据库。相较而言,每个模型拥有一个独立的数据输入层的并行度更高,负载均衡也较好。
4.3 数据并行训练
在数据并行训练过程中,每个GPU持有一份模型副本,多个GPU同时训练多组mini-batch数据,在一轮mini-batch训练结束时,需要同步地进行参数交换。数据并行中的参数交换需要将各个模型副本在本次mini-batch训练中得到的梯度合并后用于更新模型,之后再将最新模型推送到各个数据并行单元上用于下一轮计算。如何解决参数交换瓶颈以提高性能,成为并行方法设计的重中之重。
最优化的参数交换解决方案应具有以下特征:尽量减少总的通信量;尽量减少所用交换周期数;每个周期用满PCIe总线通信带宽;GPU间数据传输没有等待;可扩展性强,适用于不同GPU数目的场景。Caffe采用树形拓扑连接多个GPU,默认主进程监督的GPU为树形结构的根,其他CPU线程管理下的GPU作为根下面的节点。如图4-3所示,以4GPU数据并行为例,参数交换过程:0:1,2:3 交换梯度,更高层0:2 交换梯度,0号GPU归并梯度,更新模型的参数W,然后反方向分发更新后的模型参数。目前Caffe的多GPU并行不支持不同架构的GPU,同时最大模型尺寸受显存最小设备的限制。
图4-3 多GPU树形拓扑
为了更快地传输GPU数据,树型结构的构建要考虑GPU之间是否相近,比方说两个GPU之间是否可以进行P2P的直传,如果没有P2P DMA访问,例如数据通过PCIe root传递,有效交换带宽将大大降低。图4-4展示了经典的PCI-E总线架构图,GPU被分在了两个区域中,它们分别被不同的MCH(Memory Controller Hub)控制,连接在不同的CPU数据接口上。同一区域的CPU和GPU之间都是通过PCI-E的通道连接,但是CPU的PCI-E通道是有限的,在工程实践中通过PCI-E switch chip(PLX)增加通道数,使得多块GPU可以同时和一颗CPU连接。不同区域的CPU通过QPI(QuickPath Interconnect)连接,以保证不同区域的数据也能够通信。对于处于不同区域的GPU,它们之间传递数据的数据吞吐量和延时指标比较差。多GPU拓扑的构建要遵循这些原则:让CPU和GPU在同一个区域内,减少跨区域的数据拷贝传输;如果涉及到跨区域的GPU数据传输,尽量减少数据传输的次数。
图4-4 PCI-E总线架构图
当多GPU树形拓扑构建完毕,数据预缓冲到GPU显存,开始进入多GPU并行训练。Caffe的Solver提供了两个用于多GPU训练的回调函数:on_start()和on_gradient_ready()。如图4-5所示,on_start函数用于将参数分发拷贝到每一个GPU中,on_gradeint_ready函数用于归约反向传播的梯度值。
图4-5 参数交换过程
4.4 并行方案评价
Caffe源生的并行方案比较简单原始,本节将从功能与设计实现两个方面评价。Caffe只支持单机多卡的数据级并行,在中等数据规模与模型复杂度情况下较为适用。当深度网络模型十分复杂庞大时,单个GPU的显存无法装下完整的模型,就需要使用模型级并行来划分网络。由于Caffe不支持多机多卡分布式并行,难以应对实际生产环境中PB级的训练数据量。
从设计实现方面来讲,Caffe采用树形拓扑结构同步地交换参数这种实现方案是较为原始和低效的。Caffe采用同步更新参数的方式维护全局参数的数据一致性,每一轮Batch训练时要等待所有的GPU计算结束才归约梯度,并行速度受最慢的GPU限制,同步等待时间较长。其次,树形拓扑导致每个归并周期后,总有一半GPU不再参与之后的归并过程,闲置了其计算能力和所在节点上的通信带宽。树形拓扑的可扩展性也不够好,当GPU数目为奇数时构建树形结构Caffe会报错。此外,由于C语言源生多线程在python里是无效的,因此Caffe的python接口不能使用GPU并行训练。更好的方案是移除Caffe内部的并行方案,将多线程写在外面。
综上所述,Caffe的并行训练方案比较原始、低效,可以完全移除源生的并行方案,研究多机多卡分布式Caffe。当前主流的大规模分布式机器学习平台采用参数服务器(ParameterServer)方案维护全局参数,采用异步通信和灵活的数据一致性模型,具有数据同步延时低、可扩展性强和容错性等优点,本文将在第5章介绍参数服务器的原理与实现。
Reference
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.
从零开始山寨Caffe·捌:IO系统(二) , http://www.cnblogs.com/neopenx/p/5259197.html
转自:https://blog.csdn.net/solomon1558/article/details/52327525