【分布式】分布式深度学习DDLs系统Review——分布式学习通俗理解Distributed Deep Learning Systems(最全面的论述)

分布式深度学习系统 (DDLS) 通过利用集群的分布式资源来训练深度神经网络模型。 DDLS 的开发人员需要做出许多决定,以在他们选择的环境中有效地处理他们的特定工作负载。 基于 GPU 的深度学习的出现、不断增加的数据集和深度神经网络模型,再加上集群环境中存在的带宽限制,要求 DDLS 的开发人员进行创新,以便快速训练高质量模型。 本blog概述了当代 DDLS 使用的不同技术,具体内涵请回读论文阐述。

一、什么是分布式深度学习/DDL?

深度学习在各个领域实现突破的一部分原因是我们使用了更多的数据(大数据)来训练更复杂的模型(深度神经网络),并且可以利用一些高性能并行计算设备如GPU和FPGA来加速模型训练。但是有时候,模型之大或者训练数据量之多可能超出我们的想象,这个时候就需要分布式训练系统,利用分布式系统我们可以训练更加复杂的模型(单机无法装载),还可以加速我们的训练过程,这对于研究者实现模型的超参数优化是非常有意义的。

此外,计算资源和功耗受限的边缘端设备也无法承载深度学习模型训练的部署,因此DL模型部署到分布式系统也具有重要意义。

2017年6月,Facebook发布了他们的论文[1]Accurate, Large Minibatch SGD:Training ImageNet in 1 Hour,文中指出他们采用分布在32个服务器上的256块GPUs将Resnet-50模型在ImageNet数据集上的训练时间从两周缩短为1个小时。在软件层面,他们使用了很大的minibatch(8192)来训练模型,并且使学习速率正比于minibatch的大小。这意味着,采用分布式系统可以实现模型在成百个GPUs上的训练,从而大大减少训练时间,你也将有更多的机会去尝试各种各样的超参数组合。

作为使用人数最多的深度学习框架,TensorFlow从version 0.8开始支持模型的分布式训练,现在的TensorFlow支持模型的多机多卡(GPUs和 CPUs)训练。这里介绍其他此类系统算法,并以分布式TensorFlow为例,简单阐述分布式深度学习系统原理。

二、相关工作和DDL工作要点

1. DDLS方向综述

参照其他综述分类法分为 4 个部分:1) 模型与数据并行性; 2) 集中 vs. 分散优化; 3)同步vs.异步调度; 4) 用于交换参数的通信模式。

Schmidhuber 按时间顺序概述了深度学习的最新发展,包括 DDLS 的某些进展。
[2] J. Schmidhuber, “Deep Learning in Neural Networks: An
Overview,” Neural Networks, vol. 61, pp. 85–117, 2015.

张等人展示了特定的实现决策如何影响四个分布式系统中的训练和网络带宽使用。
[3]K. Zhang, S. Alqahtani, and M. Demirbas, “A Comparison of
Distributed Machine Learning Platforms,” Proc. 26th Intl. Conf. on
Computer Communications and Networks, 2017.

本-努等人 最近发表了一篇关于深度学习的并行和分布式算法的教程/调查,首先是关于监督学习、反向传播和模型架构等一般概念的教程,然后再转向并行和分布式训练相关主题(超参数和架构搜索) 等等。
[4]T. Ben-Nun and T. Hoefler, “Demystifying Parallel and Distributed
Deep Learning: An In-Depth Concurrency Analysis,” ACM Comput. Surv., vol. 52, no. 4, 2019.

2. 模型并行vs数据并行

(一)模型并行 通俗理解:所谓模型并行指的是将模型部署到很多设备上(设备可能分布在不同机器上,下同)运行,比如多个机器的GPUs。当神经网络模型很大时,由于显存限制,它是难以在跑在单个GPU上,这个时候就需要模型并行。比如Google的神经机器翻译系统,其可能采用深度LSTM模型,如下图所示,此时模型的不同部分需要分散到许多设备上进行并行训练。深度学习模型一般包含很多层,如果要采用模型并行策略,一般需要将不同的层运行在不同的设备上,但是实际上层与层之间的运行是存在约束的:前向运算时,后面的层需要等待前面层的输出作为输入,而在反向传播时,前面的层又要受限于后面层的计算结果。所以除非模型本身很大,一般不会采用模型并行,因为模型层与层之间存在串行逻辑。但是如果模型本身存在一些可以并行的单元,那么也是可以利用模型并行来提升训练速度,比如[5]GoogLeNet的Inception模块。
【分布式】分布式深度学习DDLs系统Review——分布式学习通俗理解Distributed Deep Learning Systems(最全面的论述)
(二)模型并行详细工作介绍

