2. NCCL核心概念与通信原语
NCCL 的调优工作,本质上是在理解“数据在哪些 GPU 之间、以什么语义、沿什么路径流动”的基础上,去调整拓扑、算法、通道与协议。因此,在动手改环境变量之前,必须先把六种核心通信原语的语义、输入输出形状和典型用途弄清楚。本节围绕这些原语展开,并给出一个可直接对照的语义速查表。
一、先建立两个共同前提:rank 与数据切分
NCCL 中每个参与通信的 GPU 对应一个 rank,从 0 开始编号,一组共同通信的 rank 构成一个 communicator(通信域)。所有集合通信原语都定义在某个通信域内,语义描述的是“每个 rank 提供什么、最终每个 rank 得到什么”。
另一个前提是数据切分。以最常见的 ncclSum 为例,若通信域有 N 个 rank,每个 rank 持有一个长度为 L 的缓冲区,集合通信会把缓冲区按元素切成 N 段(chunk),第 i 段由 rank i 负责“贡献”或“接收”。理解这一点,才能看懂 AllReduce 与 ReduceScatter 的区别:前者每个 rank 拿到完整结果,后者每个 rank 只拿到属于自己的那一段。
二、六种原语的语义
AllReduce:所有 rank 提供等长输入,按元素做归约(sum/max/min/prod 等),结果广播给所有 rank。即“人人出数据,人人得全量结果”。它是数据并行训练中梯度同步的核心操作。
Broadcast:root rank 把自己的缓冲区发给所有其他 rank,其他 rank 的输入被覆盖。语义是“一对多、单向、无归约”。常用于把初始权重、超参或 tokenizer 配置从 rank 0 分发到全部 GPU。
Reduce:所有 rank 提供输入,归约结果只写到 root rank,其他 rank 不保留结果。语义是“多对一”。典型用途是把各 rank 的统计量(如 loss、样本数)汇总到 rank 0 做日志或指标计算。
AllGather:每个 rank 提供一段数据,通信后每个 rank 都拥有所有 rank 的数据拼接结果。语义是“人人出一段,人人得全量”。常用于张量并行中把分片激活拼回完整张量,或收集各 rank 的元信息。
ReduceScatter:所有 rank 提供等长输入并归约,但每个 rank 只保留归约结果中属于自己的那一段。语义是“人人出全量,人人得一段”。它是 ZeRO、FSDP 等分片优化器的关键原语,也是 AllReduce 的 Ring 实现中的中间阶段。
Send/Recv:点对点通信,一个 rank 发送、另一个 rank 接收,不涉及归约,也不要求通信域内所有 rank 参与。常用于流水线并行中相邻 stage 之间传递激活与梯度,或自定义通信模式。
三、语义关系与组合
这些原语并非彼此孤立。最经典的关系是:AllReduce = ReduceScatter + AllGather。Ring AllReduce 正是先做一轮 ReduceScatter 把各段部分和归约到对应 rank,再做一轮 AllGather 把完整结果扩散出去。理解这个分解,就能理解为什么 NCCL 在 Ring 与 Tree 算法之间切换时,性能特征会随消息大小和 rank 数变化。
另一个关系是 Broadcast 与 AllGather 的对比:Broadcast 是“一个源、全量复制”,AllGather 是“每个 rank 都是源、各出一段”。当只有 rank 0 有数据时用 Broadcast;当每个 rank 都有独立分片需要共享时用 AllGather。
下图给出六种原语在同一通信域(4 个 rank)下的数据流与结果归属关系,可作为语义对照参考。
四、典型用途与调优关注点
在数据并行训练中,每步反向传播后执行一次 AllReduce 同步梯度,这是最常被观测的通信热点。当模型参数量大、rank 数多时,AllReduce 的耗时可能接近甚至超过计算耗时,此时需要关注 NCCL 选择的算法(Ring/Tree)、通道数(NCCL_MIN_NCHANNELS)以及是否启用了 NVLink 或 InfiniBand 的相应传输路径。
在 ZeRO-3 或 FSDP 中,梯度以 ReduceScatter 归约到各 rank 的分片,参数更新后再用 AllGather 把更新后的参数分片拼回。这类负载的通信模式与纯 AllReduce 不同:ReduceScatter 与 AllGather 交替出现,且消息大小随分片策略变化,调优时要分别观察两个阶段的带宽利用率。
张量并行(如 Megatron-LM)中,前向的列并行层后接 AllGather 或 AllReduce,行并行层后接 AllReduce;流水线并行则依赖 Send/Recv 在相邻 stage 间传递激活。这些场景下,通信原语的选择直接决定了并行策略的可行性与扩展效率。
五、语义速查表
| 原语 | 输入 | 输出 | 归约 | 典型用途 |
|---|---|---|---|---|
| AllReduce | 每 rank 全量 | 每 rank 全量结果 | 是 | 数据并行梯度同步 |
| Broadcast | 仅 root 有数据 | 所有 rank 全量 | 否 | 初始权重/配置分发 |
| Reduce | 每 rank 全量 | 仅 root 得结果 | 是 | 汇总统计量到 rank0 |
| AllGather | 每 rank 一段 | 每 rank 全量拼接 | 否 | 张量并行拼接分片 |
| ReduceScatter | 每 rank 全量 | 每 rank 得一段 | 是 | ZeRO/FSDP 分片归约 |
| Send/Recv | 单 rank 数据 | 单 rank 接收 | 否 | 流水线并行 stage 间传递 |