适用读者:要评估"多机扩展划不划算"、要读懂 NCCL 测试结果、要设计超节点拓扑的人。
前置:S23-J18(六种并行与切分维度)。
覆盖旧文:A-4339 §6.4–§6.7(集合通信 + 超节点物理组织 + 内存池 + 规模选择,472 点)→ 472 点。
扩展点:E-S23-063(集合通信时间模型:2(n−1)α + 2(n−1)M/(nB),启动主导)、E-S23-064(TP16 跨机 6.67 ms 反而比 TP8 的 5.15 ms 慢)、E-S23-065(交换机基数与收敛比:32/32 → 800 GB/s,48/16 → 400 GB/s)、E-S23-066(内存池借用不增加物理内存)。
上一篇:S23-J18 · 从单卡到并行:六种并行方式
下一篇:S23-J20 · 跨节点网络与远程访问路径。
1. 一句话结论
并行度的上限由"通信的启动开销"决定,不是带宽。 TP8 一次归约 11.55 μs 里 11.51 μs 是 14 轮的启动,传输只有 0.04 μs——所以带宽翻倍只省 2.5 μs,把每轮启动减半却能省 0.74 ms。
出处:AI Infra 教材 §6.4–§6.7(
id 4339),平台 HGX H100、NVLink 每方向 450 GB/s、α = 0.822 μs(MSCCL++ 实测 NVLink 单向延迟)。
T_ring = 2(n−1)·α + 2(n−1)·M/(n·B)
└─启动项─┘ └────接近 2M/B────┘
2. 切分方式决定通信原语
| 并行 | 需要什么通信 | 数据量 |
|---|---|---|
| DP(训练) | 梯度 AllReduce | 全参数梯度 |
| TP | 每层输出部分和 AllReduce(或 ReduceScatter + AllGather) | m×h(每 token 10 KiB) |
| PP | 相邻阶段交接激活 | m×h 每边界 |
| EP | All-to-All(token 送到专家所在卡) | t_e×h |
| SP/CP | 收集 / 交换 K、V | 与序列分片同量 |
判据:TP 每层两次归约(注意力输出 + FFN 输出),64 层共 128 次。 通信次数是层数量级,不是请求量级。
3. 环形 AllReduce:轮次与字节(E-S23-063)
n 卡、每卡部分和 M 字节,分成 n 块
ReduceScatter:n−1 轮 → 每卡持有一块的完整和
AllGather: n−1 轮 → 每卡收齐全部
每卡总发送量:2(n−1)M/n
总时间:T = 2(n−1)α + 2(n−1)M/(nB)
跟踪块 0(四卡,贡献 1/10/100/1000):沿途 1 → 11 → 111 → 1111(卡 3 持有完整和)。
3.1 TP 的实测账
M = 10 KiB、B = 450 GB/s、α = 0.822 μs:
| TP | 本地内存访问 | 128 次归约 | 单步时间 |
|---|---|---|---|
| 1 | 29.35 ms | 0 | 29.35 ms |
| 2 | 14.68 ms | 0.21 ms | 14.89 ms |
| 4 | 7.34 ms | 0.64 ms | 7.97 ms |
| 8 | 3.67 ms | 1.48 ms | 5.15 ms |
TP8 单次归约:14 轮 → 14×0.822 = 11.51 μs 启动 + 17.5 KiB 传输 ≈ 0.04 μs → 11.55 μs
边际收益:2→4 卡净省 6.92 ms;4→8 卡净省只剩 2.83 ms。
判据:优化方向由"哪一项占主导"决定:
| 手段 | 效果(TP8、128 次归约) |
|---|---|
| 带宽翻倍 | 省约 2.5 μs(≈0) |
| 每轮启动减半 | 省约 0.74 ms |
3.2 跨机 TP16 反而更慢(E-S23-064)
两台 HGX H100、16 卡、TP16,一次归约 30 轮过网卡:
| 方案 | 本地 | 每次归约 | 128 次 | 单步 |
|---|---|---|---|---|
| TP8(机内) | 3.67 ms | 11.55 μs | 1.48 ms | 5.15 ms |
| TP16(跨机,理论环) | 2.48 ms | 约 113 μs | 14.5 ms | 16.9 ms |
| TP16(实际通信库,nccl-tests 16 KiB 档实测) | 2.48 ms | 32.74 μs | 4.19 ms | 6.67 ms |
TP16 比 TP8 慢约 1.52 ms:权重读取减半(−1.19 ms),但同步成本从 11.55 → 32.74 μs(×2.8)
判据:跨机并行必须先算"省下的本地时间"是否大于"增加的同步时间"。 这里几乎打平且为负。
4. 超节点拓扑:基数与收敛比(E-S23-065)
一颗交换芯片的端口数 = 基数(radix)
第三代 NVSwitch:64 个 NVLink 4 端口,每端口每方向 25 GB/s
| 端口分配 | 下联 GPU 带宽 | 上联带宽 | 说明 |
|---|---|---|---|
| 32 下联 / 32 上联 | 800 GB/s | 800 GB/s | 无收敛 |
| 48 下联 / 16 上联 | 1,200 GB/s | 400 GB/s | 3:1 收敛 |
DGX H100 的 NVLink Switch System:每节点只引出全部 NVLink 带宽的一半(2:1 收敛)。
判据:端口总数不变时,多接 GPU 就少上联带宽。 收敛比直接决定"跨交换机的集合通信能跑多快"——这是超节点规模的真实上限。
5. 内存池:借用不增加物理内存(E-S23-066)
场景:4 个节点 × 80 GB = 320 GB;任务需求 100 / 60 / 40 / 40 = 240 GB。
总量够(240 < 320),但任务 0 的 100 GB > 单节点 80 GB
做法:把任务 0 的 20 GB 放到节点 1 的空闲区。
| 节点 | 借用前 | 借用后 |
|---|---|---|
| 0 | 100(超 20) | 80 |
| 1 | 60 | 80(60 自己 + 20 借出) |
| 2 | 40 | 40 |
| 3 | 40 | 40 |
| 空闲合计 | 100 | 80 |
工作集仍是 100 GB:80 GB 本地 + 20 GB 远端
借用没增加物理内存,只是让任务用上别处的空闲
判据:内存池解决"分布不均",不解决"总量不足"。 代价是远端访问——那 20 GB 的每次读写都要过互联(J14 的 α + V/R)。
5.1 借用的边界条件
| 项 | 要求 |
|---|---|
| 谁提供 | 提供方开放一段区域 |
| 谁使用 | 借用方建立地址映射 |
| 权限 | 系统管理访问权限 |
| 生命周期 | 记录何时可释放/重分配 |
| 独占 vs 共享 | 独占:原持有者等归还;共享:按一致性/同步规则访问 |
6. 给定模型与硬件,怎么选切分(§6.7)
| 步骤 | 判断 | 不通过就换 |
|---|---|---|
| 1 | 单卡容量够不够(含 KV p95) | 不够 → TP/PP/EP 分散权重 |
| 2 | TP 卡数 ≤ KV 头数? | 超了 → 只增副本(J18) |
| 3 | 跨机同步成本 vs 本地节省? | 不划算 → 留在机内(TP16 案例) |
| 4 | 交换收敛比够不够? | 2:1 以上收敛 → 集合通信排队 |
| 5 | PP 气泡 b/(q+b−1) 可接受? |
否 → 减阶段或加 micro-batch |
| 6 | 内存池能补多少空闲? | 只补不均衡,补不了总量 |
7. 可复算(实测)
$ cd /root/博客运营官/blog-v2 && python3 tools/s23_book_calc.py | tail -10
环形 AllReduce: T = 2(n−1)α + 2(n−1)M/(nB),α=0.822 μs,B=450 GB/s,M=10 KiB
TP8: 14 轮 → 启动 11.51 μs + 传输 0.04 μs = 11.55 μs
TP1: 本地 29.35 ms + 0 ms = 29.35 ms
TP2: 本地 14.68 ms + 0.21 ms = 14.89 ms
TP4: 本地 7.34 ms + 128 次归约 0.64 ms = 7.98 ms
TP8: 本地 3.67 ms + 128 次归约 1.48 ms = 5.15 ms
TP16 跨机: 2.48 + 128×32.74 μs = 6.67 ms(TP8 为 5.15 ms,慢 1.52 ms)
理论环跨机(30 轮 × 3.76 μs): 2.48 + 14.4 ms = 16.9 ms
环 4 卡逐轮: 1 → 11 → 111 → 1111(块 0 在卡 3 完成)
端口分配: 32/32 → 上联 800 GB/s;48/16 → 上联 400 GB/s(3:1 收敛)
内存池: 320 GB 总容量 / 240 GB 需求,借 20 GB → 占用 80/80/40/40,空闲剩 80 GB
8. 前提与边界
| 结论 | 成立条件 | 不成立时 |
|---|---|---|
环模型 2(n−1)α + … |
等轮同步、每卡等带宽 | 分层算法(树/双环)→ 轮次更少 |
| TP8 最优 | KV 头数 ≤ 8、机内 NVLink | 跨机 → 用实测 32.74 μs 而非理论环 |
| 收敛比决定上限 | 跨交换机流量占比高 | 全机内 → 收敛比无影响 |
| 内存池补不均衡 | 远端访问代价可接受 | 热点数据 → 远端带宽成瓶颈 |
9. 常见误区
| 误区 | 纠正 |
|---|---|
| "带宽翻倍,集合通信就快一倍" | TP8 只省 2.5 μs,启动项主导 |
| "卡越多越快" | TP16 跨机 6.67 ms > TP8 5.15 ms |
| 用理论环估跨机通信 | 实际库用分层算法:113 μs → 32.74 μs |
| "内存池能扩容" | 它只是把别处空闲借过来,总量不变 |
| 忽略收敛比 | 48/16 上联只有 400 GB/s,是 3:1 收敛 |
10. 自测
n=8, M=10 KiB, α=0.822 μs, B=450 GB/s,一次环形 AllReduce 多久?哪项占主导?- 为什么 TP16 的本地时间只从 3.67 降到 2.48 ms?
- 64 端口 NVSwitch 按 32/32 与 48/16 分配,上联带宽各多少?
- 4×80 GB、需求 100/60/40/40,借 20 GB 后各节点占用与总空闲?
答案
14×0.822 = 11.51 μs启动 + 0.04 μs 传输 ≈ 11.55 μs;启动主导。- 权重减半,但只有 8 个 KV 头 → TP16 时每头两份副本,每卡 KV 读取与 TP8 相同。
- 800 GB/s(无收敛)与 400 GB/s(3:1 收敛)。
- 80/80/40/40;总空闲
320−240 = 80 GB。
11. 下一篇
S23-J20 · 跨节点网络与远程访问路径 —— 进入第 7 章:一次跨机通信经过哪些设备、RDMA 为什么快、拥塞与尾延迟从哪来。