📑 本页目录(点开跳转)
05 · 互联与集群拓扑
⏱ 24 分钟 | ⭐ 它决定了你能用哪种并行策略
🎯 一句话
卡和卡之间怎么连,直接决定了后面五章的并行策略能不能用。 张量并行离不开 NVLink,流水线并行能忍受慢网络 —— 这不是偏好问题,是带宽差 15 倍造成的硬约束。
🔌 一、四个层级的带宽
卡内 HBM ~2000-3350 GB/s ← 基准
─────────────────────────────────
NVLink(同机卡间) ~450-900 GB/s ⭐ 约为 HBM 的 1/4
PCIe 4.0/5.0 ~32-64 GB/s ⚠️ 慢 15-30 倍
InfiniBand(跨机) ~25-50 GB/s ⚠️ 和 PCIe 同量级
以太网(普通) ~1-12 GB/s 💀 慢两个数量级
🔑 最重要的一条断层在 NVLink 和 PCIe 之间 —— 差 15 倍以上。 这条断层把并行策略分成了两类: "必须在 NVLink 域内"的(张量并行)和"可以跨机"的(数据/流水线并行)。
💡 为什么延迟也重要
带宽决定"搬 1GB 要多久"
延迟决定"搬 1KB 要多久"
NVLink 延迟 ~1-2 微秒
InfiniBand 延迟 ~1-3 微秒(RDMA)
以太网 TCP 延迟 ~20-100 微秒 ⭐ 差一个数量级
→ 小消息频繁通信时,【延迟比带宽更致命】
→ 这就是为什么大规模训练必须用 RDMA 而不是普通 TCP
🕸️ 二、NVLink 与 NVSwitch
- ❌ 早期:NVLink 点对点连接 —— 8 卡之间不是全连接,有的卡对之间要绕路
- ✅ 现在(DGX/HGX):NVSwitch 全互联 —— 任意两张卡之间都是【全带宽直连】⭐
⚠️ 一个必须自己确认的事: 不是所有"8 卡机器"都有 NVSwitch。 很多云厂商的便宜实例是 8 卡挂在 PCIe 上, 跑张量并行会慢到不可用。开机第一件事是查拓扑。
nvidia-smi topo -m
输出解读(关键的几个值):
NV8 / NV12 → NVLink 直连,几条链路 ✅ 最好
NODE → 同 NUMA 节点,走 PCIe ⚠️
SYS → 跨 NUMA / 跨 CPU socket 💀 最慢
PIX / PXB → 经过 1 个 / 多个 PCIe 交换机
📡 三、跨机通信:RDMA 是关键
❌ 传统 TCP/IP:
GPU 显存 → CPU 内存 → 内核协议栈 → 网卡 → ... → 反向一遍
→ 多次拷贝,CPU 全程参与,延迟高
✅ RDMA(远程直接内存访问):
GPU 显存 ──────────► 网卡 ──────► 远端 GPU 显存
⭐ 绕过 CPU 和内核,零拷贝
⭐ GPUDirect RDMA:GPU 显存直接和网卡对接,连 CPU 内存都不经过
| 技术 | 说明 |
|---|---|
| InfiniBand | 原生 RDMA,大规模训练集群的主流 |
| RoCE | 在以太网上跑 RDMA,便宜但需要无损网络配置(PFC/ECN),容易配错 |
| GPUDirect RDMA | GPU ↔ 网卡直通,必备 |
💥 一个常见的坑:RoCE 配置不当会导致丢包→重传→性能雪崩。 症状是"平时还行,一到大规模 AllReduce 就卡死"。 排查时先看网卡的 PFC 计数器。
🔄 四、集合通信原语(后面天天见)
| 原语 | 做什么 | 用在哪 |
|---|---|---|
| AllReduce | 所有卡的数据求和,结果发回所有卡 | 数据并行同步梯度 ⭐ |
| ReduceScatter | 求和后每卡只拿一部分 | ZeRO / FSDP |
| AllGather | 每卡的一部分拼成完整的发给所有卡 | ZeRO 取回参数 |
| Broadcast | 一张卡发给所有卡 | 初始化 |
| All2All | 每卡给每卡发不同的数据 | MoE 专家并行 ⭐ |
| P2P Send/Recv | 点对点 | 流水线并行 |
💡 一个关键恒等式:AllReduce = ReduceScatter + AllGather 这解释了为什么 ZeRO-2 的通信量和普通数据并行一样—— 它只是把一次 AllReduce 拆成了两半,中间插入了参数分片。
⭐ Ring AllReduce:为什么它是标准做法
朴素做法:所有卡把梯度发给 0 号卡,0 号求和后发回
→ 0 号卡的网络成为瓶颈,通信量 O(N × 数据量) 💀
Ring AllReduce:卡排成一个环,分两个阶段
① ReduceScatter:转 N-1 步,每卡最终持有 1/N 的完整求和结果
② AllGather: 再转 N-1 步,把各自那份传遍全环
⭐ 每张卡收发的数据量 = 2 × (N-1)/N × 数据量 ≈ 2 × 数据量
【和卡数几乎无关】—— 这是它的关键性质
通信量对比(8 卡,1GB 梯度):
朴素:0 号卡要收 7GB、发 7GB 💀
Ring:每卡收发约 1.75GB ✅ 且完全并行
🔑 但注意 Ring 的代价:延迟随卡数线性增长(要转 2(N−1) 步)。 所以超大规模会用分层 AllReduce: 先在机内 NVLink 做一次,再跨机做一次,最后机内广播 —— 把慢的跨机通信量降到 1/8。
🧮 五、通信量估算:决定并行策略的那个数
数据并行:每步同步一次梯度
通信量 = 2 × 参数量(Ring AllReduce)
→ 7B 模型 BF16 = 14GB × 2 = 28GB/步
→ 跨机 25GB/s:约 1.1 秒/步 ⚠️ 如果计算只要 0.5 秒,通信就是瓶颈
张量并行:每层前向和反向各要 AllReduce 一次激活
通信量 = 层数 × batch × seq × hidden × 2 × 2
→ 【每一层都要通信】,频率极高
→ ⭐ 必须在 NVLink 域内,跨机绝对不可用
流水线并行:只在切分点传递激活
通信量 = 切分点数 × batch × seq × hidden
→ ⭐ 通信量小得多,可以跨机
⭐ 这三行直接推出了第 14 章的黄金法则:
张量并行 → 放在【机器内部】(NVLink) 流水线并行 → 跨【机器】 数据并行 → 最外层不是经验,是带宽算出来的。
🧪 六、上手先做的三件事
# ① 看拓扑
nvidia-smi topo -m
# ② 实测卡间带宽(NCCL 官方测试工具)
./build/all_reduce_perf -b 8 -e 4G -f 2 -g 8
# 看 busbw 那一列,和理论值对比
# ③ 看有没有 GPUDirect RDMA
nvidia-smi topo -m | grep -i mlx # 网卡和 GPU 的亲和性
ibstat # InfiniBand 状态
⚠️ 常见的性能陷阱: - NCCL 走错网卡(走了管理网口而不是 IB)→ 用
NCCL_SOCKET_IFNAME指定 - NUMA 亲和性错(GPU 和网卡不在同一个 socket)→ 用numactl绑定 - 没开 GPUDirect → 数据绕道 CPU 内存,带宽腰斩export NCCL_DEBUG=INFO # ⭐ 启动时打印它实际选了哪条路径
NCCL_DEBUG=INFO是排查通信问题的第一步 —— 它会告诉你 NCCL 实际用的是 NVLink 还是 PCIe、走的哪张网卡。
🔗 和站内其他章的关系
| 相关的地方 | 这里的位置 |
|---|---|
| 第 3 章 内存层次 | 本章是它"出卡之后"的部分 |
| 第 2 章 4090 只有 PCIe | 所以不适合张量并行 ⭐ |
| 第 10 章 | Ring AllReduce 的详细展开 |
| 第 14 章 | 本章的通信量估算是它的依据 ⭐ |
| 《Kaggle竞赛方法论》04 超参数调优与工程实践 分布式训练选型表 | 那张 DP / DDP / DeepSpeed / FSDP 的表没说前提 —— 前提就是本章的带宽层级 ⭐ |
| 《强化学习基础》12 RLHF 全流程 PPO 要同时装四个模型 | 四个模型每步都要互相传数据,装不进一台机器时,本章的 NVLink/PCIe 断层决定怎么摆 |
✅ 检查点
- 四个层级的带宽大概各是多少?最重要的断层在哪?
- 为什么延迟也重要?什么场景下延迟比带宽更致命?
- NVSwitch 解决了什么问题?为什么不能假设"8 卡机器"都有它?
- 怎么查拓扑?
SYS和NV8分别代表什么? - RDMA 相比 TCP 好在哪?什么是 GPUDirect RDMA?
- AllReduce = ? + ? 这个恒等式解释了什么?
- Ring AllReduce 的关键性质是什么?它的代价是什么?
- 为什么张量并行必须在机内、流水线并行可以跨机?
- 排查 NCCL 通信问题的第一步是什么?
👀 答案
- HBM ~2000-3350 GB/s、NVLink ~450-900、PCIe ~32-64、InfiniBand ~25-50、以太网 ~1-12 GB/s。最重要的断层在 NVLink 和 PCIe 之间,差 15 倍以上。
- 带宽决定"搬 1GB 要多久",延迟决定"搬 1KB 要多久"。小消息频繁通信时延迟更致命——以太网 TCP 延迟 20-100μs 比 RDMA 的 1-3μs 差一个数量级,所以大规模训练必须用 RDMA。
- 解决早期 NVLink 点对点连接下有些卡对之间要绕路的问题,让任意两卡全带宽直连。不能假设是因为很多云厂商的便宜实例是 8 卡挂 PCIe,跑张量并行会慢到不可用。
nvidia-smi topo -m。NV8/NV12 = NVLink 直连(最好),SYS = 跨 NUMA/跨 CPU socket(最慢)。- RDMA 绕过 CPU 和内核协议栈,零拷贝,延迟低得多。GPUDirect RDMA 是 GPU 显存直接和网卡对接,连 CPU 内存都不经过。
- AllReduce = ReduceScatter + AllGather。解释了为什么 ZeRO-2 的通信量和普通数据并行一样——它只是把一次 AllReduce 拆成两半,中间插入参数分片。
- 关键性质:每卡收发的数据量 ≈ 2×数据量,和卡数几乎无关。代价:延迟随卡数线性增长(要转 2(N−1) 步),所以超大规模用分层 AllReduce(先机内 NVLink 再跨机)。
- 张量并行每一层前向和反向都要 AllReduce 激活,频率极高,跨机撑不住;流水线并行只在切分点传递激活,通信量小得多。
export NCCL_DEBUG=INFO——它会打印 NCCL 实际选了哪条路径(NVLink 还是 PCIe、哪张网卡)。
🛑 可以停在这里
⚡ 走神救援
卡怎么连决定了能用哪种并行策略。四层带宽:HBM ~2-3.35TB/s → NVLink 450-900GB/s → PCIe 32-64GB/s → IB 25-50GB/s → 以太网 1-12GB/s;⭐最关键的断层在 NVLink 和 PCIe 之间(差 15 倍以上),它把并行策略分成"必须在 NVLink 域内"和"可跨机"两类。延迟也重要:小消息频繁通信时延迟比带宽更致命(TCP 20-100μs vs RDMA 1-3μs)→ 大规模训练必须 RDMA。NVSwitch 让任意两卡全带宽直连,⚠️但不是所有"8卡机器"都有——很多云厂商便宜实例是 8 卡挂 PCIe,⭐开机第一件事
nvidia-smi topo -m(NV8=NVLink 直连最好,SYS=跨 NUMA 最慢)。RDMA 绕过 CPU 和内核零拷贝,GPUDirect RDMA 让 GPU 显存直连网卡;⚠️RoCE 配不好会丢包→重传→性能雪崩。集合通信原语:AllReduce(数据并行同步梯度)、ReduceScatter/AllGather(ZeRO)、All2All(MoE)、P2P(流水线);⭐恒等式 AllReduce = ReduceScatter + AllGather 解释了为什么 ZeRO-2 通信量和普通数据并行一样。⭐Ring AllReduce:分 ReduceScatter + AllGather 两阶段,每卡收发 ≈ 2×数据量、和卡数几乎无关;代价是延迟随卡数线性增长 → 超大规模用分层 AllReduce(先机内 NVLink 再跨机,跨机通信量降到 1/8)。⭐通信量估算直接推出黄金法则:张量并行每层都要 AllReduce 激活(必须机内 NVLink)、流水线并行只在切分点传(可跨机)、数据并行放最外层——不是经验,是带宽算出来的。排查:⭐NCCL_DEBUG=INFO是第一步;常见陷阱是 NCCL 走错网卡、NUMA 亲和性错、没开 GPUDirect。
下一节 👉 06-混合精度.md