NCCL
NCCL(NVIDIA Collective Communications Library)是 NVIDIA GPU 集体通信的事实标准执行层。它把一组 rank 的通信组织成 AllReduce、AllGather、ReduceScatter、Broadcast 和 Send/Recv 等操作,也因此成为性能、确定性和故障传播的共同边界。
是什么
NCCL 根据 GPU、NVLink、PCIe、NIC 和网络拓扑选择 ring/tree/channel,并在 GPU memory 上直接执行集体通信。上层训练或推理框架只提交 collective,NCCL 管理 communicator、rank membership、连接和数据移动。
论文中 NCCL 常扮演四种角色:
- 默认的成熟 collective baseline;
- 可插入
libnccl-net.so等网络 plugin 的上层 API; - 需要与计算重叠、分块或替换的粗粒度执行单元;
- 成员固定、任一 rank 慢/失败都可拖住整组的同步与故障单元。
因此“NCCL 性能”不是一个常数:消息大小、collective 类型、NCCL 版本、GPU/NIC 拓扑、网络拥塞、channel 数和是否有并发计算都会改变结果。
关键观察 / 隐含假设
- 成熟 collective 不等于最佳的细粒度重叠。 Syncopate-OSDI26 指出,先把计算切成多个 kernel,再在另一 CUDA stream 上放 NCCL,会引入 launch/sync 开销、不完整 tile wave 和最后一段无法遮住的通信尾巴。它在单机 4/8 张 H100 的 operator 上通过 chunk/tile 级 lowering 解决,尚未证明跨机完整模型也有同样收益。
- collective library 与 transport policy 可分开。 UCCL-Tran-OSDI26 作为
libnccl-net.so插在 NCCL/RCCL 与 NIC 之间,应用仍调用 NCCL,payload 仍经 GPUDirect DMA,但拥塞控制、多路和部分可靠性交给 host software。其最高 4.54 倍 all-to-all 带宽改善来自避免跨机架 flow collision;无拥塞同机架时与 ConnectX-7 基本相当。 - MoE token 通信需要的可能不是传统大 buffer collective。 UEP-OSDI26 把 16-byte routing command 交给 CPU proxy,再发细粒度 GPUDirect RDMA,在 NVIDIA/AMD 与多种 NIC 上统一 partial-order 语义。这不是“NCCL 无用”,而是说 dynamic token dispatch 的最佳抽象可与稠密 collective 不同。
- 成员变化是故障恢复的关键路径。 TrainMover-OSDI26 测得 64 张 A100 上完整 NCCL setup 约 50 秒,其中连接建立占 76.45%;它用两阶段增量修改只切换受影响的 channel。这需直接修改 NCCL/c10d,不是标准 API 已经提供的功能。
- 固定 membership 会阻碍弹性 worker 加入。 RobustRL-OSDI26 在 rollout worker 恢复时不重建一个大 NCCL group,而是用 UCX/RDMA 让 trainer rank 分片直接推权重,已更新 worker 还能当 relay。这个选择换来动态重连,也引入额外的版本和失败语义。
- 逐位重放需锁定 collective 细节。 OpGuard-OSDI26 要固定 NCCL algorithm、protocol、topology、bucketization 和恢复状态,才能将两次 LLM 训练的中间 tensor 逐位对齐;SDCHunter-OSDI26 也要锁定 collective algorithm/channel 和 message order。这些是诊断执行,不等于生产默认模式天然 deterministic。
设计空间与取舍
| 层级 | 代表做法 | 保留的 NCCL 能力 | 额外代价 |
|---|---|---|---|
| collective API | 直接 NCCL | 完整 | 粒度和 membership 由 NCCL 决定 |
| network plugin | UCCL-Tran | 上层 collective 和 GPUDirect data path | 每 active NIC 的 host core、更大 transport 状态面 |
| operator/chunk lowering | Syncopate 类 | 上层 global plan 可保留 | 编译、调优和正确性更复杂 |
| 专用 token/P2P | UEP、UCX/RDMA | 稠密 collective 可继续用 NCCL | 多一套连接、排序和故障语义 |
| communicator 增量修改 | TrainMover | 已有 topology/channel 大部分保留 | 侵入式修改 NCCL/c10d,升级成本高 |
演进时间线
- 2025:Greyhound-ATC25、Mycroft-SOSP25 把 collective timing/hang 当作 fail-slow 和故障诊断信号。
- 2026:fabric-lib-MLSys26 将 NCCL、DeepEP、NVSHMEM、NIXL 等放入统一 GPU 通信接口比较。
- 2026·OSDI:UCCL-Tran-OSDI26 从 NCCL 下方重写 transport control,UEP-OSDI26 为 MoE 重写 token communication,Syncopate-OSDI26 从 NCCL-style kernel 上方重写 compute/communication overlap。
- 2026·OSDI:TrainMover-OSDI26、RobustRL-OSDI26、OpGuard-OSDI26、SDCHunter-OSDI26 分别暴露 membership、弹性、逐位重放和 SDC 诊断边界。
相关概念
相关论文
- UCCL-Tran-OSDI26 — 保留 NCCL API 与 NIC data path,把 transport control 移到 host software。
- UEP-OSDI26 — 为动态 MoE token 通信提供跨 GPU/NIC 的专用抽象。
- Syncopate-OSDI26 — 用 chunk/tile 粒度减少 NCCL-style 粗粒度重叠的结构性浪费。
- TrainMover-OSDI26 — 两阶段增量修改 communicator,只在短切换期停训练。
- RobustRL-OSDI26 — 对动态恢复 worker 绕开 NCCL 固定成员限制。
- RLinf-OSDI26、DynaRL-OSDI26、RollArt-OSDI26、Weave-OSDI26 — 分别按位置选择、重建、使用或跨阶段保留 NCCL communicator,展示动态 RL workflow 中不同的连接生命周期。
- OpGuard-OSDI26、SDCHunter-OSDI26 — 固定 collective 顺序后做训练故障重放与定位。