实验课:给锚点在 8 张卡和 64 张卡上各配一套并行方案
这一课不讲新概念。前四课与两条岔路各切了一维,这一课把它们组合到同一批卡上。每一步都先写预测,再在设备网格里核对。
这是计算实验,不是训练实验。我们的项目只有一块 GPU,做不了多卡训练;下面的每个数都由公式现算(参数量与维度取自锚点 Qwen3.8-27B 的官方 config),时间是「字节 ÷ 带宽」的推演,对照用的是 Llama 3 与 DeepSeek-V3 公开的真实配置。
这一课先不碰:MoE 的专家并行这一维(锚点是稠密模型;见岔路 2);通信与计算的重叠、段间不均衡(网格里都忽略了,口径写在组件底部)。
一、一台机:8 张 80 GB 的卡,序列 4,096
切什么每张卡一份完整模型,各算全局 batch 的 1/N;反向之后把 N 份梯度加起来,每张卡用同一份梯度更新。
多出的通信all-reduce 梯度
有多大锚点 BF16 梯度 55.6 GB;8 卡 ring all-reduce 每卡每步发 97.2 GB。
切什么优化器状态、梯度、参数按 N 份切开,每张卡只存、只更新自己那份;ZeRO-3 在用到一层之前把这一层的参数拼回来。
多出的通信reduce-scatter 梯度 + all-gather 参数
有多大8 卡 ZeRO-3:每卡模型状态 55.6 GB(原来 444.5 GB);通信每卡每步 145.9 GB,是 DP 的 1.5 倍。
切什么一层里的矩阵乘拆给 t 张卡:第一个矩阵按列切、第二个按行切,非线性各算各的,最后一次 all-reduce。
多出的通信每层 all-reduce(前向 2 次、反向 2 次)
有多大t = 8、每 4,096 个 token:每卡发 18.8 GB,每层都要等它做完;所以只放在一台机的 8 张卡里。
切什么把 64 层按顺序切成 p 段放在不同的卡上,每段做完把激活交给下一段,反向时再把梯度传回来。
多出的通信段与段之间 send / recv 激活
有多大锚点每段 8 层(p = 8);每个 micro-batch(4,096 个 token)在段间传 0.0 GB 激活;代价是气泡:p = 8、m = 32 时 21.9%。
切什么一条很长的序列切给几张卡,每张卡只存自己那段 token 的激活;注意力需要全部 K、V,就让 K、V 块沿环传一圈。
多出的通信注意力里沿环传 K、V
有多大s = 131,072、8 卡:每张卡每一步传出一块 K、V 0.1 GB,每个全注意力层传 7 块。
切什么MoE 的专家分到不同卡上,token 用 all-to-all 发到持有对应专家的卡,算完再 all-to-all 收回来。
多出的通信FFN 前后各一次 all-to-all
有多大DeepSeek-V3:256 个路由专家 ÷ 64 张卡 = 每卡每层 4 个;每个 token 最多去 4 个节点。
先预测:8 张卡上,锚点每卡模型状态最少能压到多少?(提示:16 字节 × 参数量 ÷ 8。)
试三件事:① 默认是 DP 8 + ZeRO-3 + 全量重计算:读每卡合计,再把激活换成「选择性重计算」,看它怎么越过 80 GB;② 把 TP 调到 8(DP 自动变成 1),激活仍用选择性重计算——又放得下了,读通信表:最重的一维从 DP 换成了 TP;③ 试 TP 2 × PP 4:读「流水线气泡」,再把每步 micro-batch 数从 8 调到 32。点任意一张卡,看它的 TP 组、流水线、DP 组各是哪几张。
对答案。下面每一行都用和组件相同的公式在构建时算出(m = 每步 micro-batch 数;DP 组的通信在 ZeRO-3 时按 3Ψ 计):
| 8 卡方案 | 每卡模型状态 | 激活 | 合计 | 每步每卡通信(都在机内 NVLink) | 气泡 (p−1)/m |
|---|---|---|---|---|---|
| DP 8 · ZeRO-3 · 全量重计算 | 55.6 GB | 2.7 GB | 58.2 GB ✓ | DP 145.9 GB · TP 无 · PP 无 | — |
| DP 8 · ZeRO-3 · 选择性重计算 | 55.6 GB | 45.6 GB | 101.2 GB ✗ | DP 145.9 GB · TP 无 · PP 无 | — |
| TP 8 · 选择性重计算 | 55.6 GB | 5.7 GB | 61.3 GB ✓ | DP 无 · TP 150.3 GB · PP 无 | — |
| TP 2 × PP 4 · 全量重计算 | 55.6 GB | 1.3 GB | 56.9 GB ✓ | DP 无 · TP 21.5 GB · PP 0.7 GB | 37.5% |
读这张表要看出三件事:
- 8 张卡的模型状态有一个地板:无论怎么切,16 字节 × 27,781,427,952 ÷ 8 = 55.6 GB。DP + ZeRO-3、TP 8、TP 2 × PP 4 都落在这个地板上——切法不同,省下的是同一份冗余。
- 差别在激活和通信:ZeRO 不切激活,所以选择性重计算放不下;TP 切激活,放得下,但同步的是激活、每层都要等。
- 流水线在一台机里不划算:它省的通信(每个 micro-batch 在段间只传 41.9 MB 激活)在机内并不稀缺,却带来气泡。
🔍 那一台机上到底该选哪个?
按上面的账,一台 8 卡机上训锚点、序列 4,096,最省事的是 DP 8 + ZeRO-3 + 全量重计算:模型状态落在地板上,激活只有 2.7 GB(= 2.5 GiB,C9 第 5 课的写法),全部通信是可以分桶、预取、与计算重叠的集体通信。代价是全量重计算多花约一次前向的算力(C9 第 5 课)。想省这份算力,就换 TP 8 + 选择性重计算,代价是每层阻塞的 all-reduce。两者都能在一台机内用 NVLink 完成——这个选择没有标准答案,要看实测吞吐。
二、8 台机:64 张卡,TP 不跨机
试三件事:① 点卡 0,看它的 TP 组(同一台机的 8 张卡,走 NVLink)、流水线(隔一台机,走 IB)、DP 组(走 IB)各是哪几张;② 把 TP 调到 8 以上是不可能的——网格只给到 8;把 PP 调到 8,读气泡,再把 m 调到 32;③ 把 CP 调到 8、序列调到 131,072,看每卡激活和 CP 那一行通信。
| 64 卡方案 | 每卡模型状态 | 激活 | 合计 | 每步每卡通信 | 气泡 (p−1)/m |
|---|---|---|---|---|---|
| TP 8 × PP 8 · 全量重计算 | 6.9 GB | 0.3 GB | 7.3 GB ✓ | TP 18.8 GB(NVLink) · PP 0.7 GB(IB) | 87.5% |
| TP 8 × PP 8 · 全量重计算 · m = 32 | 6.9 GB | 0.3 GB | 7.3 GB ✓ | TP 75.2 GB(NVLink) · PP 2.7 GB(IB) | 21.9% |
| TP 8 × PP 2 × DP 4 · ZeRO-1 | 12.2 GB | 0.3 GB | 12.5 GB ✓ | TP 75.2 GB(NVLink) · PP 0.7 GB(IB) · DP 5.2 GB(IB) | 12.5% |
64 张卡时,每卡的模型状态轻松降到几 GB,问题变成了通信走哪条链路:TP 那一行字节最多,但它在机内;跨机的只有流水线的段间激活和 DP 的梯度同步,都比 TP 小一两个数量级。这正是现代配置的排法——越内层的维度通信越重、越要放在带宽高的链路上。
三、和真实配置对照
Llama 3 的报告公开了三种配置(表 4),4D 并行按 [TP, CP, PP, DP] 从内到外排,其中 DP 是 FSDP 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条官方自报的配置与 MFU;最后一列是按 DP × 每 DP 的 batch × 序列长度现算的每步 token 数,报告写作 16M。 出处Llama 3 报告 §3.3、表 4(需联网) ↗需联网 :
| 卡数 | TP | CP | PP | DP | 序列长度 | 每 DP 的 batch | 每步 token(现算) | TFLOPs/卡 | BF16 MFU |
|---|---|---|---|---|---|---|---|---|---|
| 8,192 | 8 | 1 | 16 | 64 | 8,192 | 32 | 16,777,216 | 430 | 43% |
| 16,384 | 8 | 1 | 16 | 128 | 8,192 | 16 | 16,777,216 | 400 | 41% |
| 16,384 | 8 | 16 | 16 | 8 | 131,072 | 16 | 16,777,216 | 380 | 38% |
三处可以用本章的课来读:TP 一直是 8(机内,第 3 课);序列拉到 131,072 时加了 16 路 CP,同时 DP 从 128 降到 8,每步 token 数不变(岔路 1);长序列那一行 MFU 最低(38%)——报告没有把原因逐项拆开;按本章的账,CP 这一维多出了 K、V 的通信。
DeepSeek-V3 走了另一条路:2,048 张 H800,16 路流水线 × 跨 8 节点的 64 路专家并行 × ZeRO-1 数据并行,完全不用张量并行;用 DualPipe 把专家并行的 all-to-all 与流水线通信藏起来,用重计算、CPU 上的 EMA、共享 embedding 与输出头把显存压下去 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条官方自报。它是 MoE 模型,专家并行这一维不在上面的网格里。 出处DeepSeek-V3 报告 §3.1–3.2(本地 PDF) ↗ 。两家都做到了千卡级训练,并行配置没有唯一正解:它由模型结构(稠密还是 MoE、KV 头几个)、集群带宽(NVLink 与 IB 差几倍)和序列长度共同决定。
四、为项目拍板
你要拍板的三件事(对应章首页的项目里程碑):
- 一台 8 × 80 GB 的机器训锚点(s = 4,096):ZeRO 几级?要不要 TP?激活怎么存?写下你的方案,和第一部分的表逐项对上。
- 64 张卡:TP、PP、DP 各取多少?说出通信最重的一维、每步每卡多少字节、走 NVLink 还是 IB;m 取多少让气泡可以接受。
- 我们的 3,688,704 参数小模型:模型状态 56.3 MiB,要不要并行?
验收写成可以核对的数:每卡显存分项与网格现算值逐项一致、合计 ≤ 80 GB;通信最重的一维与它的链路写清楚;第 3 课验算台的两个结论(列切 → 行切差为舍入级、按行切差不为 0)能复现。
这些数的边界:显存按 ZeRO 原文与 Korthikanti 2022 的记账(忽略 embedding、lm_head 造成的段间不均、临时缓冲与显存碎片);通信按 ring 集体通信每卡发出的字节(忽略延迟、重叠与 CP 的反向);时间是推演 证据等级 · 有理论动机 有数学或机制上的理由说明它可能有效,但没有证明它一定更好。最后是否采用,仍然要看实验。 本条公式本身是记账算术,可证明;但把字节换成秒、把多维叠加成一步的时间,依赖带宽与重叠的假设,只能当作量级估计。 出处待补 。真实系统的吞吐要实测:Llama 3 在 16K 张卡上的 MFU 是 38–43%,不是 100%。
演进地图:走完一轮
- 解决了训练一步的全部东西都在一张卡上,不需要任何通信。卡在锚点的模型状态 16 字节 × 27,781,427,952 = 444.5 GB,是 80 GB 的 5.6 倍;就算放得下也太慢:DeepSeek-V3 预训练用了 2,664K H800 GPU 小时,一张卡约 304 年。
- 解决了每卡一份完整模型、算 1/N 的数据,每步把梯度加起来。ring 让每卡只收发 2(N−1)/N 倍梯度:锚点 8 卡 97.2 GB、64 卡 109.4 GB(汇总到 0 号卡的朴素做法:388.9 GB → 3,500 GB)。卡在只解决「慢」:每张卡仍要放下完整的 444.5 GB。
- 解决了反向逐层产出梯度,攒满一桶(默认 25 MiB)就先发,通信藏到后面几层的反向里。卡在DP 的通信量每步固定:锚点 8 卡每卡 97.2 GB,按 IB 50 GB/s 要 1.94 s;每卡 4,096 个 token 的反向只有约 1.05 s(推演)——token 太少就藏不住。
- 解决了不再每卡存一份:8 卡上 444.5 → 152.8 → 104.2 → 55.6 GB(依次切优化器状态、梯度、参数)。卡在切参数后每步多一次 all-gather,通信是 DP 的 1.5 倍;激活不切:s = 4,096 的选择性重计算要 45.6 GB,放不进剩下的 24.4 GB。
- 解决了第一个矩阵按列切、第二个按行切,一个 MLP 只要一次 all-reduce;t = 8 配序列并行,激活 45.6 → 5.7 GB。卡在每层前向 2 次、反向 2 次同步:每 4,096 个 token 每卡要发 18.8 GB,每层都要等——只能放在机内。ZeRO 原文实测:跨两台 DGX-2,每卡约 5 TFLOPS,不到峰值 5%。
- 解决了按层切,跨机只传段与段之间的激活;切 micro-batch 填满流水线;1F1B 把在途激活从 m 份压到 p 份;interleaved 把气泡除以 v。卡在首尾必然空等:p = 8、m = 32 时气泡 (p−1)/m = 21.9%(占总时间 17.9%),interleaved v = 4 也还有 5.5%。
- 解决了反向拆成「对输入」B 与「对权重」W,W 拿去填空泡(F = B = W 时 ZB-H1 的气泡是 1F1B 的 1/3);DualPipe 从两头喂 micro-batch,并把 all-to-all 藏到另一批计算后面。卡在DualPipe 要存两份参数;调度更复杂;通信只是被藏住了,量一点没少。
- 解决了128K 的序列按序列切给多张卡;zig-zag 头尾配对,把因果负载 10 : 26 : 42 : 58 配平成每卡一样多。卡在每个全注意力层都要在卡之间传 K、V:锚点 s = 131,072、8 卡时每层 0.5 GB;Ulysses 按头切,KV 只有 4 个头。
- 解决了DeepSeek-V3 的 654B 路由专家参数分到 64 张卡,每卡每层 4 个;每个 token 最多去 4 个节点。卡在跨节点 IB 50 GB/s 只有 NVLink 160 GB/s 的约 1/3,跨节点 EP 的计算与通信约 1 : 1;热门专家所在的卡成为掉队者(→ C11)。
- 解决了Llama 3 405B:[TP, CP, PP, DP] = 8 × 1 × 16 × 128,16,384 张 H100,BF16 MFU 41%;DeepSeek-V3:PP 16 × EP 64 × ZeRO-1 DP,不用 TP。卡在没有万能配置:每种组合都要先算清每卡显存、每一维的通信走哪条链路、气泡多大(实验课)。
一句话
并行方案是几个维度的乘积:TP 放节点内、PP 跨节点、DP(配 ZeRO)在最外层,长序列加 CP、MoE 加 EP;每种组合都能先用公式算出每卡显存、通信和气泡,再去跑。
下一个缺口
放得下、算得完了。想要更多参数,却不想要更多算力? → C11 更大更省:MoE、线性 / 稀疏注意力与长上下文
本章岔路 2 已经把 MoE 的专家怎么跨卡讲清;C11 讲 MoE 本身:为什么每个 token 只算几个专家就够、专家为什么会抢活、专家该大还是小。锚点 Qwen3.8 那 48 层线性注意力(岔路 1 里「只传一个固定大小的状态」的那一种),也在 C11 揭晓。