1. broadcast

目的:将一个进程(通常称为根进程)持有的数据复制到所有其他参与通信的进程中。
操作

  • 根进程发送其数据至所有其他进程。
  • 其他进程接收并存储根进程发送的数据。
    结果:所有进程中都有一份与根进程相同的数据副本。
    应用场景
  • 初始化阶段,将初始参数或配置信息分发到所有计算节点。
  • 从主节点向工作节点广播最新的模型权重或状态信息。

2. reduce

目的:将所有进程各自拥有的相同类型和形状的数据进行某种全局运算(如求和、最大值、最小值、乘积等),并将运算结果保存在指定的一个进程中(通常称为根进程)。
操作

  • 各进程通过高效通信算法逐级或逐环地局部聚合数据,每次聚合后将结果传递到下一个阶段。
  • 最终,根进程保留全局运算的结果。
    结果:只有根进程拥有经过全局运算后得到的单一结果数据,其他进程不保留结果。
    应用场景
  • 计算全局统计指标,如总损失、平均精度等,只需一个进程知道全局结果即可。
  • 并行计算中的收敛检测,根进程收集各进程的局部收敛信息以判断全局收敛状态。

3. scatter

目的:将根进程持有的数据分割成多个片段,并将这些片段均匀地分发给所有参与通信的进程。
操作

  • 根进程将数据按照一定的规则(如均等分割、按需分配等)拆分成多个部分。
  • 根进程将每个数据片段发送给相应的目标进程。
  • 目标进程接收并存储分配给自己的数据片段。
    结果:每个进程最终拥有整个数据集中的一部分,这些部分合起来构成原始数据。
    应用场景
  • 分布式训练中,将大型数据集均匀划分给各个计算节点进行并行处理。
  • 分配任务参数或初始化数据到各个工作节点。

4. gather

目的:将所有进程各自拥有的数据片段收集到一个指定进程(通常称为根进程)。
操作

  • 各进程将其本地数据发送给根进程。
  • 根进程接收到所有进程发送过来的数据后,将其拼接整合成完整的数据集。
    结果:只有根进程拥有所有进程发送过来的数据片段组成的完整数据集,其他进程不保留结果。
    应用场景
  • 收集各个计算节点的中间结果或局部统计信息,汇总到主节点进行后续处理或决策。
  • 训练完成后,从各个工作节点收集模型权重以进行模型融合或持久化存储。

5. reduce-scatter

目的:将所有进程各自拥有的相同类型和形状的数据进行某种全局运算(如求和、最大值、最小值、乘积等),并将运算后的结果分散到各个进程中,每个进程获得一部分结果。
操作

  • 各进程先进行类似reduce的操作,逐步聚合数据并产生全局运算结果。
  • 然后将全局结果按照特定规则分割,并将分割后的片段分散到各个进程。
    结果:每个进程最终拥有全局运算结果的一部分,这些部分合起来构成全局运算结果。
    应用场景
  • 分布式矩阵乘法中,计算矩阵乘积后将其分割回各个节点,用于后续计算。
  • 高效实现某些特定算法,如分布式K-means聚类中的中心点更新。

6. all-to-all

目的:每个进程拥有一个数据向量,通信完成后,每个进程获得一个新向量,其中的每个元素来自原来不同进程对应位置的元素。
操作

  • 各进程按照通信协议,交换各自向量中的元素。
  • 每个进程接收到来自其他进程对应位置的元素,并将其放置在新向量的相应位置。
    结果:所有进程都得到了一个新的数据向量,其中的每个元素来源于参与通信的其他进程。
    应用场景
  • 实现数据块的全排列或重新分布,如在神经网络训练中进行层间数据交换。
  • 并行FFT(快速傅里叶变换)等算法中的数据重组。

7. all-gather

目的:将参与通信的所有进程各自拥有的不同数据片段合并成一份完整的数据集,并确保这份完整的数据集被所有进程所拥有。
操作

  1. 每个进程拥有一个本地的数据片段。
  2. 通过通信协议(如MPI、NCCL、Gloo等),每个进程将其本地数据发送给所有其他进程。
  3. 所有进程接收到其他进程发送过来的数据后,将其拼接到本地已有的数据片段上,形成完整的数据集。
    结果:每个进程最终都拥有了一份完整的数据集,包含了所有参与通信进程最初各自拥有的数据片段。
    应用场景
  • 在分布式训练中,可能需要将各个设备上的梯度片段收集起来,以便在全局视角下进行参数更新。
  • 在并行计算中,可能需要汇总各个进程计算得到的部分结果,形成全局结果。

8. all-reduce

目的:将参与通信的所有进程各自拥有的相同类型和形状的数据进行某种全局运算(如求和、最大值、最小值、乘积等),并将运算结果广播回所有进程。
操作

  1. 每个进程拥有一个相同类型和形状的数据元素。
  2. 通过高效的通信算法(如树形Reduce、环形Reduce、层级Reduce等),进程间按照指定的运算规则逐步聚合数据。
  3. 经过多轮通信和局部运算,每个进程最终得到全局运算的结果。
    结果:所有进程都拥有经过全局运算后得到的同一份结果数据。
    应用场景
  • 在分布式训练中,计算全局的梯度平均值,用于参数更新。
  • 在并行计算中,求解全局的最大值、最小值、累计值等统计量。

总结

  • all-gather 的目的是将所有进程的独立数据片段合并成一份完整的数据集,每个进程最终拥有全部数据。
  • all-reduce 的目的是对所有进程的相同数据进行全局运算,每个进程最终拥有运算后的同一份结果数据。

两者都是为了实现分布式环境下的数据聚合,但前者侧重于数据的收集与复制,后者侧重于数据的并行运算与结果广播。在实际应用中,根据任务需求选择合适的通信原语可以有效提升并行计算的效率和可扩展性。这些通信原语构成了分布式计算中基本的数据交换机制,根据实际应用需求的不同,可以单独或组合使用这些原语来构建高效的并行算法和分布式系统。