在模型并行中,模型被分成多个分区,然后在不同的机器中进行处理。 为了执行推理或训练模型,必须在它们之间传输信号,以便可以评估每个分区。

使用 SGD 训练深度学习模型需要暂时记住在推理过程中观察到的中间层输出。 通常,它们的大小大大超过模型FireCaffe的大小。 因此,如果任何单个机器的内存不足以存储所有模型参数,则对模型进行分区并在机器之间分配工作负载也有帮助:
[6] E. P. Xing, Q. Ho, W. Dai, J. K. Kim, J. Wei, S. Lee et al., “Petuum - A New Platform for Distributed Machine Learning on Big Data,” IEEE Trans. on Big Data, vol. 1, no. 2, pp. 49–67, 2015.

模型分区可以通过在神经网络层之间应用拆分(=垂直分区)或通过拆分层(=水平分区)来进行,如下图所示。
【分布式】分布式深度学习DDLs系统Review——分布式学习通俗理解Distributed Deep Learning Systems(最全面的论述)

(1)垂直分区可以应用于任何深度学习模型,因为层本身不受影响。 周围的逻辑(即 DDLS)负责将第 n 层的中间张量输出传输到执行第 n+1 层的机器。在反向传播期间,误差导数 w.r.t. 损失函数以相反的顺序通过这些层(即从机器到机器)。 尽管深度学习模型可以在任意两层之间拆分,但位于不同物理机器上的分区之间的转换可能代价高昂。
理想的分区取决于许多因素(包括集群硬件的能力、中间张量的形状、推理和反向传播期间的特定数据流等)。 现代模型并行能力的 DDLS,如 TensorFlow 采用启发式和自适应算法来确定有效的垂直分区方案:
[7] M. Abadi, P. Barham, J. Chen et al., “TensorFlow: A System
for Large-Scale Machine Learning,” Proc. 12th USENIX Symp. on
Operating Systems Design and Implementation, pp. 265–283, 2016

(2)在水平分区中,层本身被分区。 因此,使用多个设备并行处理每个训练样本的不同部分。 因此,水平分区通常会导致神经元连接的子集跨越分区边界。 效率取决于找到最小化必须转换机器边界的信号数量的分裂。 但是,重新组织和调度各个层的输出,每个目标层分区都可以使用它们,反之亦然,这一点很复杂,并且需要 DDLS 对分区层的内部工作有详细的了解,这使得在实践中实现这种跨机器边界的模型分区变得乏味。

通常,如果没有其他方法可以将一个层放入任何一台机器的内存中 ,或者如果模型包含连接性有限的大的不同部分(例如非卷积局部感受野),水平分区被认为是最后的手段:
[8] Q. V. Le, “Building High-Level Features Using Large Scale Unsupervised Learning,” Proc. IEEE Intl. Conf. on Acoustics, Speech and
Signal Processing, pp. 8595–8598, 2013.

无论使用哪种分区策略,通过模型的最慢路径决定了执行推理和反向传播所需的时间。 实际的模型训练任务是否可以从使用模型分区将模型的计算步骤映射到集群硬件中受益是高度情境化的。 对模型进行分区,以使开销最小且没有瓶颈,在实践中需要复杂的算法 。
[9]T. Chen, M. Li, Y. Li et al., “MXNet: A Flexible and Efficient Machine Learning Library for Heterogeneous Distributed Systems,”
Proc. 29th Conf. on Neural Information Processing Systems, 2015.

集群配置的特定属性以及小批量大小、模型或计算图的任何调整(例如,因为它依赖于数据)都会改变最佳布局。 因此,近年来见证了从模型向数据并行的转变

