论文:https://arxiv.org/pdf/1810.11787.pdf
译文:深度神经网络分布式训练指引
摘要
深度学习让人工智能领域取得了很大的进步。但是训练这些深度学习模型需要大量的计算。单机单卡训练ImageNet需要一周。多机分布式训练可以极大地减少训练时间。最近,有2048个GPU的一个集群,把训练ImageNet的时间减少到4min。本文调研分布式训练的各种算法和技术,并且提出一个效果最好的分布式训练框架。我们探究同步和异步随机梯度下降、All Reduce 梯度聚合策略、在集群内进行混合精度训练以获得高吞吐低延迟的最佳实践、大批量训练以及梯度压缩。
介绍
1、背景和动机:
数据正在以史无前例的规模产生,这些数据需要被有效分析以获得有意义的信息。深度学习作为强有力的分析工具,在视觉、语言和智能推理等复杂任务上表现都很好。然而,这些算法需要花很长的时间来训练大量的数据,才能得到有效的结果。最初,结果最好是单机单卡训练ImageNet分类模型花了一周,但是现在的数据规模远比ImageNet大。我们需要线性扩展(linear scale)训练速度,同时保留训练结果的精度、容错以及在高延迟的网络中收敛。
2、分布式训练概览:
分布式训练可以分为两种,数据并行和模型并行。
数据并行把数据集平分到各个节点,每个节点都有一份完整的模型以及本地权值子集,每个节点训练数据集子集,并且更新本地权值子集。这些本地权值在集群节点间共享,并通过积累算法,计算得到全局权值。然后全局权值被分发回各个节点,继续下一个batch的训练。(注:BytePS中,每个worker节点都有所有权值,更新权值的主要工作由server节点负责)
模型并行把模型结构分割到不同节点。AlexNet把结构划分到2个GPU,以满足GPU显存要求。模型并行应用于,1)模型太大;2)模型结构可以并行。目标检测网络有隔离的边界和互相独立的类预测头(这个之后深入看看)。
分布式训练框架的组成
1、分布式训练算法:
节点间通信:
分布式训练另一个重要部分就是节点间的数据通信。
梯度积累
梯度积累算法在分布式训练系统中扮演着重要角色。这些算法负责收集每个worker节点的本地梯度,再把更新之后全局梯度分发回各个worker节点。
低精度训练
基于ImageNet训练Resnet,目前最快4min。
算术精度:
梯度和参数压缩
结论
我们调研和总结了分布式训练框架的多种组成部分,以及推荐如下技术来构建一个高效、可扩展的分布式训练框架:
1、使用同步SGD,保证严格收敛。
2、All Reduce过程中的梯度积累应该用binary blocks算法,因为它的运行时间很优越。
3、为了高效利用硬件和网络带宽,梯度压缩、量化和混合精度训练等等技术都应该用上。
4、batch_size应该尽可能大(BytePS实践中,通常用满GPU显存),以获得最好的并行效果,以及最小化训练时间。推荐LARS算法,batch_size可以到64k。(注:这里64k具体怎么运作的?不会把显存撑爆吗?)
我们还提出了一个容错的All Reduce算法,可以在不全部重启的情况下工作。最后,我们提及分布式训练未来的一些方向和启示。