目录
通信原语[1]
BroadCast
Scatter
Gather
All-Gather
Reduce
Reduce-Scatter
All-Reduce
All-to-All
Ring-Base Collectives[2]
参考文献与帖子
通信原语[1]
1对多,广播方式。主节点0将数据发送到其他节点,且数据内容相同。
应用场景:
- 数据并行的参数初始化,确保每张卡上的初始参数是一致的;
- allReduce里的 broadcast + reduce组合里的broadcast操作;
- 分布式训练parameter server 参数服务器结构里的 master节点 broadcast 数据到worker节点,再从worker节点reduce数据回master节点里的broadcast操作;
Scatter
1对多,广播方式。主节点0将数据发送到其他节点,且数据内容不相同。
应用场景有:
- ReduceScatter组合里的 Scatter操作;
- 模型并行里初始化时将模型scatter到不同的XPU上;
多对1。把多个节点的数据汇聚到一个节点上。
应用场景有:
- ReduceScatter组合里的 Scatter操作;
All-Gather
多对多。收集所有的数据到所有的节点上。把多个节点的数据收集到一个主节点上(Gather),再把这个收集到的数据分发到其他节点上(broadcast)。
应用场景有:
- All-Gather可应用于模型并行;
- 模型并行里前向计算里的参数全同步,需要用all-gather把模型并行里将切分到不同的XPU上的参数全同步到一张XPU上才能进行前向计算。
Reduce
多对1。把多个节点的数据规约运算到一个主节点上。
常用的规约操作符有:求累加和SUM、求累乘积PROD、求最大值MAX、求最小值MIN、逻辑与 LAND、按位与BAND、逻辑或LOR、按位或BOR、逻辑异或LXOR、按位异或BOXR、求最大值和最小大的位置MAXLOC、求最小值和最小值的位置MINLOC等,这些规约运算也需要加速卡支持对应的算子才能生效。
应用场景有:
- AllReduce里的 broadcast + reduce组合里的reduce操作;
- ReduceScatter组合里的 reduce操作;
- 分布式训练parameter server 参数服务器结构里的 master节点 broadcast 数据到worker节点,再从worker节点reduce数据回master节点里的reduce操作;
Reduce-Scatter
多对多。在集群内的所有节点上都按维度执行相同的Reduce规约运算,再将结果发散到集群内所有的节点上。
应用场景有:
- ReduceScatter即可应用于数据并行也可应用于模型并行;
- 数据并行allReduce里的 ReduceScatter+ Allgather组合里的ReduceScatter操作;
- 模型并行里在前向allgather后的反向计算里的ReduceScatter;
All-Reduce
多对多。在所有节点上都执行相同的Reduce操作,将所有节点的数据规约运算得到的结果发送到所有的节点上。
应用场景有:
- AllReduce应用于数据并行;
- 数据并行各种通信拓扑结构比如Ring allReduce、Tree allReduce里的 allReduce操作;
All-to-All
多对多。对All-Gather的扩展,但不同的节点向某一节点收集到的数据是不同的。
应用场景有:
- 应用于模型并行;
- 模型并行里的矩阵转置;
- 数据并行到模型并行的矩阵转置;
Ring-Base Collectives[2]
将所有的通信节点通过首尾连接形成一个单向环,数据在环上依次传输。
下面把要传输的数据分成S份,每次只传N/S的数据量
在以GPU为通信节点的场景下,如何构建通信环:
- 单机4卡通过同一个PCIe switch挂载在一棵CPU:
- 单机8卡通过两个CPU下不同的PCIe switch挂载:
参考文献与帖子
[1] 常平的笔记 - 认识世界是为了改造世界
[2] 如何理解Nvidia英伟达的Multi-GPU多卡通信框架NCCL? - 知乎