(3)Pipeline策略
通过分区模型流水线化信号有助于更好地利用集群硬件并提高整体数据吞吐量。 但是,在训练期间,每台机器只能在完成小批量的所有下游计算步骤后才能更新其模型参数。 在训练期间实现流水线的两种可能方法是:1) 进一步拆分输入小批量,流水线化片段并累积整个小批量的每参数梯度,这些梯度在最后应用。 这并不能解决根本问题,但是,假设产生的开销很低,会导致更高的平均 GPU 利用率 [20]。 2) 如果有足够的资源来缓存多个小批量的中间状态,那么流水线化整个小批量也是可能的。 然而,这种方法导致从陈旧参数计算梯度,这个问题在某些数据并行系统中也经常出现。
[10] Y. Huang, Y. Cheng, A. Bapna, O. Firat, M. X. Chen et al., “GPipe:
Efficient Training of Giant Neural Networks using Pipeline Parallelism,” arXiv CoRR, vol. abs/1811.06965, 2018

(三)数据并行 通俗理解: 深度学习模型最常采用的分布式训练策略是数据并行,因为训练费时的一个重要原因是训练数据量很大。数据并行就是在很多设备上放置相同的模型,并且各个设备采用不同的训练样本对模型训练。训练深度学习模型常采用的是batch SGD方法,采用数据并行,可以每个设备都训练不同的batch,然后收集这些梯度用于模型参数更新。前面所说的Facebook训练Resnet50就是采用数据并行策略,使用256个GPUs,每个GPU读取32个图片进行训练,如下图所示,这样相当于采用非常大的batch( 32*256=8192)来训练模型。
【分布式】分布式深度学习DDLs系统Review——分布式学习通俗理解Distributed Deep Learning Systems(最全面的论述)

(四)数据并行详细工作介绍
支持数据并行性的基本思想是通过将模型复制到多台机器上来提高整体样本吞吐率,在这些机器上可以并行执行反向传播,以更快地收集有关损失函数的更多信息。 从概念上讲,数据并行是按如下方式实现的。 首先,每个集群节点下载当前模型。 然后,每个节点使用其并行的数据分配执行反向传播。 最后,将各自的结果汇总和整合,形成一个新的模型
[11] J. Dean, G. S. Corrado, R. Monga, K. Chen, M. Devin et al., “Large
Scale Distributed Deep Networks,” Adv. in Neural Information
Processing Systems, pp. 1223–1231, 2012.

这是允许的,因为应用于深度神经网络中特定训练样本的大多数变换不涉及来自其他样本的数据。因此,使用小批量 (x) 的子集 (x 0 , · · · , xn) 计算的每个参数梯度的总和与整个输入批次的每个参数梯度相匹配(即 ∂L(x;w) ∂wu ∂ L(x 0 ;w) ∂w + … + ∂L(xn;w) ∂w )。 因此,假设 mini-batch 大小为具有两台相同机器的集群中的 64 个样本,那么每台机器可以并行处理 32 个样本,而无需跨机器通信。 通常,将训练样本数量减半也会将计算数量和中间张量的大小减半,这会加快反向传播的速度,并且在处理大型模型时也很有帮助。

由于每个参数的梯度或模型参数必须在机器之间传输,因此模型大小和网络带宽的关系是数据并行性能否加速训练的关键。 与其计算复杂度相比,模型越小,实现数据并行性就变得越容易:
[12]F. N. Iandola, K. Ashraf et al., “FireCaffe: Near-Linear Acceleration
of Deep Neural Network Training on Compute Clusters,” Proc.
IEEE Conf. on Computer Vision and Pattern Recognition, 2015.

对于大型模型,与带宽相关的问题会迅速限制可扩展性 。
[13] M. Langer, A. Hall et al., “MPCA SGD - A Method for Distributed
Training of Deep Learning Models on Spark,” IEEE Trans. on
Parallel and Distributed Systems, vol. 29, no. 11, pp. 2540–2556, 2018.

但是,正如我们将在此分类法的其他部分中展示的那样,数据并行 DDLS 可以应用各种技巧来减少带宽限制的影响。

