NVLink 与 NVSwitch:机内的 GPU 高速网
GPU 之间走 PCIe 太慢,于是有了另一张网。搞清它的边界在哪,才知道哪些流量会上机间网络。
学完这节你能做到
- 说出各代 NVLink 的单卡带宽与链路数,并把它和 PCIe、机间网络放在同一把尺子上比
- 解释 NVSwitch 让 8 卡全带宽互联的原理,以及 NVL72 把域扩到 72 卡意味着什么
- 用 nvidia-smi 读出 NVLink 状态与吞吐,判断某条链路是否掉了
为什么不能让 GPU 走 PCIe
上一节算过:PCIe Gen5 x16 单向约 63 GB/s。听起来不小,但放到 GPU 之间的通信需求里完全不够看—— 一次张量并行的 all-gather 要在几张卡之间搬几十 GB,PCIe 这个带宽会直接成为墙。
而且还有个结构问题:PCIe 的所有流量都要经过 Root Complex 附近的层级, 8 张卡两两通信时互相抢同一批上游链路。
所以 NVIDIA 干脆给 GPU 之间单独修了一张网,这就是 NVLink。它和 PCIe 是并存关系,不是替代: PCIe 继续负责 CPU ↔ GPU、GPU ↔ 网卡,NVLink 只管 GPU ↔ GPU。
各代规格
| 代际 | 架构 | 单卡总带宽 | 最大链路数 | 每链路 |
|---|---|---|---|---|
| 第 3 代 | Ampere(A100) | 600 GB/s | 12 | 50 GB/s |
| 第 4 代 | Hopper(H100 / H200) | 900 GB/s | 18 | 50 GB/s |
| 第 5 代 | Blackwell(B200 / GB200) | 1,800 GB/s | 18 | 100 GB/s |
| 第 6 代 | Rubin | 3,600 GB/s | 36 | 100 GB/s |
官方规格里 NVLink 一律写双向聚合("900GB/s bidirectional")。而网卡、PCIe 的习惯是 每方向。两把尺子直接比,又是一次 2 倍误差。
换成单向:第 4 代是 450 GB/s、第 5 代 900 GB/s。本节后面的对照表统一用单向。
顺便:第 6 代(Rubin)的数字官方标注为"preliminary specifications, may be subject to change", 做规划时别当承诺值用。
nvidia-smi topo -m 里的 NV18 就是"这两张卡之间有 18 条 NVLink"——
数字对不上预期(比如 H100 上只显示 NV9)就说明有链路没起来。
NVSwitch:从直连到全互联
只有链路还不够。8 张卡如果两两直连,每对之间只能分到总链路数的一部分:
直连 mesh(无 NVSwitch):
18 条链路要分给 7 个邻居 → 每个邻居约 2 条 → 两卡之间只有约 100 GB/s
经 NVSwitch:
18 条链路全部接到交换芯片上
→ 任意两卡之间都能用满 900 GB/s
→ 而且是无阻塞的:所有卡同时全速通信也不掉带宽
这正是 L3 里讲的 Spine-Leaf 思路在机内的翻版:用交换芯片换取任意两点的全带宽。
| NVLink Switch 代际 | GPU 域大小 | 单对 GPU 带宽 | 域内总聚合带宽 |
|---|---|---|---|
| NVLink 4 Switch | 8 | 900 GB/s | 7.2 TB/s |
| NVLink 5 Switch | 8 或 72 | 1,800 GB/s | 130 TB/s(NVL72) |
| NVLink 6 Switch | 8 或 72 | 3,600 GB/s | 260 TB/s(NVL72) |
NVLink 域的边界在哪
这是整节最关键的一个概念。NVLink 域之内是一张网,域之外必须走 IB/RoCE。
┌─────────── NVLink 域(HGX 8 卡基板)───────────┐
│ GPU0 ─┐ │
│ GPU1 ─┤ │
│ ... ├── NVSwitch ── 任意两卡 900 GB/s │
│ GPU7 ─┘ │
└───────────────────┬───────────────────────────┘
│ 每张 GPU 配一张 400G 网卡(PCIe Gen5 x16 直连)
▼
┌──────── 机间网络(IB / RoCE)────────┐
│ leaf → spine → leaf,rail-optimized │
└──────────────────────────────────────┘
传统 HGX 机型的域边界就是一台机器的 8 张卡。GB200 NVL72 把这个边界推到了 72 张卡(用机柜级的 NVLink Switch tray),意味着原本必须跨网络的通信有一大部分回到了 NVLink 域内。
Rail-Optimized 布线账 那节的计算器只算机间网络, 不管机内——现在能说清为什么了:机内通信由 NVLink 承担,压根不经过 leaf 交换机。
所以规划时两笔账要分开:
- 机内:由服务器型号决定(HGX 8 卡 / NVL72),你选不了,只能选机型
- 机间:由你的布线决定,就是 L3 那套 rail / leaf / spine 的账
带宽层级全景
把这一节和上一节、以及机间网络放在同一把尺子上(H100 级节点,单卡视角,单向):
| 层级 | 单向带宽 | 相对倍数 |
|---|---|---|
| HBM3 显存(读写合计) | ≈ 3,350 GB/s | ≈ 53× |
| NVLink 4(域内 GPU ↔ GPU) | 450 GB/s | ≈ 7× |
| PCIe Gen5 x16(GPU ↔ 网卡 / CPU) | 63 GB/s | ≈ 1.3× |
| 机间网络(每 GPU 一张 400G) | 50 GB/s | 1× |
这四行是整个 AI 基础设施性能直觉的来源。三个立刻能推出来的结论:
- 显存带宽比什么都大一个数量级——所以算子融合、减少显存往返比优化通信更基础
- NVLink 比机间网络快约 9 倍——所以通信量最大的并行策略必须留在域内
- PCIe 和机间网络几乎同一量级——所以 400G 网卡配 Gen5 x16 是"刚好匹配", 而不是富余(上一节的账在这里闭环)
并行策略如何贴合这个层级
| 并行方式 | 通信量 | 应该放在哪 |
|---|---|---|
| 张量并行(TP) | 每层都要 all-reduce,最重 | NVLink 域内(所以 TP 度数通常 ≤ 8 或 ≤ 域大小) |
| 流水线并行(PP) | 只在 stage 边界传激活,较轻 | 可以跨机 |
| 数据并行(DP) | 每步一次梯度 all-reduce,可与计算重叠 | 跨机 |
| 专家并行(MoE) | all-to-all,重且不规则 | 尽量域内,跨机时对网络最苛刻 |
NVL72 把域从 8 扩到 72,直接的意义就是TP 度数可以开得更大, 或者让 MoE 的 all-to-all 留在域内。这是它的核心卖点,不只是"带宽数字更大"。
NVLink SHARP:在交换机里做归约
NVSwitch 里带了归约引擎,可以把 all-reduce 的一部分计算搬到交换芯片上做:
普通 all-reduce:每张卡都要收全部数据、各自算一遍
SHARP:交换机边转发边归约,卡只收最终结果
收益是减少了实际搬运的数据量和参与轮数。IB 侧也有对应的 SHARP(在交换机里做归约), 思路完全一样——把集合通信的一部分从端侧卸载到网络里。
观测与排障
# 每条链路的状态与速率
nvidia-smi nvlink -s
# 链路能力(版本、条数)
nvidia-smi nvlink -c
# 吞吐计数器(d = data)
nvidia-smi nvlink -gt d
# 拓扑矩阵里的 NV# 就是链路数
nvidia-smi topo -m
nvidia-smi nvlink -s 正常输出长这样:
GPU 0: NVIDIA H100 80GB HBM3
Link 0: 26.562 GB/s
Link 1: 26.562 GB/s
...
Link 17: 26.562 GB/s
18 条全在、速率一致就是健康的。掉链的症状:
| 现象 | 说明 |
|---|---|
某条 Link 显示 <inactive> 或缺失 | 该链路没起来,这对 GPU 的带宽按比例下降 |
topo -m 里 NV 数字小于预期 | 同上,最直观的检查 |
某两张卡之间显示 PIX/SYS 而非 NV# | NVLink 完全没用上,退化到 PCIe |
| AllReduce 出现长尾、总带宽小幅下降 | 集合通信是同步的,一条慢链拖慢所有卡 |
和 PCIe 降速一样,NVLink 少几条链路时功能完全正常:程序跑得通、结果正确, 只是那对 GPU 之间的带宽按比例缩水。
而 AllReduce 是同步操作——所有卡都得等最慢的那条路径。所以一条链路的问题会表现为 整个作业小幅但稳定地变慢,非常难归因。
因此 GPU 节点的例行体检里应该固定包含这两条:
nvidia-smi nvlink -s | grep -c 'GB/s' # 链路总数是否符合预期(8 卡 × 18 = 144)
nvidia-smi topo -m | grep -o 'NV[0-9]*' | sort -u # NV 数字是否一致生产环境用 DCGM 采集 NVLink 的错误与流量计数(DCGM_FI_DEV_NVLINK_*)做告警,
比人工巡检可靠。
检查点
H100 的 NVLink 官方标称 900 GB/s。要和一张 400G 网卡(50 GB/s 单向)比较,应该用哪个数字?
为什么张量并行(TP)的度数通常不超过 NVLink 域的大小?
某个 8 卡节点上 nvidia-smi topo -m 显示大部分卡对是 NV18,但有一对显示 NV9。会有什么后果?
这节课的落点
- NVLink 与 PCIe 并存:PCIe 管 CPU↔GPU 与 GPU↔网卡,NVLink 只管 GPU↔GPU
- 官方规格是双向聚合:第 4 代 900 GB/s(单向 450)、第 5 代 1,800(单向 900)
- NVSwitch 让域内任意两卡都能跑满全带宽,是 Spine-Leaf 思路在机内的翻版
- 域的边界决定哪些流量上网络:HGX 是 8 卡,GB200 NVL72 是 72 卡
- 带宽层级(H100,单向):HBM ≈ 3,350 > NVLink 450 > PCIe 63 ≈ 网络 50 GB/s
- 由此推出:TP 留域内、PP/DP 可跨机、MoE 的 all-to-all 对网络最苛刻
- 400G 网卡配 Gen5 x16 是"刚好匹配",这是上一节 PCIe 账的闭环
- NVLink SHARP 把归约卸载进交换芯片,与 IB SHARP 同一思路
- 掉链是静默故障:功能正常、只是变慢;固定检查链路数与
NV#,生产用 DCGM 告警