所属: 基础设施层。本页边界: 同一服务器中多张加速卡为什么不是天然等价的并行资源。
#核心公式
#符号说明
| 符号 | 含义 | 单位/条件 |
|---|---|---|
| 一次点到点消息通信时间 | s | |
| 启动、协议与同步的固定延迟 | s/次消息 | |
| 本次消息的有效载荷大小 | Byte | |
| 通信路径的有效带宽 | Byte/s | |
| 节点内拓扑图;设备/交换器集合与链路集合分别为 | 图 | |
| 后文中的 token 批维、隐藏维、设备数、每元素字节数 | 依上下文 | |
| 指定路径上传输 字节消息的时间 | s | |
| 该路径的累计固定延迟、考虑争用后的有效带宽 | s、Byte/s |
该 – 模型忽略链路争用和分块流水,只用于解释小消息受延迟限制、大消息受带宽限制。
#技术要点
- PCIe、NVLink/NVSwitch 的带宽与拓扑不同。
- NUMA 使 CPU 内存和设备亲和性影响数据路径。
- TP 通信频繁,对低延迟高带宽互联更敏感。
- 拓扑决定 collective 的实际路径。
- PCIe 是主机与外设的通用总线,NVLink 是 GPU 间专用高速链路,NVSwitch 将 NVLink 组织为可扩展的交换 fabric。
- NVLink 带宽的代际提升(从 160 GB/s 到 1.8 TB/s)是支撑张量并行、专家并行和 MoE 训练规模扩大的关键硬件基础。
- 机架级 NVLink 域(如 NVL72)将 72 块 GPU 连成统一互联域,使跨节点通信从 IB 下沉到 NVLink。
#原理与演进
#延迟和带宽不是一个量
- 上式中 是一次传输的启动与同步延迟, 是传输 字节的时间。
- 小消息主要受 限制;大张量主要受 限制。频繁交换激活的张量并行因此比偶尔同步梯度更依赖节点内高速互联。
- PCIe 连接主机与设备;NVLink 提供 GPU 间高速路径;NVSwitch 扩展多卡互联。实际带宽还取决于拓扑和同时通信的流量。
#为什么拓扑影响同一组 GPU
- 两张卡可能直连,也可能经交换器或主机路径转发。
- CPU 的 NUMA 节点决定主机内存到设备的本地性;远端访问多一段路径。 NUMA(Non-Uniform Memory Access,非一致性内存访问)是一种多处理器的内存架构,每个 CPU(或 CPU 插槽)都有更靠近自己的本地内存,也能访问其他 CPU 的远端内存,访问本地内存通常更快,访问远端内存则会更慢一些,所以叫“非一致性”。
- 集合通信会受最慢链路和争用约束,因此“总带宽相同”不保证同步时间相同。
跨层联系: 训练并行决定传什么;跨节点网络决定超出单机后怎样传。
#1. 把服务器看成带权图
令设备与交换器构成下式所示的图,边 有带宽 和启动/访问延迟 。一次数据交换的实际路径由拓扑决定。
把页首参数具体化到实际路径,即有下式;它与页首是同一模型,不再重复为独立公式。
- 小消息看 ,大张量看 ;多流共享边时,有效带宽低于链路标称带宽。
- 两张 GPU 可能直连、经交换器相连,也可能需要经过更复杂的主机路径;“同一台机器”不足以判断通信代价。
- 集合通信使用多条路径并有同步依赖,不能简单把每条链路带宽相加当作任务带宽。
#1.1 典型 8 卡服务器的拓扑示例
以 DGX H100 为例,8 张 H100 GPU 通过 4 颗 NVSwitch 芯片全互联,任意两张 GPU 之间的 NVLink 带宽均为 900 GB/s(双向)。同时每张 GPU 通过 PCIe Gen5 x16 与主机 CPU 相连,每颗 CPU 管理 4 张 GPU 和对应的 NIC。
NIC(Network Interface Card,网络接口卡)就是网卡,负责让服务器连接网络。和 NUMA 放在一起说时,通常关注网卡属于哪个 NUMA 节点:网卡通过 PCIe 接到某个 CPU 插槽附近。让处理网络数据的 CPU 和内存尽量也在这个节点上,可以减少跨节点访问带来的延迟和开销。
关键不对称性:
- GPU–GPU 路径:经 NVSwitch 全互联,任意两卡等价,带宽 900 GB/s。
- GPU–CPU 路径:经 PCIe Gen5 x16,单向约 64 GB/s,双向约 128 GB/s。
- GPU–NIC 路径:若 NIC 与 GPU 在同一 PCIe 交换域,经 PCIe 直连;若跨 NUMA 域,需经 CPU 间互联(UPI/Infinity Fabric),带宽进一步减半。
因此,在统一按双向峰值口径比较时,“8 卡节点”内部的带宽差异约为 到 倍:NVLink 约 900 GB/s、PCIe Gen5 x16 约 128 GB/s、跨 NUMA 有效带宽可能进一步降至约 64 GB/s。这接近一个数量级,而不是三个数量级。把张量并行组放在同一 NVLink 域内是拓扑感知放置的基本要求。
#2. PCIe、NVLink、NVSwitch 各是什么
| 连接 | 主要角色 | 直接解决 | 仍未解决 |
|---|---|---|---|
| PCIe | CPU、GPU、NIC、存储等设备的通用连接 | 标准化设备 I/O | GPU 间高频大张量交换可能受路径限制 |
| NVLink | GPU 间专用高速互联 | 提高设备间数据交换能力 | 直连关系仍受拓扑约束 |
| NVSwitch | 将多条 NVLink 组织为交换 fabric | 增加多 GPU 的可达连接 | 总体性能仍受交换争用、流量形态影响 |
| 带宽角度:NVSwitch (聚合) > NVLink > PCIe |
#2.1 PCIe 的代际带宽
PCIe(Peripheral Component Interconnect Express)是主机与外设之间的标准串行总线。每一代 PCIe 的带宽大约翻倍: lane = 一条车道,通常是一对差分信号线,负责一个方向的数据传输
| 代际 | 年份 | 每 lane 速率 | x16 单向带宽 | x16 双向带宽 |
|---|---|---|---|---|
| PCIe 3.0 | 2010 | 8 GT/s | ~16 GB/s | ~32 GB/s |
| PCIe 4.0 | 2017 | 16 GT/s | ~32 GB/s | ~64 GB/s |
| PCIe 5.0 | 2019 | 32 GT/s | ~64 GB/s | ~128 GB/s |
| PCIe 6.0 | 2022 | 64 GT/s | ~128 GB/s | ~256 GB/s |
PCIe 6.0 引入 PAM4 编码和 FLIT 模式,在相同频率下将带宽翻倍。但即使 PCIe 6.0,其带宽仍远低于 NVLink。PCIe 的核心价值在于通用性:所有外设(NIC、SSD、GPU)都通过 PCIe 与主机通信,主机内存与设备内存之间的 DMA 拷贝也经 PCIe。
#2.2 NVLink 的代际演进
NVLink 是 NVIDIA 专有的 GPU 间高速互联链路,自 2016 年 P100 引入。每一代 NVLink 的带宽和拓扑能力都显著提升:
| NVLink 代际 | GPU 架构 | 每 GPU 链路数 | 每 GPU 总带宽 | 关键拓扑变化 |
|---|---|---|---|---|
| NVLink 1.0 | P100 (2016) | 4 | 160 GB/s | 4 卡直连立方体 |
| NVLink 2.0 | V100 (2017) | 6 | 300 GB/s | 8 卡混合立方体网格 |
| NVLink 3.0 | A100 (2020) | 12 | 600 GB/s | 8 卡全互联(NVSwitch) |
| NVLink 4.0 | H100 (2022) | 18 | 900 GB/s | 8 卡全互联(NVSwitch) |
| NVLink 5.0 | B200 (2024) | 18 | 1,800 GB/s | 72 卡 NVLink 域(NVL72) |
NVLink 与 PCIe 的带宽比:H100 的 NVLink 4.0 带宽为 900 GB/s,PCIe 5.0 x16 为 64 GB/s,比值约 14:1。B200 的 NVLink 5.0 为 1,800 GB/s,PCIe 6.0 x16 为 128 GB/s,比值仍约 14:1。这意味着如果 GPU 间通信走 PCIe 而非 NVLink,张量并行的每层同步延迟会增加一个数量级。
NVLink 的物理实现:NVLink 使用差分信号对,每对信号线传输一个方向的数据。NVLink 4.0 每 GPU 有 18 条链路,每条链路包含多个差分对。NVLink 信号通过 PCB 走线或 NVLink 线缆传输,在 NVSwitch 方案中通过背板或线缆连接到交换芯片。
#2.3 NVSwitch 的工作原理
NVSwitch 是 NVIDIA 的 NVLink 交换芯片,其功能类似于网络交换机,但工作在 NVLink 协议层。NVSwitch 将多条 NVLink 组织为交换 fabric,使任意两张 GPU 之间可以建立全带宽连接。
第一代 NVSwitch(2018,DGX-2) :12 颗 NVSwitch 芯片,每颗 18 条 NVLink 端口,总交换容量 7.2 TB/s,支持 16 张 V100 全互联。
第二代 NVSwitch(2020,DGX A100) :6 颗 NVSwitch 芯片,每颗 36 条 NVLink 端口,总交换容量 4.8 TB/s,支持 8 张 A100 全互联。每张 A100 的 12 条 NVLink 全部连接到 NVSwitch。
第三代 NVSwitch(2022,DGX H100) :4 颗 NVSwitch 芯片,支持 8 张 H100 全互联,每张 H100 的 18 条 NVLink 全部接入。总交换容量 3.2 TB/s。
第四代 NVSwitch(2024,GB200 NVL72) :9 颗 NVSwitch 芯片组成一个 NVLink 域,支持 72 张 B200 GPU 全互联。每张 B200 的 18 条 NVLink 接入 NVSwitch,域内任意两卡带宽 1,800 GB/s。总交换容量约 130 TB/s。
NVSwitch 的关键意义:在 NVSwitch 出现之前,GPU 间直连的拓扑受限于每张 GPU 的 NVLink 端口数,8 卡以上无法全互联。NVSwitch 将 NVLink 从“直连链路”提升为“交换网络”,使 GPU 间通信带宽不再受直连关系限制,这也是 NVL72 能实现 72 卡统一域的基础。
#2.4 从 HGX 到 NVL72:机架级互联域
HGX 8-GPU 基板:8 张 GPU + 4 颗 NVSwitch 集成在一个基板上,任意两卡 NVLink 带宽 900 GB/s(H100)。这是当前主流训练服务器的标准形态。
NVL72 机架:18 个计算节点(每个节点 2 张 B200 GPU + 1 张 Grace CPU)+ 9 颗 NVSwitch 芯片,通过铜缆背板连接,组成 72 GPU 的 NVLink 域。域内任意两卡带宽 1,800 GB/s,总带宽 130 TB/s。NVL72 将跨节点的 AllReduce 从 IB(400 Gb/s)下沉到 NVLink(1,800 GB/s),带宽提升约 36 倍。
拓扑意义:在 NVL72 中,张量并行组可以扩展到 72 卡而不经过 IB。对于万亿参数 MoE 模型,专家并行可以在 NVL72 域内完成 All-to-All,避免 IB 成为瓶颈。这直接改变了并行策略的设计空间:此前 TP 通常限制在单节点 8 卡内,NVL72 使 TP=16 或 TP=32 成为可能。
一句话:意义就是——以前很多并行策略因为跨节点通信太慢,根本划不来;NVL72 把 72 张卡放进一个超高速 NVLink 域后,这些策略突然变得可行了
#3. NUMA:主机内存不是均匀的一池
#3.1 NUMA 的硬件根源
NUMA(Non-Uniform Memory Access,非统一内存访问)源于多 CPU 插槽架构。每颗 CPU 有自己的内存控制器和本地内存,CPU 之间通过高速互联(Intel UPI 或 AMD Infinity Fabric)连接。CPU 访问本地内存的延迟约为 80–100 ns,访问远端 CPU 内存的延迟约为 140–180 ns,带宽也降低约一半。
在 GPU 服务器中,每颗 CPU 管理一部分 PCIe 设备(GPU、NIC、SSD)。如果 GPU 0 插在 CPU 0 的 PCIe 插槽上,而数据处理线程运行在 CPU 1 上,则线程需要跨 CPU 互联访问 GPU 0 的 BAR 空间或发起 DMA,延迟和带宽都变差。
#3.2 GPU 与 NUMA 的交互
CUDA 提供 cudaDeviceGetP2PAttribute 和 nvmlDeviceGetNumaNodeId 等接口查询 GPU 所属的 NUMA 节点。在 8 卡服务器中,典型配置为:
- CPU 0 管理 GPU 0–3 和 NIC 0–1
- CPU 1 管理 GPU 4–7 和 NIC 2–3
如果让 GPU 0 通过 NIC 2 发送网络数据,数据需要经 PCIe 到 CPU 0,再经 CPU 间互联到 CPU 1,再经 PCIe 到 NIC 2,路径长度和延迟都增加。正确的做法是让 GPU 0 使用 NIC 0,使数据路径完全在 CPU 0 的 PCIe 域内。
#3.3 GPU Direct 与 NUMA 感知
GPUDirect RDMA 允许 NIC 直接读写 GPU 显存,绕过 CPU 内存拷贝。但 NIC 和 GPU 必须位于同一 PCIe 交换域或同一 NUMA 节点,否则数据仍需经 CPU 间互联。在部署时,NCCL 会自动检测 GPU–NIC 的拓扑关系,选择最优的通信路径。
GPUDirect Storage 允许 SSD 直接与 GPU 显存进行 DMA 传输,同样受 NUMA 拓扑影响。在数据加载阶段,如果 SSD 与目标 GPU 不在同一 NUMA 域,吞吐会显著下降。
因此设备亲和性是数据路径问题,不只是让进程绑定在哪颗 CPU 的配置问题。评测时需要给出设备对之间的带宽/延迟矩阵,而非只报“8 卡节点”。
#4. 不同并行算法为何偏好不同连接
| 并行模式 | 英文 | 节点内典型交换 | 敏感点 |
|---|---|---|---|
| 数据并行 | Data Parallelism, DP | 每步梯度同步 | 带宽及与反向计算重叠 |
| 张量并行 | Tensor Parallelism, TP | 每层多次部分结果归约/收集 | 启动延迟和频繁同步 |
| 流水线并行 | Pipeline Parallelism, PP | 相邻层间激活传递 | 层间链路与气泡 |
| 专家并行 | Expert Parallelism, EP | token 派发与返回 | All-to-All 的热点与路径拥塞 |
- 高频小消息不宜仅凭“总字节少”认定便宜;多个启动与同步点会累加。
- 张量并行通常倾向低延迟、高带宽的近邻设备;跨节点扩大张量并行度可能把计算收益交还给网络。
- 这是拓扑与并行切分共同设计的问题;并行算法本身在训练页展开。
TP:Tensor Parallelism,张量并行:高频同步,最依赖 NVLink(NVLink 可译?NVIDIA 高速链路)低延迟高带宽。
PP:Pipeline Parallelism,流水线并行:传递激活,对延迟敏感但频率低于 TP。
DP:Data Parallelism,数据并行:梯度同步,关注带宽与重叠。
EP:Expert Parallelism,专家并行:All-to-All(全对全/全交换),关注热点与路径拥塞。
#4.1 张量并行对 NVLink 的依赖
张量并行(TP)的通信模式是每层前向和反向都进行 AllReduce 或 AllGather + ReduceScatter。以 Megatron-LM 的 TP 为例,每个 Transformer 层有两次 AllReduce(前向注意力和 MLP 各一次),反向也有两次。对于 80 层模型,一次迭代的 TP AllReduce 次数约为 320 次。
每次 AllReduce 的数据量约为 batch × seq × hidden × 2 字节。以 batch=8、seq=2048、hidden=8192、FP16 为例,单次 AllReduce 约 256 MB。若 NVLink 带宽 900 GB/s,传输时间约 0.28 ms;若 PCIe 带宽 64 GB/s,传输时间约 4 ms。320 次 AllReduce 的差异是 0.9 秒 vs 12.8 秒。这就是 TP 必须运行在 NVLink 域内的根本原因。
#4.2 流水线并行对链路的需求
流水线并行(PP)的通信发生在相邻 stage 之间,传递的是激活张量而非梯度。通信频率为每 micro-batch 一次,远低于 TP。但 PP 的通信量等于激活大小,与 batch 和 seq 成正比。在 1F1B 调度下,前向和后向交替进行,P2P 通信可以与计算重叠。因此 PP 对链路带宽的要求低于 TP,但对延迟敏感——气泡时间直接受激活传递速度影响。
#5. 演进链与判断边界
单卡容量/算力不足 → 通用总线连接多设备 → 高频模型并行要求更高速 GPU 间通路 → 交换 fabric 扩大可用拓扑 → 跨节点后还需集合通信与网络。
新问题: 连接更快不会自动修复负载不均、同步次数过多和错误的数据放置;拓扑优化应针对具体通信图,而非只追求最大理论带宽。
#6. 一个张量并行的通信账本
设线性层输入形状为 ,输出也为 ,将权重按输出列切到 张卡后,每卡只计算约 FLOPs,但后续层若需要完整输出,至少要交换与 元素同量级的数据。若元素宽度为 字节,通信量级 ;该式不包含具体 AllGather/AllReduce 算法常数。
计算规模随 增长,通信随 增长,似乎增大 有利于计算/通信比;但每层重复同步且小 batch 下 小,启动延迟 会变得突出。跨越低速链路时,增加 TP 度数可能减少单卡计算,却使每层同步累积更久。
#6.1 具体数值示例
以 GPT-3 175B 为例:hidden=12288,TP=8。每层 TP AllReduce 的数据量为 batch × seq × hidden × 2 字节。以 batch=4、seq=2048、FP16 计算:
- 单次 AllReduce 数据量:4 × 2048 × 12288 × 2 = 201 MB
- 96 层 × 2 次前向 + 2 次反向 = 384 次 AllReduce
- 单次 NVLink 传输(900 GB/s):0.22 ms
- 单次 PCIe 传输(64 GB/s):3.1 ms
- 每步 NVLink 总通信时间:384 × 0.22 = 84 ms
- 每步 PCIe 总通信时间:384 × 3.1 = 1190 ms
NVLink 使 TP=8 的通信开销从秒级降至毫秒级,这是张量并行在 H100 上可行的硬件前提。
#7. 拓扑敏感的放置
若有 8 张 GPU 分属两个互联域,TP=4、DP=2 通常希望把每个 4 卡 TP 组放在同一高速域,让较低频的 DP 同步跨域;反过来把一个 TP 组拆在两个域,会让每层同步跨慢链路。这个例子只是拓扑原则,真实最优仍取决于模型层、链路和并行实现。
NUMA 放置同理:CPU 数据处理线程靠近目标 GPU/NIC,可减少跨主机域搬运;但若 CPU 负载不平衡,过度固定亲和性又可能降低吞吐。评测需要给出设备对之间的带宽/延迟矩阵,而非只报“8 卡节点”。
#7.1 拓扑感知的集合通信
NCCL 在初始化时会自动检测节点内拓扑,构建带宽/延迟矩阵,并据此选择 ring 或 tree 的构建方式。在 NVSwitch 全互联拓扑中,任意两卡等价,ring 的构建只需考虑 GPU 数量;在混合 NVLink + PCIe 拓扑中,NCCL 会优先选择 NVLink 路径,避免跨 PCIe 的 hop。因此,同一个 NCCL AllReduce 在不同拓扑上的性能可能相差数倍,而用户代码无需修改。
#8.核心思想
- TP 不跨慢链路
- DP/PP 可以跨 IB
- EP 尽量放 NVLink 域
- 通信与计算重叠:1F1B、梯度分桶、双缓冲、异步 AllReduce
#Naive Model Parallelism
- 思想: 最直观的想法,将模型按层分成多个阶段(stage),每个阶段的计算和模型参数放置在一个计算设备上。前向传播时,数据依次通过每个阶段;反向传播时,梯度依次反向传播。
- 特点: 调度简单,前向反向依次进行,不同设备峰值显存一致。
- 缺点: 任意时刻仅有一个设备在工作,其他设备等待,计算资源利用率极低,大部分时间被气泡占据。

