姓名:姬文浩 学号:22011210610 学院:通信工程学院
一、概述
在设计分布式机器学习系统时,研究人员采用了多种方法来降低通信代价。这些方法主要利用机器学习算法的容错性特点,适当降低通信的频率,从而减少通信开销。在本章中,我们把通信频率分为时间频率和空间频率两种。其中,时间频率主要指通信的频次间隔,而空间频率主要指通信的内容大小。相应地,优化通信频率可以从两方面进行,即时域滤波和空域滤波。
二、时域滤波
时域滤波的方法旨在从通信的过程出发,控制通信的时机,减少通信次数,从而减少通信代价。采用时域滤波的主要方法有增加通信时间间隔、非对称推送和获取以及计算和传输的流水线。
2.1 增加通信时间间隔
增加通信间隔是种非常简单并且行之有效的加速分布式学习的方法。其具体做法是将通信的频率从原来本地模型每次更新后都通信一次,变成本地模型多次更新后才通信一次。这种方法对于通信时间远大于计算时间的模型很有效,例如每层都是全连接层的深层神经网络。对于一个有几千万个参数的机器学习模型,如果本地迭代一轮需要花费几十毫秒的时间,而模型的通信却需要上百毫秒的时间,那么不做时域滤波的分布式机器学习几乎无法加速训练。但是如果我们把本地计算增加到100轮,那么经过几秒之后才会有一次通信,这就极大地缩小了通信时间所占的比例,从而带来明显的系统效率提升。将增加通信间隔的思想推向极致,我们甚至可以让所有的训练都在本地进行,只在算法结束的时候用一次通信将各个局部模型进行聚合。
2.2 非对称的推送和获取
在异步算法中,还可以通过另外一种方法来减少通信的时间频率。异步通信存在俩种通信操作——推送模型更新和获取最新的全局模型,我们可以对着俩种操作采用不同的频率。谷歌提出的第一代分布式机器学习系统DistBelief就采用了这种做法。
用△push和△poul分别表示推送本地模型更新的时间间隔和获取最新全局模型的时间间隔。当推送和获取的频率相同时,我们有△tpush=△tpull。,当使用不同的推送和获取频率时,△tpush≠△tpull≥1。
与增加通信间隔类似,调整推送和获取的时间间隔也可能给模型训练带来一定的精度损失。幸运的是,在很多实际系统中,通过设置合理的间隔,可以将对模型的影响控制到最小。这是因为推送的目的是让参数服务器根据工作节点的本地训练结果来更新全局参数,而获取的目的是用参数服务器的全局模型来校准工作节点的本地模型。如果某个工作节点在训练过程中本地模型参数发生的变化不太大,实际上是没有必要那么频繁地把很小的更新发送到参数服务器的。同样,也没有必要在每步都对本地模型进行校准。通过调节△tpush和△tpull这两个参数,我们可以在系统性能和模型精度之间找到一个平衡点。
2.3 计算和传输流水线
除了减少通信次数的方法之外,还有一类方法巧妙地安排了计算和通信在时间上的流水线关系。流水线是计算机系统中常用的优化方法,通过将没有依赖关系的不同操作用流水线并行起来,可以获得很大的加速。在分布式机器学习中,我们可以将一次迭代分为计算和通信两个步骤。虽然相邻两次迭代之间存在依赖性,但我们可以利用机器学习的容错性,适当打破这种依赖关系,从而将两次迭代之间的计算和通信用流水线的方式并行起来。这种方法被广泛地应用在各种实际分布式学习系统中,比如CNTK、MxNet、Multiverso、 GeePS等。下图给出了这种方法的示意图。图中有两个线程;训练线程完成计算的部分,传输线程完成网络通信的部分。系统中有两个模型缓存(buffer1 和buffer2),训练过程基于buffer1 中的模型参数,产生模型的更新。在训练的同时,通信线程先将上轮训练线程产生的更新发送出去,然后获取一份当下最新的全局模型,保存在buffer2中。当计算和传输的线程都完成一轮操作后,交换两个缓存中的内容:buffer2中的新模型参数将被交换到训练线程中,作为下-轮训练迭代的初始值;而buffer1 中新产生的本地更新将被交换给通信线程,并发送给参数服务器。
如上所述,模型的训练和网络通信在时间轴上是相互重叠的,从而减少了总体的时间开销。这种方法在工程实践中十分有效。与不带流水线的方法相比,这种方法模型更新的延迟稍有所增加,但在实践中,却能有效地提高系统的效率。