从概念上讲,进一步扩展数据并行系统只需要将模型代码复制到另一台机器并将其分配给不同的小批量数据。 这与模型并行方法形成鲜明对比,在模型并行方法中,添加或删除机器通常需要重新评估整个分区模式,这显然更具挑战性。 如果集群节点配备多个 GPU,则模型并行性仍然与节点内扩展相关。
[14] T. Chilimbi, Y. Suzue et al., “Project Adam: Building an Efficient
and Scalable Deep Learning Training System,” Proc. 11th USENIX
Symp. on OS Design and Implementation, pp. 571–582, 2014

关于分布式域,最近开发的 DDLS 主要(偶尔单独;参见[24]、[25]、[26]、[27])关注数据并行性。
[24] A. Feng, J. Shi, and M. Jain, “CaffeOnSpark Open Sourced for
Distributed Deep Learning on Big Data Clusters,” 2016. [Online].
Available: http://yahoohadoop.tumblr.com/post/139916563586/
caffeonspark-open-sourced-for-distributed-deep
[25] S. Zhang, “Distributed Stochastic Optimization for Deep Learning,” Ph.D. dissertation, New York University, 2016.
[26] X. Lian, C. Zhang, H. Zhang, C.-J. Hsieh et al., “Can Decentralized
Algorithms Outperform Centralized Algorithms? A Case Study
for Decentralized Parallel Stochastic Gradient Descent,” Adv. in
Neural Information Processing Systems, vol. 30, pp. 5330–5340, 2017.

[27] J. Dai, Y. Wang, X. Qiu, D. Ding, Y. Zhang et al., “BigDL: A
Distributed Deep Learning Framework for Big Data,” Proc. ACM
Symposium on Cloud Computing, pp. 50–60, 2019.

因此,本文主要部分主要关注数据并行 DDLS 中使用的技术

(五)蒸饺
此外,作为正交概念,模型和数据并行可以同时应用以实现 混合并行[28]M. Li, D. G. Andersen, A. J. Smola et al., “Communication Efficient Distributed Machine Learning with the Parameter Server,” Adv. in Neural Information Processing Systems, vol. 27, pp. 19–27, 2014.

3. 集中优化 vs 分散优化

在下图中,我们详细介绍了训练深度学习模型时的数据流。 训练过程可以分为两个不同的周期。 蓝色过程 (蓝色箭头) 通过对从训练数据中提取的小批量应用反向传播,根据当前模型参数计算每参数梯度。 优化周期 (红色剪头) 使用这些梯度来确定模型参数更新。 虽然这可能表现为双向依赖,但重要的是要注意,给定一组参数,模型循环可以进行许多预测以优化梯度输出,而优化器需要更新梯度才能进行。
【分布式】分布式深度学习DDLs系统Review——分布式学习通俗理解Distributed Deep Learning Systems(最全面的论述)
将此执行模型映射到独立机器集群有两种主要方式: 1) 集中优化:优化循环在*机器中执行,而梯度计算代码复制到其余集群节点上。 2) 去中心化优化:两个周期都在每个集群节点中复制,并实现某种形式的同步,允许不同的优化器协同工作。

(一)集中优化

(1)介绍
在实现集中优化的 DDLS 中,只有一个优化器实例(通常称为参数服务器)负责更新特定的模型参数。
参数服务器依赖于执行反向传播的集群节点(工作节点)计算的梯度。 下图 说明了在这种系统中训练期间的数据流。
【分布式】分布式深度学习DDLs系统Review——分布式学习通俗理解Distributed Deep Learning Systems(最全面的论述)

请注意,术语参数服务器和工作器指的是软件进程,而不是实际的机器。 为简单起见,我们现在假设每个进程都在不同的机器上运行

集中优化允许计算每个参数梯度的昂贵任务分布在集群机器上,并通过在参数服务器上汇集所有通信来优雅地处理更新模型。 因此,可以快速计算大量训练样本的每个参数梯度。 根据跨工作器的计算是同步还是异步调度,这会对优化产生不同的影响。