#GPipe
- 思想: 第一个设备计算完一份数据就立马传给下一个设备,不用得整个batch size数据计算完在传递,使得后面阶段设备提早进行前向传播,反向同理。
- 特点: 将mini-batch切分为更小的micro-batch,前向反向流水线执行,不同设备激活峰值显存一致。
- 缺点: 仍有较大bubble,每个设备仍然需要在前向过程存储所有micro-batch中间激活值,较大显存开销。

1F1B:1F1B = One Forward, One Backward,中文叫 “一个前向、一个反向”调度。它是PP里最常用的调度策略之一。
- 思想: 每个micro-batch尽早的进行反向传播,不必等待所有micro-batch前向完成后在反向,从而让前向保留的激活尽早释放,降低设备的激活峰值显存。
- 特点: 稳定阶段采用1F1B调度(一次前向一次反向),设备激活峰值显存仅和stage有关,和mini-batch size无关。
- 缺点: 实现较为复杂,相比GPipe并没有降低Bubble Rate,仍有较大的气泡。

相比于GPipe,1F1B将反向尽可能提前,尽早的释放前向激活占用显存,在mini-batch size较大时,大幅度减少显存占用,同时PipeDream还提到Weight Stashing和Vertical Sync技术进一步减少Bubble Rate,感兴趣的可以自行阅读PipeDream论文,本文仅考虑参数一致性下的1F1B,同时Megatron-LM实现中采用了奇偶通信策略,避免交叉通信带来的环状等待。
气泡率(bubble ratio) 就是流水线并行里,GPU 空转等待的时间占总时间的比例 气泡率直接拉低 MFU(Model FLOPs Utilization,模型算力利用率)
#Interleaved-1F1B

- 思想: 从1F1B不难看出,last stage在稳定阶段,已经完全没有气泡,此时整个系统的效率受限前向的串行依赖,导致last stage不能立刻启动,引入warmup阶段的气泡,反向同理,Interleaved-1F1B将stage上的模型再次分为多个chunk,这样last stage就可以更早的启动,同时first stage的反向也能更早的结束。
- 特点: 每个pp stage存在多个chunk,稳定阶段采用1F1B调度(一次前向一次反向),设备激活峰值显存仅和stage有关,和mini-batch size无关。
- 缺点: 实现相当复杂,相比1F1B,降低Bubble Rate,但是通信量以及次数增加,系统激活峰值显存增加。