分布式训练
第2章:集合通信原语
分布式训练的物理地基——AllReduce/ReduceScatter/AllGather/All-to-All 等集合通信操作的语义、Ring 算法原理与通信量量化分析
集合通信 AllReduce Ring AllReduce NCCL 通信量分析
📖 本章概述
所有并行策略最终都落到一件事上:多张卡之间如何高效交换数据。AllReduce、ReduceScatter、AllGather 这些名词会在后续每一章反复出现——DDP 靠 AllReduce 同步梯度、ZeRO-2 用 ReduceScatter、TP 用 AllReduce、MoE 用 All-to-All。本章把这套”通信字母表”一次讲清,并给出通信量的量化方法,这样后续分析任何策略的通信代价时都能自己算出来。
本章是理解后续所有并行策略通信代价的前置知识。建议读完能默写出每个原语的”输入 → 输出”语义图。
📑 章节结构
1. 为什么要单独讲通信原语
- 并行策略的本质 = 切分 + 通信,切分决定显存、通信决定速度
- 一张”通信操作 vs 并行策略”的对照表(先给全景,后续逐个展开)
- 通信发生在哪:NVLink(机内)vs InfiniBand/RoCE(机间)vs PCIe,带宽差一个数量级
2. 点对点通信(Point-to-Point)
send/recv:最基础的两进程通信,PP 的 Stage 间传激活值就靠它- 同步 vs 异步(
isend/irecv)与死锁风险
3. 集合通信原语详解
逐个给出”输入 → 输出”语义图 + 典型用途:
- Broadcast:一个 rank 的数据复制到所有 rank(如初始化时同步参数)
- Scatter / Gather:分发 / 收集(DP 老方案、数据切分)
- Reduce:所有 rank 的数据规约(求和/求最大)到一个 rank
- AllReduce:规约结果广播到所有 rank(DDP 梯度同步、TP 输出合并)—— 本章重点
- ReduceScatter:规约后每个 rank 只拿自己负责的分片(ZeRO-2/3、FSDP 反向)
- AllGather:每个 rank 的分片拼成完整数据广播给所有 rank(ZeRO-3 前向、FSDP 重组参数)
- All-to-All:每个 rank 给每个 rank 发不同数据(MoE Expert Parallel、Ulysses 序列并行)
- 关键恒等式:
AllReduce = ReduceScatter + AllGather(贯穿 ZeRO/SP 的核心)
4. Ring AllReduce 算法原理(本章重点)
- 朴素 AllReduce 的问题:中心节点带宽瓶颈
- Ring 算法两阶段:Reduce-Scatter 阶段 + AllGather 阶段
- 通信量推导:每卡收发 (与卡数无关,这就是 Ring 的精髓)
- 带宽最优性:为什么 Ring 在大数据量下接近带宽上限
- 其他拓扑简介:Tree AllReduce(小数据低延迟)、Double Binary Tree、NCCL 的自动选择
5. 通信量的量化方法
- 统一记号:参数量 、batch 、序列 、隐藏维
- 三类通信量公式:AllReduce 、ReduceScatter / AllGather 各 、All-to-All
- 通信时间估算:(延迟项 + 带宽项)
- 计算/通信重叠(overlap)的基本原理:为什么能”算的同时传”
6. 动手实验
- 用
torch.distributed跑通 7 个集合通信原语,打印各 rank 的输入输出验证语义 - 用
NCCL_DEBUG=INFO观察 NCCL 选择了哪种算法 - 测量不同数据量下 AllReduce 的实测带宽,对比 NVLink 与 PCIe
🎯 本章学习目标
- 能画出 7 个集合通信原语的”输入 → 输出”语义图
- 能推导 Ring AllReduce 每卡通信量为 且与卡数无关
- 能默写恒等式 并解释它在 ZeRO 中的意义
- 能用 估算一次通信的耗时