2015《Scalable Distributed DNN Training Using Commodity GPU Cloud Computing》

作者:Strom

Abstract

1.对象:DNN GPU Gloud

2.方法:独立控制每一个权重的更新频率。

3.效果:总的通信量降低了三个数量级,收敛率(convergence rate)和准确率(accuracy)没有降低。

1.Introduction

3.并行训练也可以转化为模型并行问题。对于稀疏结构化连接层(CNN),可以有效分配每层的计算;对于全连接层,每一层可以由不同节点进行处理。由于紧密连接的网络,模型并行受到DNN层数的限制,因此本篇工作只研究数据并行的问题。(数据并行可以和模型并行进行合并)

2.Method

2.1Data-parallel distributed SGD

减少通信量的方法:1.减少同步的频率 2.压缩梯度

2.2Two observations

1.很多SGD加速方法可以看作是延迟更新的变体:minibatch、Momentum、Nesterov、double buffering、asynchronous SGD

2.对于全连接DNN来说,子梯度十分稀疏,因此对于接近于0的梯度,可以延缓更新。

2.3Compaction and dead reckoning

2.string compaction(与GPU有关的技术,好像和本文关系不大?)
3.dead reckoning:所有计算节点的更新逻辑相同(没什么,不值得再看)

2.4Gradient residual

1.由于不同权重的大小不同,因此不能简单丢弃低于阈值的梯度。

2.所有权重最后都被更新。

2.5Quantization and compression

1.索引和梯度都被pack,最终一个键值对以32 bit的int表示。

2.量化误差(error feedback)要被累加到residual

3.进一步压缩:entropy coding——不记录值的大小,记录值之间的差值。(3倍压缩率,因为需要额外的时间成本,因此本文没有使用)

2.6Pseudo code

一个minibatch的过程:

1.从其他节点接收、解压梯度,累加到本地模型参数上
2.加载一个minibatch的训练数据
3.BP计算子梯度Gs
4.累加梯度:Gr=Gr+Gs
5.重置消息Map:M
6.对于每个元素gi:
7.若gi>+阈值(t):
             将{i,+t}加入到M中
             gi=gi-t
  否则若gi<-阈值(-t):
             将{i,-t}加入到M中
             gi=gi+t
8.压缩M,然后发送到其他节点

3.Experiments

3.1环境:AWS

3.2用单机结果作为baseline

3.3

1.使用了预训练;
2.另外,为了避免低性能,第一个epoch,使用了更小的minibatch size和计算节点。(为什么可以改善)

实验的其他细节省略了

4.Discuss

该方法不能无限制扩展节点:

1.随着节点数目增大,batchsize过大,容易不收敛。(1.节点数目和batch size是什么关系? 2.batchsize过大,为什么不收敛?)

2.随着节点数目增多,通信可能再次成为瓶颈。

5.Conclusion

1.该方法有效扩展了规模:80GPU

2.模型越大,方法的优越性越显著