在第一部分,我们将看到如何在 GPU 上用分布式计算大大加速深度学习模型的训练速度,并讨论近期该领域上的一些挑战和近期的研究。同时,我们还要考虑:在什么时候,神经网络的分布式训练是适合或不适合特定的案例的?介绍
在数据并行(data parallelism)中,不同的机器有着整个模型的完全拷贝;每个机器只获得整个数据的不同部分。计算的结果通过某些方法结合起来。
分布式训练中的数据并行方法在每一个 worker machine 上都有一套完整的模型,但分别对训练数据集的不同子集进行处理。数据并行训练方法均需要一些整合结果和在各工作器(worker)间同步模型参数的方法。在文中我们将讨论一些不同的方法,而这些方法间的基本差异在于:
- 参数平均(Parameter Averaging)
2. 将现有的参数的一个副本分配给每一个 worker machine
5. 当还需要处理更多数据时,回到第 2 步
现在,参数平均化在概念上已经十分简单,但我们也略过了一些复杂的地方。
与最优化方法相关的附加难题,例如 adagrad,动量和 RMSProp。这些优化方法(在 Deeplearning4j 又称作更新器(updater))已被证明能在神经网络训练的过程中极大地提升收敛性能。然而,这些更新器也有内部状态(通常一个网络参数中有 1-2 个状态值)。我们应该也将这些状态算入均值吗?将这些内部更新器状态平均会造成每个 worker 的更快速的收敛,但代价是比原来总量多 2 倍或者更多的网络传输。有些研究工作也在试图在参数服务器层面上应用相似的「更新器」机制,而不只是在每一个 worker 上应用。
首先,我们有潜在可能在整个分布式系统中获得更高的通量:worker 可以将更多时间花在执行有用的计算而不是等待参数平均化步骤完成。
其次,worker 有可能可以集成来自其它 worker 的信息(参数更新),这比使用同步(每 N 个步骤)更新更快。
一些处理处理过期梯度的方法包括:
注意,若给定 s = 1 以及 λ(·) 为宜常数,我们得到朴素异步 SGD 算法 [2];相似地,若给定 s=n,我们则会得到另外一个与同步参数平均算法相似但不相同的算法。
1. 在该模型中,没有中心的参数服务器——取而代之的,是点对点的参数传输以对于学习器之间进行更新。
1. 稀疏性:在每个向量 δi,j 中,只有部分的梯度值是相互关联的(也就是其余的值是被设为 0 的)——稀疏项使用整数进行索引。
此外,考虑到该压缩方法是有损的,因而原更新向量 ΔWi,j 与压缩/量化更新的向量 δi,jδi,j 的差将不被简单地忽略,而是被储存在一个残差向量 rj 中( j代表每次执行)。而残差向量将被加到原来的更新上,也就是说,每一步我们量化并传输一个经过压缩的 ΔWi,j+rj 并更新合适的 rj。由此,原始的更新向量 ΔWi,j 中的信息被完整的传输了并没有损失。换句话说,(每个参数的)大更新都将被以比小更新更高的速度动态传输。
1. Strom在论文中写道,收敛情况在训练之初可能出现问题。但使用更少的训练节点和使用一部分案例好像可以帮助解决该问题。
最后,就笔者所知,暂时还没有异步SGD和分布式异步SGD的实验比较。
最快的训练速度(每秒最多或最少可以训练多少个例子)
在无限样例下可达到的最大精度
在有限时间下可达到的最大精度
在有限样例下可达到的最大精度
最大可达到的准确度对历元的给定数量的
同步参数平均法(或等价说,基于同步的更新)在每一次遍历中的与整体的准确率方面,特别是对很小的平均周期,表现更好。参见 [9] 中所示的」硬同步」结果,或在 N=1 的平均周期下同步平均法在单机训练上的表现。但是,额外的同步花费意味着这个方法在每次迭代中需要花费更多的时间。也就是说,如 InfiniBand 的更快的神经网络连接还需要花费很多精力,以使该同步方法具有竞争力(详见 [5])。但是,甚至在商业硬件上,我们也能见到基于 DL4J 的同步参数的,很好集群利用。增加压缩步骤,应该会进一步减少网络通讯的花费。
基于集中参数的异步 SGD 实现,可能会引入通信瓶颈(相比之下,同步方法可以利用剪枝或类似算法,能一定程度上避免这方面的沟问题)。将全部的参数分为 N 等份,使用 N 个参数服务器处理每一份数据,从概念上说,这是一个更为直接的解决该问题的方法。
对每种使用情况,分布式深度学习往往不都是最好的选择。
在某些情况下,多 GPU 系统应该首先被考虑(如 Deeplearning4j 的 Parallel-Wrapper 系统可以让神经网络在单机上轻松进行同步训练)。基于多 GPU 系统对模型进行同步运算对大型网络也是可行的。
在我们介绍分布式深度学习系列文章中,我们将在第三篇的第二部分仔细探讨 Deeplearning4j 的机遇 Apache Spark 的参数平均法的实现,并通过一个例子来演示如何在 Spark 集群上来训练神经网络。
[2] Jeffrey Dean, Greg Corrado, Rajat Monga, Kai Chen, Matthieu Devin, Mark Mao, Andrew Senior, Paul Tucker, Ke Yang, Quoc V Le, et al. Large scale distributed deep networks. In Advances in Neural Information Processing Systems, pages 1223–1231, 2012.
[5] Forrest N Iandola, Khalid Ashraf, Mattthew W Moskewicz, and Kurt Keutzer. Firecaffe: near-linear acceleration of deep neural network training on compute clusters. arXiv preprint arXiv:1511.00175, 2015.
[8] Hang Su and Haoyu Chen. Experiments on parallel training of deep neural network using model averaging. arXiv preprint arXiv:1507.01239, 2015.
[9] Wei Zhang, Suyog Gupta, Xiangru Lian, and Ji Liu. Staleness-aware async-sgd for distributed deep learning. IJCAI, 2016.