作者: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.模型越大,方法的优越性越显著