由于不同的参数服务器是唯一对特定模型参数具有写入权限的参与者,因此其状态始终反映当前的训练进度。 这大大简化了数据处理,但会导致与工人的生产者-消费者关系。 每个工人必须经常重新下载模型以确保其产生的梯度是相关的。 对于大型集群,这种集中在同一网络端点的频繁通信需求很快就会成为瓶颈 [13] [26]。

因此,大多数基于集中式优化的 DDLS 实现了分布式参数服务器角色的通信模式。

(2)通俗理解:Parameter server架构
在Parameter server架构(PS架构)中,集群中的节点被分为两类:parameter server和worker。其中parameter server存放模型的参数,而worker负责计算参数的梯度。在每个迭代过程,worker从parameter sever中获得参数,然后将计算的梯度返回给parameter server,parameter server聚合从worker传回的梯度,然后更新参数,并将新的参数广播给worker。采用同步SGD方式的PS架构如下图所示:
【分布式】分布式深度学习DDLs系统Review——分布式学习通俗理解Distributed Deep Learning Systems(最全面的论述)
在TensorFlow之前,Google采用的是DistBelief框架,其支持PS架构。TensorFlow从DistBelief借鉴了它的很多分布式训练模式,所以TensorFlow也支持PS架构。Mxnet的主要创建者李沐在前人基础上开发了更加通用的轻量级ps-lite,如果想深入理解PS架构,可以看一下沐神的讲解。PS架构是深度学习最常采用的分布式训练架构。

(二)分散优化
(1)介绍
依赖去中心化优化的 DDLS 将他们的工作人员视为一个群体,其中每个工作人员独立探测损失函数以找到具有良好泛化特性的最小值的梯度下降轨迹 [25]。

因此,与集中式 DDLS 中的优化周期映射到集群不同,分散式系统在每个工作人员中单独执行模型训练。 为了获得更好的联合模型,需要某种形式的仲裁来使不同的观点保持一致。 如果有工人未能满足复制梯度计算和优化周期的内存要求,则不能使用分散优化。
[29]M. Langer, “Distributed Deep Learning in BandwidthConstrained Environments,” Ph.D. dissertation, La Trobe
University, 2018.

下图描绘了分散系统中的数据流。
【分布式】分布式深度学习DDLs系统Review——分布式学习通俗理解Distributed Deep Learning Systems(最全面的论述)

每个工人代表一个独立的学习者,重复观察损失函数并调整其局部模型参数以进一步减少损失。 为了实现协同训练,工作人员必须相互交换模型参数。 在这个例子中,我们假设存在一个专用的主节点,它处理工作人员建议的各个参数调整,并提出一个新的全局模型状态,然后与他们共享 (绿色箭头)。 因为模型训练和参数交换是解耦的,所以主节点的状态与不同的工作模型只是松散相关的。
此属性是去中心化系统的特征。

由于工作人员可以在没有任何通信的情况下进行培训,因此分散系统的网络 I/O 带宽需求通常低于集中式系统的网络 I/O 带宽需求 。

(2)通俗理解:Ring-allreduce架构
在Ring-allreduce架构中,各个设备都是worker,并且形成一个环,如下图所示,没有中心节点来聚合所有worker计算的梯度。在一个迭代过程,每个worker完成自己的mini-batch训练,计算出梯度,并将梯度传递给环中的下一个worker,同时它也接收从上一个worker的梯度。对于一个包含 N 个worker的环,各个worker需要收到其它个 N-1 worker的梯度后就可以更新模型参数。其实这个过程需要两个部分:scatter-reduce和allgather,百度的教程对这个过程给出了详细的图文解释。百度开发了自己的allreduce框架,并将其用在了深度学习的分布式训练中。
【分布式】分布式深度学习DDLs系统Review——分布式学习通俗理解Distributed Deep Learning Systems(最全面的论述)
相比PS架构,Ring-allreduce架构是带宽优化的,因为集群中每个节点的带宽都被充分利用。此外,在深度学习训练过程中,计算梯度采用BP算法,其特点是后面层的梯度先被计算,而前面层的梯度慢于前面层,Ring-allreduce架构可以充分利用这个特点,在前面层梯度计算的同时进行后面层梯度的传递,从而进一步减少训练时间。在百度的实验中,他们发现训练速度基本上线性正比于GPUs数目(worker数)。

