NVLS 超线速 AllReduce
NVLS(NVLink SHARP)利用 NVSwitch 芯片内置的归约引擎,将 AllReduce 的规约操作从 GPU 软件层下沉到交换芯片硬件,使每个 GPU 只需向交换机发送一次数据、接收一次归约结果,从根本上改变了 AllReduce 的算法复杂度和性能边界。
NVSwitch 的硬件规格和 NVLS 的物理实现细节见 ../02-硬件互联/nvswitch-nvls.md。本文聚焦集合通信算法视角:NVLS 如何改变 AllReduce 的代价模型,以及对建模的影响。
机制原理
传统 Ring AllReduce 的问题
Ring AllReduce 是带宽最优算法(见 all-reduce.md),但其代价结构有两个固有限制:
- 步数随 $N$ 线性增长:$2(N-1)$ 步,每步引入一次点对点延迟 $\alpha$,大规模场景延迟项不可忽视
- 带宽利用率上限 $\frac{N-1}{N}$:每个 GPU 实际需要发送和接收的数据量是 $\frac{2(N-1)}{N}M$,当 $N$ 很大时趋近于 $2M$,即每份数据发送了两次(ReduceScatter 一次 + AllGather 一次)
Ring AllReduce 的带宽项系数 $\frac{2(N-1)}{N}$ 是其理论下界——在 Ring 拓扑上,没有算法能以更少的数据量完成 AllReduce。但这个下界是针对 Ring 拓扑约束下的结论,在具备硬件归约能力的 NVSwitch 拓扑上,约束条件发生了根本改变。
NVLS 如何打破这一限制
NVLS 将规约操作从 GPU 计算单元移入 NVSwitch 芯片内的归约引擎:
- 发送阶段:每个 GPU 将本地数据 $A_i$(大小 $M$)发送给 NVSwitch,NVSwitch 对所有输入流水线执行累加
- 接收阶段:NVSwitch 通过多播将归约结果 $\bigoplus A_i$ 同时分发给所有参与 GPU
整个过程对每个 GPU 而言只有 1 次发送 + 1 次接收,数据不经过任何 GPU 中转。Ring AllReduce 中每个 GPU 既是数据源也是中继节点;NVLS 消除了中继角色,GPU 只扮演数据源和数据接收方。
本质上,NVLS 是将 Reduction 从软件层(Ring 的每个 GPU 做本地规约)下沉到网络硬件层(NVSwitch 芯片内完成全局规约),与 InfiniBand SHARP 的设计哲学相同,但实现在 NVLink 专有硬件上,延迟更低、带宽更高。
与 Ring AllReduce 的带宽对比
代价公式
Ring AllReduce($N$ 个 GPU,消息大小 $M$ 字节,单向链路带宽 $\beta$):
$$\begin{equation} T_{\text{Ring}} = 2(N-1)\alpha + \frac{2(N-1)}{N} \cdot \frac{M}{\beta} \label{eq:nvls-ring-cost} \end{equation}$$NVLS AllReduce($\alpha_{\text{sw}}$ 为 NVSwitch 归约引擎处理延迟,约 100–200 ns):
$$\begin{equation} T_{\text{NVLS}} = 2\alpha_{\text{sw}} + \frac{M}{\beta_{\text{NVLink}}} \label{eq:nvls-cost} \end{equation}$$NVLS 的带宽项系数为 1(相对于 Ring 的 $\frac{2(N-1)}{N} \approx 2$),即在相同链路带宽下,NVLS 的有效吞吐量约为 Ring 的两倍。
算法指标综合对比
| 指标 | Ring AllReduce | NVLS AllReduce |
|---|---|---|
| 每 GPU 发送量 | $\frac{(N-1)}{N}M$(ReduceScatter)+ $\frac{(N-1)}{N}M$(AllGather) | $M$(仅 1 次) |
| 每 GPU 接收量 | $\frac{(N-1)}{N}M$ + $\frac{(N-1)}{N}M$ | $M$(1 次多播) |
| 步数 | $2(N-1)$ | 2(固定,与 $N$ 无关) |
| 延迟项 | $2(N-1)\alpha$(随 $N$ 线性增长) | $2\alpha_{\text{sw}} \approx$ 常数 |
| 带宽利用率 | $\frac{N-1}{N}$(<100%,趋近但不达 100%) | 接近 100%(受链路物理带宽限制) |
| 规模扩展性 | 延迟随 $N$ 增大线性恶化 | 延迟与 $N$ 无关 |
实测数据(H100 NVL72,消息大小 1 GB)
| 算法 | 实测带宽 | 说明 |
|---|---|---|
| Ring AllReduce | ~394 GB/s | 理论上限 $\frac{71}{72} \times 450 \approx 443$ GB/s;实测因软件开销低于理论值 |
| NVLS AllReduce | ~480 GB/s | 超越 Ring 理论上限约 8%;不受 $(N-1)/N$ 系数约束 |
NVLS 的实测带宽超过了 Ring AllReduce 的理论上限,证明其突破的不是工程实现质量,而是算法层面的带宽约束。
适用规模与限制
适用场景
- NVL8:单节点 8 个 GPU 通过 NVSwitch 全连接,NVLS 可用
- NVL72:72 个 H100 + 9 个 NVSwitch 构成单域,NVLS 效果最显著(规模大,Ring 的 $O(N)$ 延迟劣势最明显)
所有参与 GPU 到任意 NVSwitch 都只需 1 跳,是 NVLS 的必要条件——这保证了 NVSwitch 可以收到所有 GPU 的数据并一次性完成归约。
不适用场景
- 多节点跨 InfiniBand/Ethernet:跨节点流量不经过 NVSwitch,无法触发 NVLS 归约引擎。此时 NCCL 自动回退到 Ring AllReduce 或 Double Binary Tree
- 异构拓扑:部分 GPU 在 NVSwitch 域内、部分通过 PCIe 连接,整组通信无法启用 NVLS
原语限制
当前 NVLS 仅支持 AllReduce 原语。ReduceScatter 和 AllGather 的独立 NVLS 加速尚未在 NVSwitch 3.0 上实现,仍需使用 Ring 或 Halving-Doubling 算法。这意味着:
- 张量并行中的 AllReduce(TP 梯度同步)可受益于 NVLS
- Sequence Parallelism 的 AllGather/ReduceScatter 暂时无法使用 NVLS
消息大小阈值:NCCL 2.17+ 在消息 > 256 KB 时自动启用 NVLS;小消息场景(< 64 KB)两种算法的延迟均由软件启动开销主导,差异不显著。
对通信建模的影响
传统 α-β 模型的失效
标准 α-β 模型将 AllReduce 代价建模为:
$$\begin{equation} T = \alpha_{\text{steps}} + \frac{M}{\beta_{\text{eff}}} \label{eq:nvls-alpha-beta-model} \end{equation}$$其中 $\beta_{\text{eff}} = \frac{N}{2(N-1)} \beta_{\text{link}}$(Ring AllReduce 的有效带宽)。
在 NVLS 场景下,带宽项的 $\frac{N}{2(N-1)}$ 系数必须去掉,改为:
$$\begin{equation} \beta_{\text{eff}}^{\text{NVLS}} \approx \beta_{\text{NVLink}} \label{eq:nvls-effective-bw} \end{equation}$$直接使用链路物理带宽,而非受 Ring 约束的有效带宽。若仍套用 Ring 模型,将系统性低估 NVLS 场景的 AllReduce 带宽约 2 倍(大规模时),导致通信时间预测偏保守,模型 MFU 估算偏低。
建模时的区域划分
正确建模策略是区分两类通信域:
| 通信域 | 判断条件 | AllReduce 模型 |
|---|---|---|
| NVLS 域内 | 所有 GPU 在同一 NVSwitch 全连接域,且消息 > 256 KB | $T = 2\alpha_{\text{sw}} + \frac{M}{\beta_{\text{NVLink}}}$ |
| 跨域(Ring 回退) | 多节点、PCIe 连接、或消息过小 | $T = 2(N-1)\alpha + \frac{2(N-1)}{N} \cdot \frac{M}{\beta}$ |
参考资料
- NCCL Documentation: NVLS Algorithm(NVIDIA)
- NVIDIA H100 NVL72 Performance Analysis(NVIDIA Developer Blog)
- In-Network Computing: A Survey(ACM Computing Surveys, 2021)——SHARP/NVLS 等网内计算机制综述
- NVSwitch 3.0 Architecture Brief(NVIDIA, 2022)
- all-reduce.md——Ring/Halving-Doubling/Double Binary Tree 算法详解(本项目文档)