分布式深度学习里的通信严重依赖于规则的集群通信(见《对抗软件系统复杂性③:恰当分层,不多不少》对通信的讨论),诸如 all-reduce, reduce-scatter, all-gather 等,因此,实现高度优化的集群通信,以及根据任务特点和通信拓扑选择合适的集群通信算法至关重要。
本文以数据并行经常使用的 all-reduce 为例来展示集群通信操作的数学性质。
1、all-reduce 在干什么?
图 1:all-reduce
如图 1 所示,一共 4个设备,每个设备上有一个矩阵(为简单起见,我们特意让每一行就一个元素),all-reduce 操作的目的是,让每个设备上的矩阵里的每一个位置的数值都是所有设备上对应位置的数值之和。
如图 2 所示, all-reduce 可以通过 reduce-scatter 和 all-gather 这两个更基本的集群通信操作来实现。基于 ring 状通信可以高效的实现 reduce-scatter 和 all-gather,下面我们分别用示意图展示其过程。
2、reduce-scatter 的实现和性质
图 3:通过环状通信实现 reduce-scatter
从图 2 可以看出,reduce-scatter 的结果是每个设备保存一部分 reduce 之后的结果。为了方便讨论,我们先定义一些符号。假设有p 个设备(上面的例子中p=4);假设整个矩阵大小是V, 那么 reduce-scatter 后,每个设备上有 \frac{V}{p} 大小的数据块;假设卡和卡之间通信带宽是 \beta ,而且是双工通信(duplex),即每个设备出口和入口带宽可以同时达到 \beta