随着各大企业和研究机构在PyTorch、TensorFlow、Keras、MXNet等深度学习框架上面训练模型愈来愈多,项目的数据和计算能力需求急剧增长。在大部分的状况下,模型是能够在单个或多个GPU平台的服务器上运行的,但随着数据集的增长和训练时间的增加,有些训练须要耗费数天甚至数周的时间,咱们拿COCO和Google最近Release出来的Open Image dataset v4来作比较,训练一个resnet152的检测模型,在COCO上大概须要40个小时,而在OIDV4上大概须要40天,这仍是在各类超参数正确的状况下,若是加上调试的时间,可能一个模型调完就该过年了吧。单张CPU卡、或者单台服务器上的多张GPU卡,已经远远不可以知足内部训练任务的需求。所以,分布式训练的效率,即便用多台服务器协同进行训练,如今成为了深度学习系统的核心竞争力。html
分布式训练系统架构主要有两种:git
在Parameter Server架构(PS架构)中,集群中的节点被分为两类:parameter server和worker。其中parameter server存放模型的参数,而worker负责计算参数的梯度。在每一个迭代过程,worker从parameter sever中得到参数,而后将计算的梯度返回给parameter server,parameter server聚合从worker传回的梯度,而后更新参数,并将新的参数广播给worker。见下图的左边部分。github
在Ring-allreduce架构中,各个设备都是worker,而且造成一个环,如上图所示,没有中心节点来聚合全部worker计算的梯度。在一个迭代过程,每一个worker完成本身的mini-batch训练,计算出梯度,并将梯度传递给环中的下一个worker,同时它也接收从上一个worker的梯度。对于一个包含N个worker的环,各个worker须要收到其它N-1个worker的梯度后就能够更新模型参数。其实这个过程须要两个部分:scatter-reduce和allgather,百度开发了本身的allreduce框架,并将其用在了深度学习的分布式训练中。算法
相比PS架构,Ring-allreduce架构有以下优势:后端
经过TensorFlow原生的PS-Worker架构能够采用分布式训练进而提高咱们的训练效果,可是实际应用起来并不轻松:服务器
PyTorch用1.0稳定版本开始,torch.distributed软件包和torch.nn.parallel.DistributedDataParallel模块由全新的、从新设计的分布式库提供支持。 新的库的主要亮点有:网络
1.0的多机多卡的计算模型并无采用主流的Parameter Server结构,而是直接用了Uber Horovod的形式,也是百度开源的RingAllReduce算法。架构
Horovod 是一套支持TensorFlow, Keras, PyTorch, and Apache MXNet 的分布式训练框架,由 Uber 构建并开源,Horovod 的主要主要有两个优势:框架
Horovod 是一个兼容主流计算框架的分布式机器学习训练框架,主要基于的算法是 AllReduce。 使用 horovod 有必定的侵入性,代码须要必定的修改才能变成适配分布式训练,可是有一个好处就是适配的成本不高,而且 horovod 提供的各类框架的支持可让 horovod 比较好的在各个框架的基础上使用,他支持 tensorflow/keras/mxnet/pytorch,MPI 的实现也有不少,好比 OpenMPI 还有 Nvidia 的 NCCL,还有 facebook 的 gloo,他们都实现了一种并行计算的通讯和计算方式。并且 horovod 的自己的实现也很简单。机器学习
参考文献:
https://eng.uber.com/horovod/
https://www.aiuai.cn/aifarm740.html
https://zhuanlan.zhihu.com/p/40578792
https://ggaaooppeenngg.github.io/zh-CN/2019/08/30/horovod-实现分析/
https://blog.csdn.net/zwqjoy/article/details/89552432
https://www.jiqizhixin.com/articles/2019-04-11-21
https://zhuanlan.zhihu.com/p/50116885
https://zhuanlan.zhihu.com/p/70603273
http://www.javashuo.com/article/p-krardcgo-go.html
https://zhpmatrix.github.io/2019/07/18/speed-up-pytorch/
https://cloud.tencent.com/developer/article/1117910
https://www.infoq.cn/article/J-EckTKHH9lNYdc6QacH