分布式并行训练模型:微软PipeDream和谷歌的GPipe - kdnuggets


微软和谷歌一直在积极研究用于训练深度神经网络的新模型。这项工作的结果是发布了两个新框架:  Microsoft的PipeDream 和 Google的GPipe  ,它们遵循相似的原则来扩展深度学习模型的训练。这两个项目已在各自的研究论文(PipeDream,  GPipe)中进行了详细介绍,我将在今天进行总结。
 
训练深度神经网络的复杂度却随模型的质量和大小线性增加。随着模型缩放以达到更高的准确性,对这些模型的训练变得越来越具有挑战性。依靠GPU基础结构的改进来实现更好的训练是不可持续的。取而代之的是,我们需要分布式计算方法,这些方法可以并行化跨不同节点的训练工作量,以扩展训练规模。这种可并行训练的概念听起来很琐碎,但在实践中却导致极其复杂。如果您考虑一下,我们正在谈论的是在不同节点上划分模型的知识获取方面,然后将各个部分重新组合成一个内聚模型。但是,为了扩展深度学习模型,必须训练并行性。
 
谷歌的GPipe
 GPipe专注于扩展深度学习计划的训练工作量。从基础架构的角度来看,训练过程的复杂性是深度学习模型经常被忽视的一个方面。训练数据集越来越大,越来越复杂。例如,在医疗保健领域,遇到需要使用数百万个高分辨率图像进行训练的模型并不罕见。结果,训练过程通常要花费很长时间才能完成,并且导致内存和CPU消耗非常昂贵。
思考深度学习模型的并行性的有效方法是将其划分为数据和模型并行性。数据并行方法采用大型机器集群,将输入数据拆分到它们之间。模型并行性尝试将模型移至具有特定硬件的加速器,例如GPU或TPU,以加速模型训练。从高层次上讲,几乎所有训练数据集都可以按照一定的逻辑进行并行化,但是关于模型的说法却不尽相同。例如,一些深度学习模型由可以独立训练的并行分支组成。在那种情况下,经典策略是将计算划分为多个分区,并将不同的分区分配给不同的分支。但是,这种策略在按顺序堆叠各层的深度学习模型中是不足的。
GPipe通过利用一种称为流水线的技术将数据和模型并行性结合在一起。从概念上讲,GPipe是一个分布式机器学习库,它使用同步随机梯度下降和流水线并行性进行训练,适用于由多个连续层组成的任何DNN。GPipe在不同的加速器之间划分模型,并自动将一小批训练示例拆分为较小的微批。该模型允许GPipe的加速器并行运行,从而最大限度地提高了培训过程的可扩展性。
 
微软的PipeDream
几个月前,微软研究院宣布创建 Project Fiddle,这是一系列旨在简化分布式深度学习的研究项目。PipeDreams是Fiddle项目首次发布的版本之一,专注于深度学习模型训练的并行化。
PipeDream采用与其他方法不同的方法来利用称为管道并行性的技术来扩展深度学习模型的训练。这种方法试图解决数据和模型并行技术的一些挑战,例如GPipe中使用的技术。通常,在云基础架构上进行训练时,数据并行方法在规模上会承受较高的通信成本,并且随着时间的推移会提高GPU的计算速度。类似地,模型并行化技术通常效率低下地利用硬件资源,给程序员带来了不必要的负担,以决定如何在给定硬件部署的情况下拆分其特定模型。
PipeDream尝试通过使用称为管道并行性的技术来克服数据模型并行性方法的一些挑战。从概念上讲,管道并行计算涉及将DNN模型的各层划分为多个阶段,其中每个阶段均由模型中的一组连续层组成。每个阶段都映射到一个单独的GPU,该GPU对该阶段中的所有层执行正向传递(和反向传递)。
给定一个特定的深度神经网络,PipeDream会基于在单个GPU上执行的简短概要分析,自动确定如何对DNN的运算符进行分区,在不同阶段之间平衡计算负载,同时最大程度地减少与目标平台的通信。即使存在模型多样性(计算和通信)和平台多样性(互连拓扑和分层带宽),PipeDream也会有效地实现负载平衡。
PipeDream训练并行性的方法的原理比数据模型并行性方法具有多个优点。对于初学者而言,PipeDream需要在工作程序节点之间进行较少的通信,因为管道执行中的每个工作程序都仅需要将渐变的子集和输出激活信息仅传达给其他一个工作程序。
 
训练并行性是构建更大,更准确的深度学习模型的关键挑战之一。训练并行方法是深度学习社区中一个活跃的研究领域,需要将有效的并行编程技术与深度学习模型的本质相结合。尽管仍处于早期阶段,但Google的GPipe和Microsoft的PipeDream本身就是优点,它们是深度学习开发人员可用的两种最具创造性的并行训练方法。