模型的训练是深度学习应用程序生命周期中的一个部分,在模型达到一定的规模之前,我们认为它不会遇到什么挑战性。虽然在实验过程中训练基本模型是较为平常的工作,但复杂度与模型的质量和大小成线性关系。例如,2014年ImageNet视觉识别挑战赛(ImageNet visual recognition challenge)的获胜者是GoogleNet,它以400万个参数获得了74.8%的Top-1准确率;而仅仅在三年之后,2017年ImageNet挑战赛的获胜者则成了Squeeze-and-Excitation Networks(SENet),它用了1.458亿个(是之前的36倍以上)参数获得了82.7%的Top-1准确率。然而,在同一时期,GPU的内存只增加了大约3倍。
随着模型的发展,为了达到更高的精确度,这些模型的训练变得越来越具有挑战性。前面提到的例子表明,仅仅依靠GPU硬件设施的改进来实现更好的训练效果是不可持续的。相反,我们需要分布式的计算方法,将不同节点上的训练工作负载并行化,以便进行扩展训练。可并行化训练的概念听起来可能比较简单,但实际上却是极其复杂的工作。如果你思考一下,我们将要讨论通过跨不同节点来划分模型的知识获取部分,并在完成之后将这些部分再重新组合成为一个模型。然而,为了扩展深度学习模型,必须进行并行训练。为了应对这些挑战,微软和谷歌投入了数月进行研究和设计,分别发布了GPipe 和PipeDream。
GPipe(Google)
GPipe专注于扩展深度学习应用程序的训练负载。从基础设施的角度来看,训练过程的复杂性是在深度学习模型中经常被忽视的因素。训练数据集越来越大,就越复杂。例如,在医疗保健领域,经常会遇到需要使用数百万高分辨率的图像进行训练的模型。因此,训练过程通常需要很长的时间才能完成,并且由于内存和CPU的消耗而导致付出非常高的代价。
对于深度学习模型并行性的一种有效思考方法是将其划分为数据并行和模型并行的方式。数据并行方式使用大型的计算机集群来分割所输入的数据。模型并行性则是试图将模型转移到加速器上,GPU或TPU,它们具有加速模型训练的特殊硬件。在较高的层次上,几乎所有的训练数据集都可以按照一定的逻辑进行并行化工作,但在模型上却不一定是这样的。例如,一些深度学习模型是由可独立进行训练的并行分支组成的。在这种情况下,典型的策略是将计算任务划分到多个分区,并将不同的分区分配给不同的分支。然而,这种策略在按顺序进行层堆叠的深度学习模型中存在着很大不足,这就给高效的并行计算带来了挑战。
GPipe通过一种叫做流水线的技术将数据并行和模型并行相结合起来。从概念上讲,GPipe是一个分布式机器学习库,它使用同步随机梯度下降和流水线并行的方式进行训练,适用于任何由多个有序的层组成的深度神经网络(Deep Neural Networks, DNN)。Gpipe通过跨不同的加速器来分割模型,并自动将一小批训练示例划分成更小的批量。该模型允许GPipe的加速器进行并行操作,最大限度地提高了训练过程中的可扩展性。
下图说明了具有多个有序层的神经网络的GPipe模型被划分到了四个加速器上。Fk是kth分区的复合正向计算函数。Bk是其相对应的反向传播函数。Bk依赖于来自上层的Bk+1和Fk的中间激活函数。在上面的模型中,我们可以看到网络的顺序性是如何导致资源利用不足的。图中的下半部分显示了GPipe方法,在该方法中,输入的小批量示例被划分为更小的微批量,这些微批量可以由加速器同时处理。
PipeDream(微软)
几个月以前,微软研究院宣布了Fiddle项目的创立,其包括了一系列的旨在简化分布式深度学习的研究项目。PipeDreams是Fiddle发布的第一个侧重于深度学习模型并行训练的项目之一。
PipeDream采用一种有别于其它方法的方式,利用称为“流水线并行”的技术来扩展深度学习模型的训练。这种方式试图解决当前数据和模型并行技术所面临的一些挑战,例如在Gpipe中使用的一些技术。通常来说,当在云基础设施上进行训练的时候,数据并行方法在规模上承受着很高的通信成本,另外也可以随着时间的推移来提高GPU的计算速度。类似地,模型并行技术经常会通过无效地硬件资源利用,同时给程序员带来不必要负担的情况下,来确定如何在给定硬件部署环境的情况下进行特定模型的拆分。
PipeDream试图通过一种叫做流水线并行的技术来克服数据模型并行方法上的一些挑战。在概念上,流水线并行计算技术涉及将DNN模型的层划分为多个阶段,每个阶段是由模型中的一组连续的层组成的。每个阶段都被映射到一个单独的GPU上,该GPU对当前阶段中的所有层将执行前向传递和后向传递。
给定一个特定的深度神经网络,PipeDream会根据在单个GPU上执行的一个简短的评测运行,自动确定如何划分DNN模型的操作者,并在不同阶段之间均衡计算的负载,同时也会最小化目标平台的通信任务。即使存在模型的多样化(计算和通信)和平台的多样化(互连拓扑和分层带宽),PipeDream也能有效地进行负载均衡。PipeDream的并行训练方法对比数据模型并行方法提供了一些额外的优势。首先,PipeDream在工作节点之间需要更少的通信,因为在管道执行中的每个工作节点只需传递梯度和输出激活的子集,给其它的单个工作节点。此外,PipeDream以一种更容易并行的方式来分离计算和通信任务。
并行训练方法是构建更庞大、更精确的深度学习模型的关键挑战之一。作为深度学习社区中的一个非常活跃的研究领域,并行训练方法需要将有效的并发编程技术与深度学习模型的本质相结合起来。虽然仍处于初期阶段,但谷歌的GPipe和微软的PipeDream作为两种最具创造性的技术,为深度学习的开发人员提供了并行训练方法。