【阿里云计算】【开发者成长】揭秘阿里云大规模深度学习性能优化实践( 四 )


第 3 个优势是结合云端做弹性伸缩 , 让用户业务的成本最优 。
第 4 个优势是和开源兼容的 , 用户用开源深度学习计算框架写的代码大部分都不用修改 , 直接采用 AIACC 库就可以得到性能上的飞跃 。
AIACC 主要是利用了基于通信的性能优化技术 。 通过前面的分享我们知道 , 在做分布式训练的时候我们需要在机器之间、GPU 之间交换梯度数据 , 需要做到非常高效的数据通信 。
我们的分布式通信优化分为三个方面的优化 。
第 1 个方面是做通讯和计算的重叠 。我们梯度是做异步通信的 , 在计算的时候并行去做梯度通信 , 从而将通信的时间隐藏在计算后面 。
第 2 个方面是做了延迟的优化 。我们在做梯度通信之前需要去做梯度协商 , 需要知道每台机器上 GPU 里的梯度是不是 ready , 然后再做通信 。 传统的做法是通过一个中心化的节点去做所有节点梯度协商 , 这样当规模上来时 , 延迟会非常高 。 而我们的优化方法是去中心化的方式去做梯度协商 , 这样的效率更高 , 大规模下延迟也不会提高 。
第 3 方面的优化是做带宽的优化 , 带宽方面有 5 种优化方法:
第 1 种优化方法是基于拓扑结构的分级通信优化 。 我们知道在一台机器上的 GPU 之间的通信带宽是很高的 , 而跨机的 GPU 通讯的带宽是很低的 , 所以我们通过分级通信优化 。 先在机器内部做 GPU 之间的通信 , 然后再在 GPU 机器之间做通讯 。
第 2 种优化方法是做混合精度传输 。 原始的梯度的精度都是 float32 类型的 , 我们在做计算的时候还是保持 float32 的精度 , 但是在梯度传输的时候可以把它转成 float16 的精度去做梯度传输 , 这样要传输的数据量直接减少一半 。 同时 , 我们通过 scaling 的方式保持精度不下降 。
第 3 种优化方法 , 是做多梯度融合通信 。 一个模型在做分布式通信的时候需要对很多层的梯度都来做通信 , 如果每计算出来一个梯度就去做一次通信的话 , 很多层的梯度数据包是非常小的 , 对带宽的利用率是非常低的 。 于是 , 我们做了梯度融合 , 等到一批梯度融合之后 , 再做一批梯度的多机通信 , 这样对带宽利用率是很高的 。
第 4 种优化方法是做多流通讯 。 在高带宽的 TCP 网络情况下 , 单个通信流是没有办法把带宽打满的 , 所以我们用多流来做通信 。 然而 , 我们发现 , 多流的情况下多流之间的传输速率是不一样的 , 于是做了负载均衡 , 传得更快的流会自动拿更多的梯度通信 , 传得更慢的流会通信更少的梯度 。
第 5 种优化方法是对融合的粒度以及通信的流数作了一个动态的 tuning 过程 。 我们在开始训练开始的几个 batch 的时候 , 会根据当前网络的情况对这些参数做动态的调整从而达到最优性能 , 这样我们就可以动态的适配在不同网络情况下达到最优的性能 。
【阿里云计算】【开发者成长】揭秘阿里云大规模深度学习性能优化实践
本文插图

这个图是我们做动态调优的过程 , 绿色部分是做计算 , 红色部分是做通信 , 我们可以看到在训练刚开始的几个 batch 只有一个流作通信 , 而且它的通信时间会比较长 。 在中间这一段我们开出了两个流来做通信 , 在后面这一段我们开出了 4 个流来做通信 , 并且 4 个流之间是做了负载均衡 , 在最后一个 batch 的时候 , 我们达到了一个最佳的性能 。
【阿里云计算】【开发者成长】揭秘阿里云大规模深度学习性能优化实践
本文插图

经过这些性能优化工作 , 我们也小试牛刀 , 训练上述大厂的 ResNet-50 模型 +ImageNet 数据集的任务 , 在 512 张 P100 上的性能比单卡性能能够加速 462 倍 , 基本上达到了接近线性的加速比 , 将训练时间从原来的 5 天时间缩短到了 16 分钟 。
这次 DWANBench 打榜 , 我们也发布了基于 V100 的大规模训练时间 , 训练达到 top5 的 93% 的精度只需要 2 分 38 秒 。


推荐阅读