为了减少训练时间, 研 究 人 员 通常使用高性能硬件如图形处理器 (GPU)和张量处理器(TPU)等加速 深度神经网络模型的训练。同时,在 多个节点上并行训练深度神经网络也是行之有效的加速方法。每个节点仅仅执行整体计算任务的一部分,所以这种分布式训练可以大幅缩短深度神 经网络的训练时间。
这里的任务指的是数据或者模型。
数据与模型并行
分布式深度学习系统面临的第一 个问题是并行化训练任务的哪一部分。 常见的两种并行模式为数据并行和模型并行。
数据并行
首先整个数据集被随机且均匀地分配到各个节点中,每个节点都在本地维护一个完整的模型副本。每个节点仅读取和处理唯一的数据子集,并在训练期间更新本地模型。然后,将这些本地模型参数与其他节点同步以计算全局参数。因此,这些全局参数利用网络分配到每个节点上,以便开始下一次迭代。
模型并行
模型并行是另一种方法。该方法将神经网络模型分割到不同的计算节点上,每个计算节点仅负责计算模型的某一部分,只有输入层所在的节点才负责读取数据。当模型太大而无法放到一台机器中时,则需要使用模型并行。
网络架构
分布式深度学习系统所面临的第二个问题是以何种结构组织计算节点。系统的架构会影响训练过程中数据的传输方式和模型更新方式,进而影响训练时间。常见的架构包括中心化以及去中心化架构。
中心化架构
参数服务器架构是分布式深度学习中最常见的中心化架构。参数服务器架构通常包括若干服务器和若干工作节点。其中服务器上存放着全局共享的模型参数。如果有多个服务器节点,那么模型的权重参数会被拆分到每台机器上。每个工作节点都存储一个模型副本(使用数据并行)或存储模型的某一部分(使用模型并行)。 工作节点通过推送 / 拉取操作与服务器进行通信,而任何工作节点之间都不会产生通信行为。每次迭代中,每个工作节点首先读取数据,然后基这些数据计算本地模型的梯度。随后,节点将其本地梯度推送到参数服务器。 服务器接收所有工作节点发送的梯度后,首先聚合这些梯度,然后更新全局模型,最后工作节点再从服务器拉取最新的模型权重,并使用它进行下一次的迭代。
去中心化架构
点对点架构是一种去中心化的架构,其中每个节点在模型训练中都扮演相同的角色。与参数服务器类似,点对点中的每个节点都拥有完整的模型副本,并首先基于小批量数据计算本地梯度。对等体系结构使用归约和广播等集合通信操作,而不是参数服务器体系结构中的推送 / 拉取操作。经过梯度计算后,每个对等方首先从其他对等方接收梯度,然后对这些梯度求平均,这就是归约步。然后,对等方将其本地梯度广播给所有其他对等方。节点从其他对等节点收到所有梯度后,立即更新其本地模型,然后执行下一个迭代。
通信优化
为了有效地在多节点上训练深度神经网络,降低训练过程中的通信开销,业界已经提出了多种通信优化策略。由于分布式深度学习通信优化涉及深度神经网络、异构并行计算、分布式系统、计算机网络等众多技术,从芯片级到系统级有许多涉及网络通信优化相关的技术。
从通信流量调度层的角度来看,可以通过降低通信发生的频次,来降低通信数据量(梯度压缩)以及计算通信重叠等技术优化分布式训练的通信过程。在网络通信执行层面,不同的参数通信架构、不同的消息传递库以及不同的网络协议都会对通信产生影响。
降低通信频率
训练深度神经网络时,整个训练过程通常需要进行多次 epoch 和迭代。降低通信开销的一种直接方法是减少通信轮次,而通信轮次与批量大小和通信周期有关。 较大的批量 和 较长的通信周期 都可以减少数据交换次数。
使用大批量进行训练
批量大小控制每次迭代时读取的数据量。在基于数据并行的分布式训练中,批量通常指的是全局批量,即所有节点的本地批量的总和。对于并行化训练,节点通常在每次迭代结束时交换数据,因此,当训练数据集的大小固定时,增加批量会减少迭代次数,从而减少通信轮次。梯度和参数的形状及大小仅取决于神经网络模型本身,因此单次迭代传递的 消息大小总是保持不变 ,更改批量不会改变每次传输的消息总量。大批量带来的好处是更少的通信轮次。由于具有大批量训练的优势,分布式深度学习系统网络通信优化技术最近的工作将批量增加到 8 k、32 k 甚至增加到 64 k 样本(1 k 表示 1 024 个样本)。然而,当固定 epoch 时,与小批量相比,实际上直接使用具有大批量的随机梯度下降(SGD)通常会带来泛化能力的下降。由于梯度估计存在方差,小批 量 SGD 始终收敛到平坦的最小值,而大批量 SGD 趋向于收敛到尖锐的最小值——尖锐的最小值导致较差的泛化能力。通常,神经网络模型的泛化能力相较于训练速度来说更为重要。因此,我们需要保证在运行相同的 epoch下,使用大批量训练的模型具有与小批量训练的模型相近的泛化能力。
周期性通信
通信轮次不仅与批量的大小有关,还与通信周期相关。前面提到,通信操作常常发生在每次迭代的末尾。 因此,我们可以控制训练进程,每隔几次迭代进行通信,进而降低通信操作发生的次数。实际上,最常用的方法是本地 SGD。为了降低多次通信带来的巨大开销,本地 SGD 让每个工作节点先在本地进行若干次迭代,然后再与参数服务器同步梯度和全局参数, 实验证明,只要周期设置合适,本地 SGD 可以减少训练时间的通信开销并且保证收敛性。
降低通信量
在传统的深度神经网络分布式训练过程中,计算节点之间交换梯度和模型参数,以进行模型聚合和本地计算。当梯度和参数量很大时,由于交换大量 32 位浮点变量而导致的通信瓶颈,削弱了并行化带来的优势。解决此问题的一个直接想法是压缩传输的梯度,最常用的两种方法是梯度量化和梯度稀疏化。前一种方法使用低精度数字(即 8 位、4 位甚至 1位)替换 32 位浮点数,以此来减少传输的梯度量;而后一种方法则选择了梯度向量中的一些重要元素来更新模型参数,以避免不必要的传输开销。
梯度量化
梯度和模型参数中的每个元素都存储在电气和电子工程师协会标准(IEEE 754)的单精度浮点变量中。交换大量的 32 位全精度变量经常占用大量网络带宽。为了缓解这种通信瓶颈,研究人员尝试使用低精度浮点数来表示训练过程中传输的梯度。梯度量化的一般性描述为:首先梯度在发送之前通过量化函数量化为低精度值,然后在模型训练期间,每个节点之间传输这些低精度值;接收节点通过反量化函数从量化值重构原始梯度,再聚合这些重构后的梯度向量并更新模型参数。根据所使用的量化函数的性质,量化操作可以分为确定性量化和 随机性量化。 确定性量化将梯度元素值映射到 某些固定的值。1 bit SGD 是确定型量 化的典型例子,它根据梯度元素的取值范围,将所有的梯度值量化到 0 和 1 这两个数字。接收端在收到量化的 01 序列后,会把其中的 0 解码成 -1,把 1 解码成 +1,再进行下一步的训练。 通常来说,因为确定性量化的固定量 化形式会有较多的信息丢失,随机性量化应运而生,这种方法使得量化后 的梯度元素值仍然服从某一概率分布。 该方法引入了额外的随机性,因此量化后的梯度一定是原始梯度的无偏估计,并且必须具有方差约束以确保具有像传统 SGD 一样的收敛性。典型的随机性量化方法如量化 SGD(QSGD 和 TernGrad 等。
梯度稀疏化
由于我们需要至少 1 位来表示梯度向量中的每个元素,因此梯度量化方法最多只能将数据量压缩 32 倍。梯度稀疏化则没有上述压缩率的限制,它只关注更新过程中梯度向量和模型参数中的一些重要值,即那些值远大于零的数字。根据选择的元素数量,稀疏化方法可以达到非常高的数据压缩率。稀疏化方法的核心是如何从梯度向量中选择有效值,即如何将稠密更新转换为稀疏更新。常见的稀疏化方法是 Top-K ,它保留了梯度向量中前 K 个较大的绝对值,而将其他值 设 置 为 零。 比 如, 基 于 Top-K 的Gradient Dropping 算法 在手写字符识别和机器翻译等任务中取得了良好的加速效果。关于梯度压缩,如何平衡模型精度与数据压缩比率是一个严峻的挑战。误差补偿已被证明是一种行之有效且兼容大部分压缩算法的技术 。此外,还有研究者使用了动量屏蔽和梯度裁剪等技术保证模型的精度。另外,研究者还应该关注如何降低梯度压缩技术的计算开销,以进一步加速模型训练。
计算与通信重叠
现有的深度学习框架后端引擎以先进先出(FIFO)的顺序执行操作。因此,按其生成顺序发送梯度,最后一层(输出层)的梯度先被发送,然后处理中间层,最后处理输入层。要完成当前迭代并尽早地开始下一次迭代,我们需要减少计算与第一层通信之间的延迟。Poseidon 系统提供了一种基于分布式训练的固有特性的无等待反向传播调度算法 :一旦反向传播计算出某一层的梯度,后端引擎就开始传输该层的梯度数据。但是,不同层的参数量可能并不相同,因此具有不 同 的 计 算 和 通 信 时 间。 这 就 意 味 着Poseidon 不一定会比某些特定网络模型上的 FIFO 调度表现更好。(Priority-base Parameter Propagation)通过基于优先级的调度扩展了无等待反向传播。靠近 输入层的梯度向量具有较高的优先级,而靠近输出层的梯度具有较低的优先级。在训练阶段,无论高优先级的梯度向量在何时生成,都将优先对其进行处理。这样就保证了其他节点能够尽早地接收到靠近输入层的梯度,从而能够尽早开始下一次迭代。此外,使用张量分割技术将各层的参数向量分解为适当的小块,并根据其所在的层为每个切片分配优先级,以实现更细粒度的流水线化。高效的计算通信重叠率可以显著地加速模型训练过程。但是,当前大部分调度算法都是启发式的,这就意味着调度算法并不是最优解。因此,寻找高效的计算、通信调度算法至关重要。目前,已经有研究者将贝叶斯优化算法和强化学习应用在算子调度上。 单 步 延 迟 SGD(OD-SGD)算法打破了下一次迭代计算对上一次迭代中通信过程的依赖,通过实现计算过程与通信过程的高度重叠来提升分布 式 训 练 性 能。 该 算 法 结 合 了 同 步SGD 和异步 SGD 两种更新算法的优势,在保证训练精度的情况下提高分布式训练的速度。
参数通信架构
在去中心化架构下,分布式深度学习的训练过程符合 全局规约操作的语义 :每个节点独立计算局部梯度,然后通过全局规约运算来计算梯度总和并将其发送给所有对等节点。显然, 上述操作可以看作一个 Allreduce 运算。 因此,整个网络通信过程的性能也就取决于 Allreduce 的性能。 在 高 性 能 计 算 领 域, 关 于 Allreduce算法的研究已经非常充分了。 Allreduce 是近两年才在深度学习训练系统中得到广泛应用的,其中很有代表 性 的 是 Ring-Allreduce, 由 百 度 于2017 年引入应用到主流的深度学习框架中。Ring-Allreduce 由两个阶段组成:Reduce-Scatter 和 Allgather。 当 使 用 p个计算节点时,每个阶段都包括 p-1个通信步骤。每个节点都维护其本地梯度,本地梯度被平均分为 p 块。在Reduce-Scatter 阶段,每个节点发送和接收张量的不同块。在 p-1 个步骤之后,每个节点都具有了一部分块的全局结果。在 Allgather 阶段,每个节点发送自己维护的部分全局结果,并从其他节点接收其他部分全局结果。同样是 p-1 个步骤之后,每个节点都拥有完整的全局结果,如 图 7 所示。因此,Ring-Allreduce 总共需要 2×( p-1) 个通信步。
网络消息库
在 去 中 心 化 架 构 下, 目 前 关 于 Allreduce 的实现非常多,包括 NVIDIA 的集合通信库、Facabook 的 Gloo 以及百度的 Allreduce 等。以 NCCL 为例,它针对 NVIDIA 的 GPU,实现了单机多卡以及多机多卡之间的高效 GPU 通信。在当前主流的跨平台统一分布式训练框架Horovod 中,NCCL、Gloo 以及 MPI 都已经得到了支持。
网络协议优化
早期的分布式训练框架的通信模块实现通常基于传输控制协议(TCP)/ 互联网协议(IP),需要先将参数数据复制到内核态的网络协议栈中,再通过网络接口发出去,这些复制操作增加了分布式训练的通信延迟。 远程直接内存访问(RDMA) 允许用户态进程直接读取和写入远端进程的地址空间,是传统高性能计算系统中常用的高带宽低延迟的通信技术。在当前主流的分布式训练框架中,RDMA 原语替换了原始的基于套接字和 TCP 的接口。 实 验 表 明, 使 用 RDMA 替 换传统的TCP/IP 协议可以大幅降低分布式训练的同步开销,提升训练速度,扩大训练规模。
本文内容来源
https://kns.cnki.net/kcms/detail/34.1228.TN.20200924.1853.004.html