Skip to content

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 + x3

ReduceScatter(规约分散)。 所有设备的数据先执行规约(如求和),然后将规约后的结果向量切分为等大的分片,每个设备仅保留其中一个分片。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(x)AllGather(ReduceScatter(x))

这意味着一次 AllReduce 可以被分解为先 ReduceScatter 再 AllGather,且总通信量保持不变。这个等价关系是 ZeRO 和 FSDP 的理论基石:将 AllReduce 拆开后,可以在两步通信之间插入本地计算(如优化器状态更新),在不增加通信开销的前提下实现显存状态的分片存储。Megatron 序列并行同样利用了这一拆分——将原本捆绑在一起的 AllReduce 拆为 ReduceScatter(TP 出口)和 AllGather(TP 入口),在中间插入序列分片的逐点计算。


10.7.2 集合通信算法

通信原语定义了"做什么",通信算法则决定了"怎么做"。不同的算法在不同的网络拓扑和数据规模下表现差异显著。

朴素算法与参数服务器。 最直观的 AllReduce 实现是中心化的参数服务器(Parameter Server, PS)架构:所有 Worker 将梯度发送给一个中心节点,中心节点求和后再广播回去。PS 架构的通信瓶颈集中在中心节点——它需要收发 O(N) 倍的数据量(N 为 Worker 数量),网络带宽和处理能力都会迅速饱和。

环形算法(Ring AllReduce)。N 个设备排列成逻辑环,是目前最广泛使用的带宽最优算法。整个过程分为两个阶段:

阶段一:Scatter-Reduce。 每个设备将本地数据等分为 N 块。经过 N1 步迭代,每一步中每个设备向环上的下一个邻居发送一个数据块,同时从上一个邻居接收一个数据块并与本地对应块执行规约操作。N1 步结束后,每个设备上恰好有一个数据块包含了所有设备对应块的规约结果。

阶段二:AllGather。 再经过 N1 步迭代,每个设备将自己已经完成规约的数据块沿环传递给下一个邻居,同时接收并存储来自上一个邻居的完整数据块。N1 步结束后,每个设备都持有完整的规约结果。

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

通信量分析。 设总数据量为 M,设备数为 N。在 Scatter-Reduce 阶段,每步每个设备发送 M/N 的数据,共 N1 步,每个设备总发送量为 (N1)M/N;AllGather 阶段完全对称,每个设备同样发送 (N1)M/N。因此,每个设备的总发送量为:

Vsend=2N1NM

N 较大时,Vsend2M,与设备数量 N 无关。这正是环形算法被称为"带宽最优"的原因:无论设备数量如何增加,每个设备的通信量都近似恒定,不会随规模增长而膨胀。相比之下,PS 架构中心节点的通信量为 O(NM),随设备数线性增长。

环形算法的局限在于延迟。总共需要 2(N1) 步串行传输,每步都有固定的启动延迟(latency),因此总延迟为 O(Nα)α 为单次通信延迟)。当 N 较大且数据量较小时,延迟开销会主导通信时间,带宽优势无法发挥。

树形算法(Tree AllReduce)。 将设备组织为二叉树或多叉树结构。Reduce 阶段数据从叶节点逐层向上归约到根节点,Broadcast 阶段结果从根节点向下广播。树形算法的步数为 O(logN),延迟远低于环形算法的 O(N),因此在小消息、大规模集群的场景下更具优势。但其带宽利用率不如环形算法——靠近根节点的链路需要承载更多数据流量,可能成为瓶颈。

流水线化算法(Pipelined/Chunked Algorithm)。 将大消息切分为多个小块(chunk),在树形或其他拓扑上以流水线方式依次传输。第一个 chunk 开始在上层链路传输时,第二个 chunk 已经可以在下层链路上启动传输,从而在保持树形低延迟优势的同时逼近环形算法的带宽利用率。NCCL 中的 Tree 算法实际上就采用了这种流水线化双二叉树(double binary tree)的实现策略。

下表对比三种算法的核心特征:

特征环形算法(Ring)树形算法(Tree)流水线化树形(Pipelined Tree)
每设备发送量2N1NMO(M)2N1NM
传输步数(延迟)2(N1)2logN2logN+pipeline depth
带宽利用率最优较低(根部瓶颈)接近最优
适用场景大消息、中等规模小消息、超大规模通用,大规模大消息

表 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 抽象层将具体的通信库封装在统一接口之下,使得上层并行代码可以在不同硬件后端之间切换而无需修改。

下表对比三类通信库的关键差异:

维度NCCLHCCLoneCCL/BCCL 等
目标硬件NVIDIA GPU华为 Ascend NPUIntel GPU / 多平台
节点内互连NVLink / NVSwitchHCCSXe Link / 厂商互连
节点间网络InfiniBand / RoCERoCE以太网 / InfiniBand
GPU 直通GPUDirect RDMAHCCS RDMA视硬件支持
框架集成PyTorch(默认)/ JAX / DeepSpeedMindSpore / PyTorch-AscendPyTorch / 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 + NVSwitchInfiniBand / 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 和序列并行设计思路的钥匙。
  • 通信算法决定了效率:环形算法以 O(N) 延迟换取最优带宽利用率(每设备通信量 2M,与设备数无关),树形算法以 O(logN) 延迟在小消息场景下占优,流水线化树形兼顾二者。
  • 通信库(NCCL、HCCL 等)封装了硬件差异,自动选择算法,提供与框架对接的标准化接口。
  • 硬件互连决定了性能天花板:节点内 NVLink 提供亚微秒延迟和 900+ GB/s 带宽,节点间 InfiniBand 提供微秒延迟和 50 GB/s 带宽,这一到两个数量级的带宽落差是并行策略分层部署(TP 在内、PP/DP 在外)的根本原因。

对于系统工程师而言,优化分布式训练性能的核心工作往往就是:选择正确的通信原语,将通信密集的操作约束在高带宽域内,并通过计算通信重叠尽可能隐藏剩余的通信延迟。