NVLink 多 GPU 互联
一块 GPU 的算力再强,也有装不下的模型、算不完的批次。今天训练一个百亿、千亿参数的大模型,默认就是一台机器插 8 张卡,再把几十台上百台机器连成集群。前面讲 GPU 架构:SIMT 与 warp 调度时,关注点都在芯片内部成千上万的线程如何取数、如何隐藏延迟;这一篇把视角拉到机箱里,回答一个同样关键的问题:卡与卡之间,数据是怎么流动的。
很多人第一次装多卡机时会想当然地认为:GPU 都插在主板上,走 PCIe 不就行了?毕竟网卡、SSD 也都走 PCIe。这个直觉在推理小模型时问题不大,但在多卡训练场景下,PCIe 的带宽和路径都会成为瓶颈。NVIDIA 为此专门做了 NVLink 和 NVSwitch,把 GPU 之间的互联从「过 CPU 的外设总线」变成「GPU 对等的高速网络」。再配上 HBM 高带宽显存,单机 8 卡才能像一台超大加速器一样协同工作。
本文要回答的问题
- 多卡之间走 PCIe 到底慢在哪?为什么说卡间通信要「绕路 CPU」?
- NVLink 各代带宽是多少?它和 PCIe 在物理上有什么本质区别?
- NVSwitch 解决了什么问题?mesh、ring、全互联拓扑各自长什么样?
- 大模型训练里的梯度同步(all-reduce)为什么对卡间带宽极度敏感?
- 机内 NVLink 和跨机 InfiniBand 是怎么分工的?什么通信该走哪条路?
一、只靠 PCIe:卡间通信要绕路 CPU
先看 PCIe 的数字。PCIe 4.0 x16 插槽,单方向理论带宽约 32GB/s,双向同时跑满的聚合带宽约 64GB/s;最新的 PCIe 5.0 x16 单方向约 63GB/s、双向约 126GB/s。这些数字看着不低,但要注意对比对象:一张 H100 的 HBM 显存带宽约 3.4TB/s,是 PCIe 5.0 x16 单向带宽的五十多倍。GPU 内部喂数据是「大河」,插槽却是「水管」。
更要命的是路径。在典型的双路服务器里,每张 GPU 挂在某一个 CPU 的 PCIe Root Complex(根复合体,PCIe 树的根)下面。挂在同一个 CPU 下的两张 GPU 通信,数据要先从 GPU0 出插槽、经过 Root Complex 的 PCIe 交换结构,再进 GPU1;如果两张卡分属两个 CPU(所谓跨 NUMA、跨 socket),路径还会变成 GPU0 → CPU0 → QPI/UPI 或 Xeon 之间的连接 → CPU1 → GPU1,中间多两次转发,延迟和带宽都再打一个折扣。
也就是说,PCIe 的设计初衷是「CPU 连接外设」,拓扑天然以 CPU 为中心:GPU 是端点,不是对等节点。GPU0 想给 GPU1 发数据,控制权和地址转换都绕不开 CPU 一侧的根复合体。即使有 P2P DMA(GPU 之间直接发起 DMA,不经过 CPU 执行拷贝),物理链路仍然走这条以 CPU 为中心的路径,带宽上限和跳数并没有改变。
上图对比了两条路径:走 PCIe 的卡间流量必须出插槽、经过 Root Complex 再进另一张卡;而 NVLink 让 GPU0 和 GPU2 之间直接对话,数据不经过 CPU、不占用 PCIe 插槽带宽。推理场景卡间交换的只是少量请求和中间结果,绕路尚能接受;训练场景每张卡每一步都要和其他卡同步大量梯度,这条路径的每一分开销都会被放大。
还有一个容易被忽视的细节:PCIe 带宽是要和网卡、NVMe SSD 共享的。一台 8 卡服务器通常还挂着 InfiniBand 网卡和若干 NVMe,所有设备争抢同一棵 PCIe 树上的 lane 和 Root Complex 端口。如果卡间梯度同步也来挤这条总线,实际可用带宽往往连理论值的一半都到不了;而 NVLink 是独立于 PCIe 的另一组走线,等于给 GPU 之间的流量单开了一条专用高架路。
二、NVLink:GPU 之间的直连高速链路
NVLink 是 NVIDIA 从 2016 年(P100 那一代)开始推出的 GPU 点对点高速互联,物理上是若干条差分对 SerDes 链路,和 PCIe PHY 属于同一类信号技术,但协议、通道数和调度都为 GPU 对等通信重新设计。每条 NVLink 在协议层就支持双向同时传输,不存在 PCIe 那种「一个根、多个端点」的主从结构,两张 GPU 可以同时互发数据。
各代 NVLink 的双向聚合带宽如下,数字均为单张 GPU 通过所有 NVLink 通道能获得的双向总带宽:
| 世代 | 代表 GPU | 单卡双向带宽 | 对比同期 PCIe |
|---|---|---|---|
| NVLink 1 | P100(2016) | 约 160GB/s | PCIe 3.0 x16 双向约 32GB/s |
| NVLink 2 | V100(2017) | 约 300GB/s | PCIe 3.0 x16 约 32GB/s |
| NVLink 3 | A100(2020) | 约 600GB/s | PCIe 4.0 x16 双向约 64GB/s |
| NVLink 4 | H100(2022) | 约 900GB/s | PCIe 5.0 x16 双向约 126GB/s |
| NVLink 5 | GB200(2024) | 约 1.8TB/s | PCIe 6.0 尚未规模部署 |
以 A100 为例:它有 12 条 NVLink,每条单向 25GB/s、双向 50GB/s,合计双向 600GB/s,是同期 PCIe 4.0 x16 双向带宽的近 10 倍。H100 进一步提升到 18 条链路、双向 900GB/s。这意味着卡间搬运同样大小的张量,NVLink 上花费的时间可以比 PCIe 低一个数量级——在通信频繁的训练任务里,这就是「能跑」和「跑不动」的区别。
物理形态上,NVLink 不占 PCIe 插槽通道:消费级和轻量工作站用 NVLink Bridge(金手指之间的桥接器)把相邻两卡连起来;数据中心的 HGX、DGX 平台则把 NVLink 走线做在基板上,通过板上交换芯片连通。NVLink 在协议里还承载内存语义:一张 GPU 可以直接 load/store 访问另一张 GPU 显存里的地址(配合统一的地址映射),这让多卡编程模型更像访问一个分布式地址空间,而不是收发网络报文。
三、从点到点到全互联:NVSwitch 与拓扑
有了高速链路,下一个问题是「怎么连」。8 张卡两两之间都拉满链路当然好,但每张卡的 NVLink 通道数有限(比如 A100 只有 12 条),不可能给其余 7 个伙伴各分配很多条。于是出现了不同的多卡拓扑。
最简单的是点对点成对(pair):两卡之间用桥接器连满,带宽很高,但卡对之间没有连接,跨对通信仍要走 PCIe。早期 DGX-1(P100 版)用的是混合立方体网格(hybrid cube mesh):8 张卡组成一个立方体,每张卡只和 4 个邻居直连,通信需要软件选路、多跳转发,远程卡对之间的实际带宽低于近邻。环形(ring)拓扑则把卡连成一个环,每张卡只连左右两个邻居,连线最省、扩展简单,环上所有链路同时传输时聚合带宽随卡数线性增长——这正是 ring all-reduce 算法的物理基础。
这些非全互联拓扑的共同问题是带宽不均:相邻卡对带宽高,不相邻的卡对要多跳、要争用中间链路,多任务同时跑时还可能互相阻塞。以 8 卡立方体网格为例,对角位置的两张卡要经过 3 跳,中途每张转发卡都要占用自己的两条链路,若此时这几张卡还在跑别的通信,端到端带宽可能只剩直连的三分之一甚至更低。环形拓扑的理论聚合带宽虽然漂亮,但那是「环上所有链路同时、均匀传输」的理想值,一旦某个 all-reduce 环和另一个通信任务共享了物理链路,或者某张卡同时属于多个环,热点就会出现。NVSwitch 的思路是把「选路」这件事从 GPU 手里拿走,交给专门的交换芯片:每张 GPU 把所有 NVLink 通道接到 NVSwitch 上,由交换芯片保证任意两张 GPU 之间都能以全带宽通信。HGX A100 平台用 6 颗第三代 NVSwitch,让 8 张 A100 两两之间都有 600GB/s 的对等带宽;H100 HGX 同样是 8 卡全互联、每卡 900GB/s。
这张图的关键不是星形连线本身,而是它在逻辑上等价于一个全连接网络:GPU0 到 GPU7 和 GPU0 到 GPU1 获得的带宽、跳数完全相同,软件不用再关心「谁挨着谁」。这一性质对编程模型的解放很大——NCCL(NVIDIA 集合通信库)不需要为不规则拓扑做复杂的选路规划,张量并行(tensor parallel)里逐层的全对全交换也不会因为落在「远程卡对」上而变慢。最新的 GB200 NVL72 更进一步,用 NVLink 5 + NVSwitch 把一个机柜里 72 颗 GPU 连成一个全互联的 NVLink 域,任意两卡之间 1.8TB/s,相当于把「单机全互联」从 8 卡扩展到了整个机柜。
四、为什么大模型训练对卡间带宽极度敏感
多卡训练为什么需要这么多卡间流量?以最常见的数据并行(data parallel)为例:每张卡持有完整模型副本、各吃一份数据,算完反向传播后,8 张卡拿到的是 8 份不同的梯度。参数更新前必须让所有卡的梯度一致,于是要做 all-reduce:把各卡的梯度归约(通常是求和再平均),再把结果发回每张卡。模型有多少参数,每一步就要在卡间交换多少量级的数据——一个 70 亿参数的模型,仅梯度就约 14GB(FP16 每参数 2 字节),每个训练步都要来一次。
实现 all-reduce 的经典算法是环形 all-reduce(ring all-reduce),分两个阶段:先在环上做 reduce-scatter,每张卡最终拿到参数的 1/N 分片的归约结果;再做 all-gather,把各分片沿环广播一圈。两个阶段每张卡的通信量都是约 2(N-1)/N 倍模型大小,与卡数 N 基本无关,这是它相比「参数服务器」式聚合(通信量集中到一张卡)的根本优势。但注意,这个算法的高效是有前提的:环上每一条链路都要持续跑满。一旦物理网络不是均匀全互联,某些跳慢、某些链路争用,整个 ring 就被最慢的一环拖住,所有 GPU 一起空等。
通信占比可以用一个简单公式估算。设单步计算时间 T_compute、单步通信时间 T_comm,多卡加速效率约为 T_compute /(T_compute + T_comm)。当模型变大、每步梯度变多,或者为了让 GPU 忙起来而加大卡数、缩小每张卡的批次(T_compute 下降),T_comm/T_compute 就会迅速攀升。带宽从 64GB/s(PCIe 4.0)换成 600GB/s(NVLink 3),同样的梯度交换时间降到约十分之一,空等比例随之大幅下降。这就是为什么大模型平台宁可增加 NVSwitch 的成本,也不肯让梯度同步走 PCIe。
不同并行策略对互联的要求也不同:数据并行的 all-reduce 通信量大但有良好的 ring 友好性,可以容忍跨机;张量并行把单层矩阵乘法拆到多卡上,每个算子内部都要做 all-reduce/all-gather,通信频次极高、必须放在 NVLink 全互联域内;流水线并行(pipeline parallel)只在阶段边界传激活,通信量小,可以跨 NUMA 甚至跨机。实际训练 175B 以上模型时,通常是张量并行锁在 8 卡 NVLink 域内,域间再用流水线并行和数据并行扩展,这正是按互联带宽层级做的层次化切分。
举个直观的数字:假设一次梯度同步要交换 12GB 数据。在 PCIe 4.0 x16 上,按实测有效带宽约 20GB/s 估算,光通信就要约 0.6 秒;同样的数据在 A100 的 NVLink 3 上(有效带宽约 400GB/s)只需约 0.03 秒。如果一个训练步的计算本身只要 0.2 秒,前者意味着 GPU 超过 70% 的时间在空等,后者空等比例则降到 15% 以下——集群规模再放大几十倍,这个差距直接决定一份训练任务是花两周还是两个月、甚至是否具备可行性。现代框架还会把梯度拆成小块,边算反向边做 all-reduce(通信与计算重叠),但重叠能掩盖多少,同样取决于链路能跑多快。
五、机内 NVLink,跨机 InfiniBand:两层网络的分工
NVLink 再强,作用范围也只在单机(或 NVL72 这种单机柜域)内。集群里几十台机器之间的互联,主流方案是 InfiniBand(IB)——一种为 HPC 设计的高带宽低延迟网络,也可以用 RoCE(在以太网上跑 RDMA)替代。当前常见速率:HDR 为 200Gb/s(约 25GB/s)、NDR 为 400Gb/s(约 50GB/s),端到端延迟在一到两微秒量级。可以看到,跨机带宽比机内 NVLink 低一个数量级以上,这决定了集群通信的分配原则:高频、紧耦合的交换留在机内,低频、粗粒度的同步才跨机。
跨机场景的关键技术是 GPUDirect RDMA:网卡可以直接对 GPU 显存发起 DMA,数据从一张 GPU 的显存经 InfiniBand 网卡直达对端 GPU 显存,不需要先拷到主机内存再由 CPU 转发。它和机内 P2P 是同一思想在跨机尺度上的延伸——把 CPU 从数据路径上拿掉,只让 GPU 和网卡互传。
把几类互联放在一张表里对比,选型逻辑就很清楚:
| 互联 | 典型带宽 | 典型延迟 | 作用范围 | 成本与定位 |
|---|---|---|---|---|
| PCIe 4.0/5.0 x16 | 双向约 64/126GB/s | 数百纳秒级 | 单机,卡↔CPU/外设 | 通用、必带,卡间只作兜底 |
| NVLink 3/4 | 双向 600/900GB/s | 数百纳秒级 | 单机 8 卡(NVL72 达 72 卡) | 高,训练平台核心配置 |
| NVSwitch 全互联 | 任意卡对等同 NVLink 满带宽 | 单跳交换 | 单机/单柜 | 高,换拓扑均匀性与可编程性 |
| InfiniBand NDR | 约 50GB/s(400Gb/s) | 1-2 微秒 | 跨机、整个集群 | 高,按集群规模铺设 |
简单记忆:HBM 解决的是 GPU 芯片内「算力等显存」的问题,NVLink/NVSwitch 解决的是机箱内「算力等卡间带宽」的问题,InfiniBand 解决的是集群内「卡等跨机带宽」的问题。三层带宽依次下降一个数量级左右,优秀的并行策略会顺着这个金字塔安排通信,而不是逆着它硬传。
除了带宽,延迟的量级差异同样重要。机内 NVLink 一次往返在数百纳秒到 1 微秒级,跨机 IB 即便有 RDMA 也要 1-2 微秒,而经过普通以太网加 TCP 协议栈可能达到几十到上百微秒。对单次大块传输,主导因素是带宽;但对频繁的小消息同步(比如流水线并行里的握手、并行组初始化、专家网络的细粒度派发),延迟才是决定开销的关键,这也是机内通信尽量走 NVLink、跨机尽量用 RDMA 而不走内核协议栈的原因。
六、工程视角:拓扑感知与常见坑
部署和调优多卡训练时,拓扑是第一件要摸清的事。nvidia-smi topo -m 会打印一张矩阵,标明每张 GPU 之间的连接类型:NV# 表示经过某颗 NVSwitch(或第几条 NVLink),PIX 表示同一 PCIe switch 下,PXB/PHB 表示要经过多个 PCIe bridge,SYS 表示跨 socket、要经过 CPU 间互连——延迟依次升高。跑训练前看一眼这张表,就知道自己的 8 卡是不是真全互联。
常见的坑有三类。第一,把消费级主板或廉价 4 卡平台当成训练平台:GPU 之间没有 NVLink、或者 PCIe lane 被拆分到 x8,all-reduce 带宽直接腰斩,GPU 利用率长期停在 30%-40%。第二,选错并行组的绑定:把需要逐层通信的张量并行组打散到不同机器,跨机 IB 承担了本该机内 NVLink 承担的高频流量,吞吐可能掉几倍甚至十几倍;正确做法是让 NCCL 按物理拓扑建组,机内 8 卡优先成组。第三,忽视拓扑不均:在 ring/mesh 平台上让通信热点恰好落在多跳卡对上,NCCL 虽然会自动建环,但物理链路的带宽差异它无法消除。
成本账也要算清楚:8 卡 HGX 全互联平台之所以比同样 8 张 PCIe 版 GPU 拼起来的机器贵一大截,差价主要就在基板走线和 6 颗 NVSwitch 上;而 IB 网卡和交换机是按集群规模线性花钱,端口速率翻倍、价格也接近翻倍。所以工业界的经验是:先用尽机内 NVLink 的带宽(单机 8 卡塞不下的模型再考虑跨机),跨机通信通过更大的批次、梯度累积和流水线划分尽量摊薄,避免为高频跨机流量付数倍的硬件代价。
判断系统是否受卡间互联瓶颈,方法也很直接:训练时同时看 GPU 利用率和 NVLink/PCIe 流量。如果 SM utilization 周期性掉到底、掉点恰好与 all-reduce 时刻重合,且 NVLink 带宽已打满,说明通信在拖计算的后腿——要么减少通信量(如梯度累积、通信与计算重叠),要么把任务迁移到全互联的 NVSwitch 平台。
这一篇在知识体系里的位置
这一篇站在机箱和集群尺度,承接芯片内部的两篇:单卡内部线程如何调度,看 GPU 架构深入:SIMT、warp 调度;卡内显存为什么能喂饱算力,看 GPU 显存:HBM 与 GDDR。物理层 SerDes 信号如何跑上这些速率,可参考 高速 SerDes 与 PCIe PHY 设计;机内 NoC「片上网络」与机间网络在拓扑、QoS、死锁问题上一脉相承,见 NoC 拓扑、QoS 与死锁。理解了卡间带宽层级,再去看大模型训练的各种并行切分策略和集合通信原语,就会明白它们为什么都长成现在这个样子。
总结
PCIe 是以 CPU 为中心的外设总线,卡间通信要绕 Root Complex、双向带宽只有几十到一百多 GB/s;NVLink 用 GPU 直连把单卡双向带宽推到 300-900GB/s(最新 1.8TB/s),NVSwitch 进一步让 8 卡乃至 72 卡全互联、任意卡对等带宽;训练时每步的梯度 all-reduce 对这条链路的带宽极度敏感,而 InfiniBand 负责跨机、NVLink 负责机内,按带宽金字塔做层次化并行,才是多卡集群高效运转的根本原因。