一个用于分布式DNN训练加速的通用通信调度器

论文:https://i.cs.hku.hk/~cwu/papers/yhpeng-sosp19.pdf

译文:一个用于分布式DNN训练加速的通用通信调度器

摘要

我们提出ByteScheduler,一个用于分布式DNN训练加速的通用通信调度器。ByteScheduler基于我们最基本的分析:通过张量切分和重组来进行传输,可以得到理论上的最优结果,即使真实环境中有调度代价,性能表现也很不错。为了让ByteScheduler适用于各种DNN训练框架,我们介绍一种统一的抽象和一种依赖代理机制,使得可以在不破坏框架引擎原有依赖的基础上进行通信调度(注:这是什么东西?)。我们进一步介绍一种贝叶斯优化方法,可以在各种网络环境下,针对不同训练模型,来自动调整张量划分的尺寸,以及其他参数。ByteScheduler目前支持TensorFlow、PyTorch和MXNet,并且不用修改源码,兼容Parameter Server和all-reduce架构的梯度同步,TCP和RDMA网络都行。我们的实验证明,ByteScheduler训练的加速比是2.96。

介绍

深度神经网络(DNN)被广泛运用于各个领域,例如计算机视觉和自然语言处理等等。但是,训练DNN很耗时,主要是因为训练数据多,以及DNN模型的尺寸越来越大。加速DNN训练最常用的方法是数据并行。不幸的是,因为通信开销,它的性能常常比线性加速比差很远。作为一个大型在线服务提供商,在很多我们内部和公开训练任务中,通信通常占总训练时间的很大一部分。因此,很多通信加速方法被提出并且集成到

背景和动机

DNN训练和数据并行:

在深度学习中,DNN模型是通过迭代一个大数据集来训练的(也叫epoch),以最小化损失函数。 

正向和反向传播:

在每个epoch期间,数据集被划分成mini-batch。在每次iteration,一个mini-batch逐层经过DNN并产生一个损失,这个过程叫正向传播(FP)。

张量划分:

 

实现细节 

ByteScheduler是用C++11和Python实现的。核心是一个通用Python库,用于所有ML框架。对于每个框架,都需要一个插件,用于PS或者all-reduce架构。插件通常用C++和Python混编。

ByteScheduler Core:

MXNet plugin:

PyTorch plugin:

TensorFlow plugin:

 

评估

 

讨论和未来方向

 

相关工作 

加速DNN训练的通信:

加速DNN训练的通信:

加速DNN训练的通信: 

结论

ByteScheduler是一个用于分布式DNN训练加速的通用通信调度器。我们的实现,支持很多ML框架,包括MXNet、PyTorch和TensorFlow,兼容PS和all-reduce梯度同步,TCP和RDMA网络都行。ByteScheduler端到端可以加速196%。主要的设计思想包括:通信操作的统一抽象、依赖代理和系统参数自动调整。我们已经开源我们的实现,期待社区可以加入更多对已有和未来框架的支持。

 

posted @ 2019-09-29 10:33  happyyoung  阅读(918)  评论(0编辑  收藏  举报