4. 同步 vs 异步

数据并行可以是同步的(synchronous),也可以是异步的(asynchronous)。所谓同步指的是所有的设备都是采用相同的模型参数来训练,等待所有设备的mini-batch训练完成后,收集它们的梯度然后取均值,然后执行模型的一次参数更新。这相当于通过聚合很多设备上的mini-batch形成一个很大的batch来训练模型,Facebook就是这样做的,但是他们发现当batch大小增加时,同时线性增加学习速率会取得不错的效果。同步训练看起来很不错,但是实际上需要各个设备的计算能力要均衡,而且要求集群的通信也要均衡,类似于木桶效应,一个拖油瓶会严重拖慢训练进度,所以同步训练方式相对来说训练速度会慢一些。异步训练中,各个设备完成一个mini-batch训练之后,不需要等待其它节点,直接去更新模型的参数,这样总体会训练速度会快很多。但是异步训练的一个很严重的问题是梯度失效问题(stale gradients),刚开始所有设备采用相同的参数来训练,但是异步情况下,某个设备完成一步训练后,可能发现模型参数其实已经被其它设备更新过了,此时这个梯度就过期了,因为现在的模型参数和训练前采用的参数是不一样的。由于梯度失效问题,异步训练虽然速度快,但是可能陷入次优解(sub-optimal training performance)。异步训练和同步训练在TensorFlow中不同点如下图所示:

【分布式】分布式深度学习DDLs系统Review——分布式学习通俗理解Distributed Deep Learning Systems(最全面的论述)
为了解决异步训练出现的梯度失效问题,微软提出了一种Asynchronous Stochastic Gradient Descent方法,主要是通过梯度补偿来提升训练效果。应该还有其他类似的研究。

5. 通信模式

(一)集中式系统中
无论采用何种训练方法,将参数服务器角色集中在一台机器上都极大地简化了整个系统架构,因为所有模型训练都在一个软件程序中进行协调。 此外,此类系统易于配置、控制和调试。

但是,这可能会使参数服务器成为瓶颈。例如,要在具有 n 个 worker 的集群中执行完整参数交换,专用的单参数服务器或主节点需要随后发送和接收 nkwk 参数。 在批量同步系统中,联合模型的更新取决于所有工人的贡献。 参数上传和下载顺序发生,这意味着理论上至少有 2nTw + (n − 1)Rw +Uw 的通信延迟,其中 Tw、Rw 和 Uw 分别表示传输、减少和更新 kwk 参数所需的时间(即 模型)。 然而,实际的 DDLS 很少以这种天真的方式实现。 请记住,同步障碍强加了集群范围的阶段,在此期间只发生从参数服务器或主节点到工作节点的单向参数传输,反之亦然,这使得能够使用有效的集体通信原语,例如二叉树 [15] ,或 scatterreduce/broadcast 算法 [44],对于相同集群设置中的下界通信延迟分别仅为 2dlog2 (n + 1)eTw + dlog2 (n)eRw + Uw 和 (2 + 2 n−1 n )Tw + n−1 n Rw + Uw。 请注意这是如何明显的

随着集群变大,模型参数在没有协调的情况下在机器之间频繁交换的通信模式可能很快变得难以管理。 特别是在大型异步系统中,需要仲裁的情况是不可避免的。 对异步处理施加界限是在这种情况下维持秩序的有效措施(参见第 3.3.4 节)。
但随着集群变得越来越大,严格的限制最终会阻碍越来越多的工人。 扩展到数百个或更多节点的集中式 DDLS 通常通过引入充当双向回写缓存 [14]、[19] 的代理服务器来构建通信结构,从而避免 I/O 瓶颈(例如,作为值或延迟边界实现;参见 第 3.3.4 节)针对不同的工人子集。 但是,请注意,拥有临时缓存和/或代理服务器可能会引入额外的陈旧性(参见第 3.3.3 节)。

this blog’s paper reference:
Langer, Matthias, et al. “Distributed training of deep learning models: A taxonomic perspective.” IEEE Transactions on Parallel and Distributed Systems 31.12 (2020): 2802-2818.

上一篇:12月工作汇报


下一篇:Hadoop思想与原理