# NCCL 集合通信算子总结
NCCL(NVIDIA Collective Communications Library)主要提供面向多 GPU / 多机场景的**集合通信(collective communication)**能力,常用
于深度学习训练中的梯度同步、参数分发和结果聚合。
## 1. 核心集合通信算子
| 算子 | 含义 |典型作用 | 数据流特征 |
|---|---|---|---|
| **Broadcast** | 广播 | 将一个 root GPU 上的数据复制到所有 GPU | 一发多收 |
| **Reduce** |归约 | 将所有 GPU 上的数据按某种规约操作汇总到 root GPU | 多发一收 |
| **AllReduce** | 全归约 |先做 Reduce,再将结果分发给所有 GPU | 多发多收 |
| **AllGather** | 全收集 | 每个 GPU 提供一份数据,最终所有 GPU 拿到全部数据拼接结果 | 多发多收,拼接 |
| **ReduceScatter** |归约后分发 |先对所有 GPU 数据做规约,再把结果切分后分给各 GPU | 多发多收,规约+切分 |
| **Scatter** | 分发 | root GPU 将一整块数据切分后分给各 GPU | 一发多收,切分 |
| **Gather** | 汇聚 | 所有 GPU 的数据收集到 root GPU 并拼接 | 多发一收,拼接 |
| **AllToAll** | 全交换 | 每个 GPU 给其他所有 GPU发送不同分片,并接收来自所有 GPU 的分片 | 全互发 |
## 2. 各算子说明
### 2.1 Broadcast
> 把 root rank 上的一份数据复制到通信域中的所有 rank。
- 输入:只有 root 的源数据有效
- 输出:所有 rank 拥有相同数据
- 常见用途:
- 初始化模型参数
- 同步配置、随机种子相关状态
### 2.2 Reduce
> 把所有 rank 上的数据做规约运算,结果只保留在 root rank。
- 支持的规约操作通常包括:
- `sum`
- `prod`
- `max`
- `min`
- `avg`(某些框架层封装提供)
- 常见用途:
-统计全局 loss
- 汇总指标到主卡
### 2.3 AllReduce
> 所有 rank 的数据先规约,再把规约结果返回给每个 rank。
- 最常见的 NCCL 算子之一
- 在数据并行训练中用于:
- 梯度同步
- 参数统计同步
- 等价理解:
- `Reduce + Broadcast`
### 2.4 AllGather
> 每个 rank 提供自己的一段数据,最终所有 rank 收到所有 rank 的数据拼接结果。
- 输入:每个 rank 一份局部数据
- 输出:每个 rank 拿到完整拼接后的全量数据
- 常见用途:
- 收集分片 embedding
- 张量并行中的激活/特征拼接
### 2.5 ReduceScatter
>先对所有 rank 的对应数据做规约,再把结果切片分发给各 rank。
- 等价理解:
- `AllReduce + Scatter`
- 相比直接 AllReduce:
- 通常能减少后续冗余拷贝
- 更适合分片优化场景
- 常见用途:
- ZeRO / 分片优化器
- 张量并行、序列并行中的梯度或激活切分
### 2.6 Scatter
> root rank 将一整块数据分片后发送给所有 rank。
- 输入:root 上完整数据
- 输出:每个 rank 得到自己的那一片
- 常见用途:
- 数据分块下发
- 某些参数分片初始化
### 2.7 Gather
> 各 rank 将本地数据发送到 root rank,由 root 拼接成完整结果。
- 输入:每个 rank 一份局部数据
- 输出:root 上完整拼接数据
- 常见用途:
- 收集局部结果
- 推理或评测时汇总输出
### 2.8 AllToAll
> 每个 rank 都向其他所有 rank 发送不同的数据块,同时从其他所有 rank 接收数据块。
- 通信模式最复杂
- 常见用途:
- Mixture of Experts(MoE)中的 token dispatch
- 张量重排 / 数据重分布
## 3. 常见规约操作(Reduction Ops)
NCCL 的 `Reduce` / `AllReduce` / `ReduceScatter` 等算子通常配合以下规约类型:
|规约类型 | 含义 |例子 |
|---|---|---|
| **sum** | 求和 | 梯度累加 |
| **prod** | 求积 | 较少使用 |
| **max** |取最大值 |统计最大值 |
| **min** |取最小值 |统计最小值 |
| **avg** | 求平均 | 常作为 `sum` 后再除 `world size` 的语义封装 |
## 4.训练场景里的典型对应关系
|训练场景 | 常用 NCCL 算子 |
|---|---|
| 数据并行梯度同步 | **AllReduce** |
| 模型初始化参数同步 | **Broadcast** |
| 分布式指标汇总 | **Reduce / AllReduce** |
| 张量并行结果拼接 | **AllGather** |
| 分片梯度规约 | **ReduceScatter** |
| MoE token 路由 | **AllToAll** |
## 5. 算子之间的关系
| 算子 | 可近似拆解为 |
|---|---|
| **AllReduce** | `Reduce + Broadcast` |
| **ReduceScatter** | `Reduce + Scatter` |
| **AllGather** | `Gather + 广义上的全员可见` |
| **AllToAll** | 更一般化的多对多交换 |
## 6. 一句话理解
- **Broadcast**:一份数据发给所有人
- **Reduce**:所有人的数据汇总到一个人
- **AllReduce**:所有人的数据汇总后,每个人都拿到结果
- **AllGather**:每个人的分片拼成完整数据,所有人都拿到
- **ReduceScatter**:先汇总,再把结果分片给每个人
- **AllToAll**:每个人都和其他所有人交换不同的数据
NCCL 集合通信算子总结