📚 核心集合通信操作
以下是分布式训练中最常见和核心的集合通信操作,它们构成了大多数并行策略的基础。
| 操作名称 | 通信模式 | 一句话说明 |
|---|---|---|
| Broadcast | 一对多 | 将一个节点的数据复制到所有其他节点。 |
| Scatter | 一对多 | 将一个节点的数据分片后分发到各个节点。 |
| Gather | 多对一 | 将各个节点的数据收集到一个节点上。 |
| Reduce | 多对一 | 将各个节点的数据进行归约(如求和),结果只发给一个节点。 |
| All-Reduce | 多对多 | 对所有节点的数据进行归约,并将结果分发给所有节点。 |
| All-Gather | 多对多 | 收集所有节点的数据,并将完整结果分发给所有节点。 |
| Reduce-Scatter | 多对多 | 先归约,再将结果分片散射到各个节点。 |
| All-to-All | 多对多 | 每个节点都向其他所有节点发送不同的数据,实现全交换。 |
| Barrier | 同步 | 同步所有节点,不传输数据,仅用于等待。 |
不同库中的操作列表
不同通信库支持的操作集略有不同,以下是几个主流库的列表:
MPI (Message Passing Interface):作为经典标准,MPI 定义了一套非常完整的集合操作,除了上述核心操作外,还包括Scan(前缀扫描)、Alltoallv(可变数据量的全交换)以及众多操作的变体(如
Gatherv,Allgatherv等)。NCCL (NVIDIA Collective Communications Library):NCCL 针对 GPU 间通信进行了优化,其官方文档列出的核心操作包括AllReduce、Broadcast、Reduce、AllGather、ReduceScatter、AlltoAll、Gather、Scatter等。
PyTorch (torch.distributed):PyTorch 的分布式包提供了与 MPI/NCCL 类似的集合通信 API,包括
all_reduce、broadcast、gather、scatter、all_gather、reduce_scatter、all_to_all和barrier等。HCCL (Huawei Collective Communication Library):作为昇腾 AI 处理器上的通信库,HCCL 同样支持AllReduce、Broadcast、AllGather、ReduceScatter、AlltoAllV等核心操作,其接口命名与 NCCL 类似。
下面用4 个进程/GPU(rank 0~3)举例,默认根节点为 rank 0。数据用符号或简单数字表示,便于看清输入输出。集合通信都发生在同一个通信域内,底层通常由点对点send/recv实现。
1. Broadcast:一对多,广播
例子:
rank 0 有数据[1, 2, 3],其他 rank 为空。
Broadcast 后:
rank 0:
[1, 2, 3]rank 1:
[1, 2, 3]rank 2:
[1, 2, 3]rank 3:
[1, 2, 3]
原理:
根节点把同一份完整数据复制给所有节点。实现上常用树形广播:根先发给几个中间节点,中间节点再继续转发,复杂度约O(log N)步;也有链式广播。
用途:
初始化模型参数、同步超参数、广播配置。
2. Scatter:一对多,散射
例子:
rank 0 有[A, B, C, D],其他 rank 为空。
Scatter 后:
rank 0:
Arank 1:
Brank 2:
Crank 3:
D
原理:
根节点把数据切成若干片,每个 rank 收到不同的一片。可以看成 Broadcast 的“分片版”:Broadcast 是所有节点收到相同完整数据,Scatter 是每个节点收到不同分片。
用途:
数据并行中把一个大 batch 切分给不同 GPU;分发任务。
3. Gather:多对一,收集
例子:
各 rank 分别有:
rank 0:
Arank 1:
Brank 2:
Crank 3:
D
Gather 到 rank 0 后:
rank 0:
[A, B, C, D]其他 rank:无结果或空
原理:
所有非根节点把自己的数据发给根节点,根节点按 rank 顺序拼接。它是 Scatter 的逆操作。
用途:
收集各 GPU 的预测结果、指标、梯度分片。
4. Reduce:多对一,归约
例子:
各 rank 有数值:
rank 0:
1rank 1:
2rank 2:
3rank 3:
4
执行Reduce(sum)到 rank 0 后:
rank 0:
10其他 rank:无结果
原理:
所有节点把数据发给根节点,根节点按指定操作(sum、max、min、prod 等)进行归约。Reduce 可以看成 Gather + 本地计算,但实现上通常边收边算,减少内存。
用途:
参数服务器中汇总梯度、汇总 loss、统计最大值等。
5. All-Reduce:多对多,全归约
例子:
各 rank 有数值:
rank 0:
1rank 1:
2rank 2:
3rank 3:
4
执行All-Reduce(sum)后:
rank 0:
10rank 1:
10rank 2:
10rank 3:
10
原理:
先对所有节点的数据做归约,再把结果分发给所有节点。经典实现是Ring All-Reduce:
Reduce-Scatter 阶段:每个节点只负责一部分归约结果,沿环传递并累加。
All-Gather 阶段:把各节点负责的归约分片沿环传播,最终所有节点拥有完整结果。
所以常写作:All-Reduce = Reduce-Scatter + All-Gather
用途:
数据并行训练中最核心的操作,用于梯度求和/平均。
6. All-Gather:多对多,全收集
例子:
各 rank 分别有:
rank 0:
Arank 1:
Brank 2:
Crank 3:
D
All-Gather 后:
rank 0:
[A, B, C, D]rank 1:
[A, B, C, D]rank 2:
[A, B, C, D]rank 3:
[A, B, C, D]
原理:
每个节点把自己的数据发给所有其他节点,同时接收所有其他节点的数据。可以看成 Gather 的结果广播给所有人,或者每个节点都执行一次“收集”。
用途:
张量并行中拼接分片参数;MoE 中收集 token;ZeRO 中收集分片参数。
7. Reduce-Scatter:多对多,归约后散射
例子:
每个 rank 有一个长度为 4 的向量:
rank 0:
[1, 2, 3, 4]rank 1:
[10, 20, 30, 40]rank 2:
[100, 200, 300, 400]rank 3:
[1000, 2000, 3000, 4000]
按元素求和得到:[1111, 2222, 3333, 4444]
Reduce-Scatter 后,每个 rank 得到结果的一个分片:
rank 0:
1111rank 1:
2222rank 2:
3333rank 3:
4444
原理:
先对所有节点的数据做按元素归约,然后把归约结果切成world_size份,每个 rank 只保留自己那一份。它是 All-Reduce 的前半段。
用途:
ZeRO 优化器中梯度分片归约;All-Reduce 的内部阶段。
8. All-to-All:多对多,全交换
例子:
每个 rank 有一个数组,第j个元素是发给 rankj的:
rank 0:
[A0, A1, A2, A3]rank 1:
[B0, B1, B2, B3]rank 2:
[C0, C1, C2, C3]rank 3:
[D0, D1, D2, D3]
All-to-All 后:
rank 0 收到:
[A0, B0, C0, D0]rank 1 收到:
[A1, B1, C1, D1]rank 2 收到:
[A2, B2, C2, D2]rank 3 收到:
[A3, B3, C3, D3]
原理:
每个节点把数据切成world_size份,分别发给对应 rank;同时接收来自所有 rank 的对应分片。可以理解为把通信矩阵转置。
用途:
MoE 专家并行中把 token 发给不同专家;序列并行中交换分片;分布式转置。
9. Barrier:同步屏障
例子:
rank 0 很快算完,rank 3 很慢。
Barrier 后,所有 rank 必须都到达屏障点,才能继续往下执行。
原理:
不传输业务数据,只做同步。每个 rank 到达后增加计数器,等待所有 rank 都到达,然后一起释放。
用途:
调试、性能测量、确保资源初始化完成、阶段同步。
组合关系与总结
| 操作 | 模式 | 输入输出特点 | 常见实现/关系 |
|---|---|---|---|
| Broadcast | 一对多 | 根有完整数据,所有人得到完整数据 | 树形、链式 |
| Scatter | 一对多 | 根有完整数据,每人得到不同分片 | 树形分发 |
| Gather | 多对一 | 每人有分片,根得到完整拼接 | Scatter 逆操作 |
| Reduce | 多对一 | 每人有数据,根得到归约结果 | Gather + 归约 |
| All-Reduce | 多对多 | 所有人得到归约结果 | Reduce-Scatter + All-Gather |
| All-Gather | 多对多 | 所有人得到所有分片拼接 | 环、递归加倍 |
| Reduce-Scatter | 多对多 | 先归约,再每人得到结果分片 | All-Reduce 前半 |
| All-to-All | 多对多 | 每人向所有人发不同分片 | 矩阵转置式通信 |
| Barrier | 同步 | 无数据,仅等待 | 计数器/握手 |