https://andrew.gibiansky.com/blog/machine-learning/baidu-allreduce/#ref-4
1. ALL reduce , reduce, broadcast 概念
Introduction
在过去的几年中,神经网络已经被证明是解决各种问题的令人难以置信的有效工具,并且在规模和计算需求上都迅速增长。2012年,用于图像识别的SuperVision卷积网络在物体识别方面取得了巨大的进展,使用了两个GPU一周时间和6000万个参数1。2016年,研究人员在语言建模方面取得了突破性进展,该网络具有超过10亿个参数,在32个GPU上训练了三周2。在百度研究院的硅谷AI Lab内部,2014年我们的Deep Voice语音识别系统的第一次迭代大约有1100万个参数5,而一年后的下一次迭代已经增长到了1亿个参数3。
随着神经网络的参数数量和计算需求的增长,在许多节点和许多GPU上高效地并行训练神经网络变得越来越重要,因为等待几个月来训练大型网络会减慢实验速度并限制进一步发展。在这篇博文中,我们介绍了一种来自高性能计算(HPC)领域的技术,并演示了如何将其应用于深度学习,以在神经网络训练中实现显著的性能提升。
The Communication Problem
在将神经网络的训练并行化到许多GPU上时,您必须选择如何将不同的操作分布到可供您使用的不同GPU上。在这里,我们重点介绍一种称为数据并行随机梯度下降(SGD)的技术。与标准SGD中一样,梯度下降是对数据的子集(minibatches)进行的,需要多次迭代才能遍历整个数据集。然而,在数据并行训练中,每个GPU都有整个神经网络模型的完整副本,并且对于每次迭代,只分配minibatch中样本的一个子集。对于每次迭代,每个GPU在其数据上运行网络的前向传播,然后是误差反向传播,以计算相对于网络参数的损失梯度。最后,GPU相互通信,对不同GPU计算的梯度进行平均,将平均后的梯度应用于权重以获得新的权重。所有GPU都以锁步方式进行迭代,一旦一个GPU完成了它的迭代,它必须等待所有其他GPU完成它们的迭代,以便权重可以正确更新。这相当于在单个GPU上执行SGD,但我们通过将数据分布在多个GPU上并并行执行计算来获得加速比。
当您只有两个GPU并且参数以兆字节数据测量时,这些GPU如何通信可能并不重要。但是,当你的模型有数十亿个参数时,梯度可能会占用GB的空间(因为每个参数都有一个梯度值),而且你要协调几十个GPU,通信机制就变得至关重要了。
例如,考虑可能的最直接的通信机制。每个GPU在其minibatch的子集上计算梯度。然后,每个GPU将其梯度发送到单个GPU,该GPU获取所有梯度的平均值,并将平均值发送回所有其他GPU。
Data transfer to and from a single reducer GPU
需要发送的数据越多,发送的时间就越长;每个通信信道都有一个最大吞吐量(带宽)。例如,一个好的互联网连接可以提供每秒15兆的带宽,而千兆以太网连接可以提供每秒125兆的带宽。HPC群集中的专用网络硬件(如Infiniband)可在节点之