10.7 集合通信
前面几节讨论了数据并行、张量并行、流水线并行等策略如何将训练任务切分到多个设备上,但这些策略的高效运作都依赖于一个共同的底层基础设施——集合通信(Collective Communication)。无论是数据并行中的梯度同步,还是张量并行中的部分和归约,都需要所有参与设备协同完成特定模式的数据交换。集合通信原语的效率直接决定了分布式训练的整体吞吐量,而原语的实现算法、通信库选型和底层硬件互连又构成了层层嵌套的优化空间。本节将从通信原语的语义、实现算法、通信库到硬件互连四个层次,系统地剖析这一关键基础设施。
10.7.1 集合通信原语
集合通信原语是一组预定义的、所有参与设备(通常称为"rank")共同执行的数据交换操作。以下四种原语在大模型训练中使用最为频繁。
Broadcast(广播)。 将一个源设备上的数据完整复制并发送给所有其他设备。典型应用场景是训练启动时将主进程加载的模型参数分发到所有 GPU。
操作前 操作后(Root = Rank 0)
Rank 0: [A B C D] Rank 0: [A B C D]
Rank 1: [. . . .] ──► Rank 1: [A B C D]
Rank 2: [. . . .] Rank 2: [A B C D]
Rank 3: [. . . .] Rank 3: [A B C D]AllReduce(全局规约)。 从所有设备收集数据,执行指定的规约操作(通常是求和),然后将结果写回每一个设备。AllReduce 是数据并行梯度同步的核心:各 GPU 完成本地反向传播后,通过 AllReduce 对梯度求和取平均,保证每张卡持有相同的全局梯度。
操作前 操作后(op = SUM)
Rank 0: [a0 b0 c0 d0] Rank 0: [Σa Σb Σc Σd]
Rank 1: [a1 b1 c1 d1] ──► Rank 1: [Σa Σb Σc Σd]
Rank 2: [a2 b2 c2 d2] Rank 2: [Σa Σb Σc Σd]
Rank 3: [a3 b3 c3 d3] Rank 3: [Σa Σb Σc Σd]
其中 Σx = x0 + x1 + x2 + x3ReduceScatter(规约分散)。 所有设备的数据先执行规约(如求和),然后将规约后的结果向量切分为等大的分片,每个设备仅保留其中一个分片。ReduceScatter 是 ZeRO Stage 2 和 FSDP 反向传播中梯度同步的关键操作——每张卡只需要获得自己负责的那部分梯度的全局归约结果。
操作前 操作后(op = SUM,结果按 rank 分片)
Rank 0: [a0 b0 c0 d0] Rank 0: [Σa]
Rank 1: [a1 b1 c1 d1] ──► Rank 1: [Σb]
Rank 2: [a2 b2 c2 d2] Rank 2: [Σc]
Rank 3: [a3 b3 c3 d3] Rank 3: [Σd]AllGather(全局收集)。 每个设备持有数据的一个分片,AllGather 将所有分片收集拼接后写回每一个设备,使所有设备都获得完整数据。AllGather 是 ZeRO Stage 3 和 FSDP 前向传播中按需重建完整参数的核心操作。
操作前 操作后
Rank 0: [A] Rank 0: [A B C D]
Rank 1: [B] ──► Rank 1: [A B C D]
Rank 2: [C] Rank 2: [A B C D]
Rank 3: [D] Rank 3: [A B C D]关键恒等式。 上述原语之间存在一个极其重要的数学等价关系:
这意味着一次 AllReduce 可以被分解为先 ReduceScatter 再 AllGather,且总通信量保持不变。这个等价关系是 ZeRO 和 FSDP 的理论基石:将 AllReduce 拆开后,可以在两步通信之间插入本地计算(如优化器状态更新),在不增加通信开销的前提下实现显存状态的分片存储。Megatron 序列并行同样利用了这一拆分——将原本捆绑在一起的 AllReduce 拆为 ReduceScatter(TP 出口)和 AllGather(TP 入口),在中间插入序列分片的逐点计算。
10.7.2 集合通信算法
通信原语定义了"做什么",通信算法则决定了"怎么做"。不同的算法在不同的网络拓扑和数据规模下表现差异显著。
朴素算法与参数服务器。 最直观的 AllReduce 实现是中心化的参数服务器(Parameter Server, PS)架构:所有 Worker 将梯度发送给一个中心节点,中心节点求和后再广播回去。PS 架构的通信瓶颈集中在中心节点——它需要收发
环形算法(Ring AllReduce)。 将
阶段一:Scatter-Reduce。 每个设备将本地数据等分为
阶段二:AllGather。 再经过
Ring AllReduce 示意(4 个设备,数据分为 4 块)
┌──────┐
┌────►│Rank 1│────┐
│ └──────┘ │
│ ▼
┌──────┐ ┌──────┐
│Rank 0│ │Rank 2│
└──────┘ └──────┘
▲ │
│ ┌──────┐ │
└─────│Rank 3│◄───┘
└──────┘
Scatter-Reduce 阶段(3 步):
Step 1: Rank k 发送 chunk[k] 给 Rank (k+1)%4
Step 2: Rank k 发送 chunk[k-1] 给 Rank (k+1)%4 (已部分归约)
Step 3: Rank k 发送 chunk[k-2] 给 Rank (k+1)%4 (完全归约)
AllGather 阶段(3 步):
各设备沿环传递已归约的 chunk,3 步后人人持有全部 4 个归约后的 chunk通信量分析。 设总数据量为
当
环形算法的局限在于延迟。总共需要
树形算法(Tree AllReduce)。 将设备组织为二叉树或多叉树结构。Reduce 阶段数据从叶节点逐层向上归约到根节点,Broadcast 阶段结果从根节点向下广播。树形算法的步数为
流水线化算法(Pipelined/Chunked Algorithm)。 将大消息切分为多个小块(chunk),在树形或其他拓扑上以流水线方式依次传输。第一个 chunk 开始在上层链路传输时,第二个 chunk 已经可以在下层链路上启动传输,从而在保持树形低延迟优势的同时逼近环形算法的带宽利用率。NCCL 中的 Tree 算法实际上就采用了这种流水线化双二叉树(double binary tree)的实现策略。
下表对比三种算法的核心特征:
| 特征 | 环形算法(Ring) | 树形算法(Tree) | 流水线化树形(Pipelined Tree) |
|---|---|---|---|
| 每设备发送量 | |||
| 传输步数(延迟) | |||
| 带宽利用率 | 最优 | 较低(根部瓶颈) | 接近最优 |
| 适用场景 | 大消息、中等规模 | 小消息、超大规模 | 通用,大规模大消息 |
表 10-3:集合通信算法对比。
在实际的通信库中,算法选择通常是自动化的:库会根据消息大小、设备数量和网络拓扑动态切换最优算法。
10.7.3 通信库:NCCL、HCCL 与 XCCL
通信原语和算法的高效执行需要依赖底层通信库。这些库封装了硬件细节,向上层并行框架(如 PyTorch、Megatron-LM)提供统一的 API。
NCCL(NVIDIA Collective Communications Library)。 NVIDIA 开发的 GPU 集合通信库,是当前 NVIDIA GPU 集群上事实上的标准。NCCL 针对 NVIDIA 的硬件栈进行了深度优化,包括:利用 NVLink/NVSwitch 实现节点内 GPU 间的高带宽直接通信;通过 GPUDirect RDMA 技术让 GPU 直接读写远端 GPU 的显存而无需 CPU 参与;自动检测拓扑并选择最优通信算法(Ring、Tree 或二者的混合)。NCCL 支持所有主流集合通信原语(AllReduce、AllGather、ReduceScatter、Broadcast、Reduce、AlltoAll 等),并可通过 CUDA Stream 实现通信与计算的重叠。PyTorch 的 torch.distributed 后端默认使用 NCCL。
HCCL(Huawei Collective Communication Library)。 华为为其昇腾(Ascend)NPU 开发的集合通信库,在 Ascend 生态中扮演与 NCCL 对等的角色。HCCL 针对昇腾芯片间的 HCCS(Huawei Cache Coherent System)互连和 RoCE(RDMA over Converged Ethernet)网络进行了优化。它对接 MindSpore 框架的分布式通信后端,同时也支持通过 PyTorch 的 Ascend 适配层使用。
XCCL(统一通信库抽象)。 随着 AI 加速器的多元化(NVIDIA GPU、AMD GPU、华为 Ascend、Google TPU 等),业界出现了统一通信接口的需求。Intel 的 oneCCL、百度的 BCCL 等都在向跨平台方向发展。PyTorch 通过 ProcessGroup 抽象层将具体的通信库封装在统一接口之下,使得上层并行代码可以在不同硬件后端之间切换而无需修改。
下表对比三类通信库的关键差异:
| 维度 | NCCL | HCCL | oneCCL/BCCL 等 |
|---|---|---|---|
| 目标硬件 | NVIDIA GPU | 华为 Ascend NPU | Intel GPU / 多平台 |
| 节点内互连 | NVLink / NVSwitch | HCCS | Xe Link / 厂商互连 |
| 节点间网络 | InfiniBand / RoCE | RoCE | 以太网 / InfiniBand |
| GPU 直通 | GPUDirect RDMA | HCCS RDMA | 视硬件支持 |
| 框架集成 | PyTorch(默认)/ JAX / DeepSpeed | MindSpore / PyTorch-Ascend | PyTorch / oneAPI |
| 算法选择 | Ring / Tree / 自动混合 | Ring / Recursive Halving-Doubling | 多种,视实现 |
表 10-4:主流集合通信库对比。
10.7.4 硬件互连:Scale-up 与 Scale-out
通信库的性能最终受限于底层硬件互连的带宽和延迟。分布式训练的网络拓扑天然分为两个层次:节点内(Scale-up) 和 节点间(Scale-out),二者在带宽上通常存在一到两个数量级的差距,这种差距深刻影响了并行策略的设计。
NVLink 与 NVSwitch(Scale-up)。 NVLink 是 NVIDIA 专为 GPU 间高速通信设计的点对点互连技术。以 H100 为例,单块 GPU 的 NVLink 带宽可达 900 GB/s(双向),远超 PCIe Gen5 的 128 GB/s。在配备 NVSwitch 的 DGX 系统中,节点内 8 块 GPU 通过 NVSwitch 实现全互连——任意两块 GPU 之间都可以以 NVLink 的满带宽直接通信,无需经过 CPU 或 PCIe 总线。这种"交换式全连接"拓扑使得节点内的集合通信(如张量并行所需的 AllReduce)几乎不会成为性能瓶颈。最新的 GB200 NVL72 架构更是将 72 块 GPU 通过第五代 NVSwitch 连接在一个统一的高带宽域中,单 GPU 的 NVLink 带宽提升至 1800 GB/s(NVIDIA Blackwell Architecture Whitepaper, 2024)。
InfiniBand 与 RoCE(Scale-out)。 跨节点通信主要依赖 InfiniBand(IB)或 RDMA over Converged Ethernet(RoCE)网络。当前主流的 InfiniBand HDR 提供每端口 200 Gb/s(25 GB/s)的带宽,NDR 提升至 400 Gb/s(50 GB/s)。即使采用多轨(multi-rail)配置(如每节点 8 个 IB 网卡,每块 GPU 绑定一个网卡),节点间的聚合带宽(约 400 GB/s)仍远低于节点内 NVLink 的带宽(约 900 GB/s × 8 = 7.2 TB/s 的二分带宽)。InfiniBand 的核心优势是支持 RDMA(Remote Direct Memory Access),允许设备直接读写远端内存而绕过 CPU 协议栈,显著降低了通信延迟。结合 GPUDirect RDMA,GPU 可以直接通过 IB 网卡访问远端 GPU 的显存,避免了 GPU → CPU 内存 → 网卡的多次数据拷贝。
Scale-up 与 Scale-out 的关键差异。 下表汇总了两种互连层次的核心对比:
| 特征 | Scale-up(节点内) | Scale-out(节点间) |
|---|---|---|
| 典型技术 | NVLink + NVSwitch | InfiniBand / RoCE |
| 单链路带宽(H100) | 900 GB/s(NVLink,双向) | 50 GB/s(IB NDR,双向) |
| 拓扑 | 全连接(NVSwitch) | 胖树(Fat-Tree)/ Clos |
| 延迟 | 亚微秒级 | 微秒级 |
| 带宽/延迟比 | 极高 | 中等 |
| 适合的并行策略 | 张量并行(TP)、序列并行(SP) | 数据并行(DP)、流水线并行(PP) |
| 规模上限 | 8 GPU(DGX)/ 72 GPU(GB200 NVL72) | 数万 GPU |
| 成本特征 | 硬件昂贵、密度高 | 网络交换机层数决定成本 |
表 10-5:Scale-up 与 Scale-out 互连对比。
对并行策略的约束。 这种带宽的层级差异直接决定了并行策略的部署层次。通信密集型的张量并行(每层至少两次 AllReduce)必须限制在 NVLink 域内;流水线并行仅在阶段边界传递激活值,通信量相对较小,适合部署在节点间;数据并行的梯度同步虽然数据量大,但可以通过梯度分桶和计算通信重叠来隐藏延迟,因此也适合跨节点部署。典型的 3D 并行配置为:节点内 8 路 TP,跨节点 PP 串联多个阶段,最外层 DP 复制多份流水线。
胖树拓扑与带宽收敛比。 大规模 GPU 集群的节点间网络通常采用胖树(Fat-Tree)或 Clos 拓扑。理想的全二分带宽胖树保证任意两组节点之间都有等量带宽,但交换机成本极高。实际部署中常采用一定的带宽收敛比(oversubscription ratio),如 2:1 或 4:1——叶层交换机到脊层交换机的带宽低于接入层的聚合带宽。这意味着同一机架内的节点间通信带宽通常优于跨机架通信,训练框架需要感知这种拓扑层次来优化通信路径。NCCL 在初始化时会自动探测拓扑结构,并据此构建最优的通信环或树。
本节小结
集合通信是分布式训练的"血液循环系统",从上到下由四个层次构成:
- 通信原语定义了语义:AllReduce 保证全局一致、ReduceScatter + AllGather 实现分片存储与按需重建、Broadcast 完成初始化分发。理解 AllReduce = ReduceScatter + AllGather 这一等价关系,是理解 ZeRO、FSDP 和序列并行设计思路的钥匙。
- 通信算法决定了效率:环形算法以
延迟换取最优带宽利用率(每设备通信量 ,与设备数无关),树形算法以 延迟在小消息场景下占优,流水线化树形兼顾二者。 - 通信库(NCCL、HCCL 等)封装了硬件差异,自动选择算法,提供与框架对接的标准化接口。
- 硬件互连决定了性能天花板:节点内 NVLink 提供亚微秒延迟和 900+ GB/s 带宽,节点间 InfiniBand 提供微秒延迟和 50 GB/s 带宽,这一到两个数量级的带宽落差是并行策略分层部署(TP 在内、PP/DP 在外)的根本原因。
对于系统工程师而言,优化分布式训练性能的核心工作往往就是:选择正确的通信原语,将通信密集的操作约束在高带宽域内,并通过计算通信重叠尽可能隐藏剩余的通信延迟。