联系我们 CONNECT US
  • 电话: 024-83687760
  • 传真: 024-23893138
  • 通讯地址: 辽宁省沈阳市和平区文化路3号巷11号东北大学135信箱
您现在所在的位置:首页  学生园地  青春风采
战“疫”&科研——学术动态新分享(第六期)


分布式技术”——深度学习的加速器

近年来,作为人工智能发展迅速的领域之一的深度学习在NLP、图像识别、语音识别、机器翻译,到业界关注的诸如欺诈检测和推荐系统这样的应用等各个方面都取得了惊人的成果。但是,深度学习的应用范围却日益受到数据量和模型规模的限制,尽管近些年来GPU硬件、网络架构和训练方法上均取得了重大的进步,但是在单一机器上,网络训练所需要的时间仍然长得不切实际。幸运的是,我们不仅限于单个机器:大量工作和研究已经使有效的神经网络分布式训练成为了可能。

1.概述

随着数据和深度学习模型的规模都变得日益庞大,当训练数据词表增大到成百上千万时,如果不做任何剪枝处理,深度学习模型可能会拥有上百亿,甚至是几千亿个参数。为了提高深度学习模型的训练效率,减少训练时间,分布式技术同时利用多个工作节点,分布式地、高效地训练出性能优良的神经网络模型,能够显著提高深度学习的训练效率,进一步增大其应用范围。

2.了解分布式深度学习

在深入分析深度学习的细节及其解决的问题之前,这里应该定义一些重要的术语:数据并行和模型并行。

1)数据并行

数据并行就是在很多设备上放置相同的模型,并且各个设备采用不同的训练样本对模型训练。训练深度学习模型常采用的是batch SGD方法,采用数据并行,可以每个设备都训练不同的batch,然后收集这些梯度用于模型参数更新。Facebook训练Resnet50就是采用数据并行策略,使用256GPUs,每个GPU读取32个图片进行训练,如下图所示,这样相当于采用非常大的batch256×32=8192)来训练模型。

2)模型并行

与数据并行相比,模型并行是一个更复杂和模糊的概念。比如Google的神经机器翻译系统,其可能采用深度LSTM模型,如下图所示,此时模型的不同部分需要分散到许多设备上进行并行训练。深度学习模型一般包含很多层,如果要采用模型并行策略,一般需要将不同的层运行在不同的设备上,但是实际上层与层之间的运行是存在约束的:前向运算时,后面的层需要等待前面层的输出作为输入,而在反向传播时,前面的层又要受限于后面层的计算结果。所以除非模型本身很大,一般不会采用模型并行,因为模型层与层之间存在串行逻辑。

尽管在实践中模型并行可以取得良好的效果,但数据并行毫无争议是分布式系统中最合适的方法,而且也一直是更多研究的焦点,其实现性、容错性和好的集群利用率让数据并行比模型并行更加简单。所以除非模型本身很大,一般不会采用模型并行,因为模型层与层之间存在串行逻辑。但是如果模型本身存在一些可以并行的单元,那么也是可以利用模型并行来提升训练速度,比如GoogLeNetInception模块。

3.数据并行相关方法

数据并行方法在每一个worker machine上都有一套完整的模型,但分别对训练数据集的不同子集进行处理。数据并行训练方法均需要一些整合结果和在各工作器(worker)间同步模型参数的方法。

(1) 参数平均(Parameter Averaging

参数平均化是概念上最为简单的数据并行方法, 就是在每次迭代后简单均值化参数。尽管这种方法有效,但我们会发现这样做的成本会特别高。网络通信和同步成本会超过我们从额外的机器中所获得好处。因而,参数平均化的实现通常有多于1个的平均化周期(veraging period,就每个workerminibatch数量而言)逐渐执行。然而,如果我们平均化的频率过低,每个worker中的本地参数之间的区别会过大,导致平均化后的模型较差。

(2) 随机梯度下降法(SGD

随机梯度下降法是目前最流行的深度学习的优化算法之一,更新公式为:


其中,wt为当前模型,(xt, yt)为随机抽取的数据,g(wt; xt, yt)(xt, yt)所对应的经验损失函数关于当前模型wt的梯度,η为步长/学习率。

假设系统中有多个工作节点并行地利用随机梯度法优化神经网络模型,同步和异步是两种常用的通信同步机制。

1)同步随机梯度下降法(Synchronous SGD

同步随机梯度下降法在优化的每轮迭代中,会等待所有的计算节点完成梯度计算,然后将每个工作节点上计算的随机梯度进行汇总、平均并按照上述公式更新模型。之后,工作节点接收更新之后的模型,并进入下一轮迭代。由于Sync SGD要等待所有的计算节点完成梯度计算,好比木桶效应,Sync SGD的计算速度会被运算效率最低的工作节点所拖累。

2)异步随机梯度下降法(Asynchronous SGD

异步随机梯度下降法在每轮迭代中,每个工作节点在计算出随机梯度后直接更新到模型上,不再等待所有的计算节点完成梯度计算。因此,异步随机梯度下降法的迭代速度较快,也被广泛应用到深度神经网络的训练中。然而,Async SGD虽然快,但是用以更新模型的梯度是有延迟的,会对算法的精度带来影响。

实际上训练分布式神经网络的方法有很多,其中每个类型也有不少变体。那应该在实践中应该使用哪一个?不幸的是,没有一个很明确的答案。但我们可以给出如下的评判标准,来确定不同方法中最好的那个:

 •最快的训练速度(每秒最多或最少可以训练多少个例子)。

 •在无限样例下可达到的最大精度。

 •在有限时间下可达到的最大精度。

 •在有限样例下可达到的最大精度。

 •最大可达到的准确度对历元的给定数量的。

另外,这些问题的答案将可能取决于许多因素,如神经网络的大小和类型、集群的硬件性能,使用特征(如压缩),以及训练方式的具体实施方法和配置。

4.分布式训练系统架构

分布式训练系统架构层包括Parameter Server ArchitectureRing-allreduce Architecture

1Parameter server架构

Parameter server架构(PS架构)中,集群中的节点被分为两类:parameter serverworker。其中parameter server存放模型的参数,而worker负责计算参数的梯度。在每个迭代过程,workerparameter sever中获得参数,然后将计算的梯度返回给parameter serverparameter server聚合从worker传回的梯度,然后更新参数,并将新的参数广播给worker

2Ring-allreduce架构

Ring-allreduce架构中,各个设备都是worker,并且形成一个环,如下图所示,没有中心节点来聚合所有worker计算的梯度。在一个迭代过程,每个worker完成自己的mini-batch训练,计算出梯度,并将梯度传递给环中的下一个worker,同时它也接收从上一个worker的梯度。对于一个包含Nworker的环,各个worker需要收到其它N-1worker的梯度后就可以更新模型参数。其实这个过程需要两个部分:scatter-reduceallgather,百度的教程对这个过程给出了详细的图文解释。百度开发了自己的allreduce框架,并将其用在了深度学习的分布式训练中。

近年来,随着AI尤其是深度学习研究的强势崛起,分布式深度学习系统的研究作为一个专门的研究课题而出现,吸引了大量关注,可以预见,依托深度学习研究的热潮,分布式深度学习系统的研究将会持续火热。


供稿:贾亮

编辑:庄新豪