在大模型分布式并行计算中主要有如下一些通信的原语:
- broadcast
- scatter
- gather
- all-gather
- reduce
- all-reduce
- reduce-scatter
- all-all
其中最简单的就是前三者。broadcast与scatter都是进行分发,而gather是聚合的过程。
Broadcast(广播)用于将数据从1个进程或节点发送到所有其他进程或节点,通常由一个源进程或节点发送数据,然后所有其他进程或节点都接收相同的数据。通常用于并行计算中将全局数据分发给所有参与者,以便它们可以共享相同的信息。
与之类似的是scatter,其用于将数据从一个进程或节点发送到多个进程或节点。通常由一个源进程或节点发送数据,然后所有其他进程或节点都接收部分数据。可以看到,Broadcast中节点接收的是相同的信息,而在scatter中接收的只是部分数据,相当于Broadcast中是数据的复制,而scatter是数据拆分后的分片。
而gather用于将来自多个进程或节点的数据收集到单个进程或节点中,结果是将来自各个进程或节点的数据聚合到一个目标进程或节点中。其可以看成是scatter的反过程。
与之类似的是reduce,其用于将来自多个进程或节点的数据合并成单个值。通常由一个目标进程或节点执行归约操作,将来自其他进程或节点的数据集合成一个结果。可以看到,reduce相当于将gather中的数据合并成一个,而不再是gather中的一列。
下面我们来看all-gather与all-reduce。
all-gather将来自所有进程或节点的数据收集到所有其他进程或节点中,而不仅仅是一个目标进程或节点。其结果可以理解为其在gather基础上叠加broadcast的操作。主要用于分布式计算中共享数据,进行全局汇总或全局同步。
all-reduce将来自所有进程或节点的数据合并成单个值,将结果分发给所有其他进程或节点。其结果可以理解其在reduce基础上叠加broadcast的操作,通常用于分布式计算中计算全局统计量,对全局计算结果进行合并或进行全局同步。
除了以上组合方式外,reduce-scatter结合了归约和分散操作,首先将来自多个进程或节点的数据归约成单个值,然后将结果分散到所有进程或节点中。其主要用于将全局结果分发给各个参与者,以便它们可以在本地处理部分结果。
最后,all-all是在所有进程或节点之间进行全局数据交换,每个进程或节点都向所有其他进程或节点发送数据,并接收来自所有其他进程或节点的数据。
参考文章:
