从0训练LLM · 现代大模型体系 实验 实验 ≈ 40 分钟 页内实验 ×2
C10 并行:一张卡不够怎么办 实验课

实验课:给锚点在 8 张卡和 64 张卡上各配一套并行方案

实验课:给锚点配一套并行方案
前四课和两条岔路各切了一维。这一课把它们组合到同一批卡上:先写预测,再在设备网格里现算每卡显存、每一维的通信走哪条链路、流水线气泡多大,最后和 Llama 3、DeepSeek-V3 公开的真实配置对照。这是计算实验:数字来自公式与公开报告,不是我们跑出来的。
🧪

这一课不讲新概念。前四课与两条岔路各切了一维,这一课把它们组合到同一批卡上。每一步都先写预测,再在设备网格里核对。

这是计算实验,不是训练实验。我们的项目只有一块 GPU,做不了多卡训练;下面的每个数都由公式现算(参数量与维度取自锚点 Qwen3.8-27B 的官方 config),时间是「字节 ÷ 带宽」的推演,对照用的是 Llama 3 与 DeepSeek-V3 公开的真实配置。

这一课先不碰:MoE 的专家并行这一维(锚点是稠密模型;见岔路 2);通信与计算的重叠、段间不均衡(网格里都忽略了,口径写在组件底部)。

一、一台机:8 张 80 GB 的卡,序列 4,096

从已有出发 · 训练一步摊到多张卡 已学本课还没学
取一批
前向 ZeROTPPPCPEP
loss
反向
梯度同步 DP
优化器更新
每课多切一维:
数字口径:构建时由锚点 Qwen3.8-27B 与 DeepSeek-V3 的官方 config 按公式现算;卡数按 8 张计。本章没有我们自己的多卡实测。

先预测:8 张卡上,锚点每卡模型状态最少能压到多少?(提示:16 字节 × 参数量 ÷ 8。)

同一个 TP 组同一个 CP 组 同一条流水线(PP)同一个 DP 组
🎯

试三件事:① 默认是 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 GB2.7 GB58.2 GB ✓DP 145.9 GB · TP 无 · PP 无—
DP 8 · ZeRO-3 · 选择性重计算55.6 GB45.6 GB101.2 GB ✗DP 145.9 GB · TP 无 · PP 无—
TP 8 · 选择性重计算55.6 GB5.7 GB61.3 GB ✓DP 无 · TP 150.3 GB · PP 无—
TP 2 × PP 4 · 全量重计算55.6 GB1.3 GB56.9 GB ✓DP 无 · TP 21.5 GB · PP 0.7 GB37.5%

读这张表要看出三件事:

  1. 8 张卡的模型状态有一个地板:无论怎么切,16 字节 × 27,781,427,952 ÷ 8 = 55.6 GB。DP + ZeRO-3、TP 8、TP 2 × PP 4 都落在这个地板上——切法不同,省下的是同一份冗余。
  2. 差别在激活和通信:ZeRO 不切激活,所以选择性重计算放不下;TP 切激活,放得下,但同步的是激活、每层都要等。
  3. 流水线在一台机里不划算:它省的通信(每个 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 不跨机

同一个 TP 组同一个 CP 组 同一条流水线(PP)同一个 DP 组
🎯

试三件事:① 点卡 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 GB0.3 GB7.3 GB ✓TP 18.8 GB(NVLink) · PP 0.7 GB(IB)87.5%
TP 8 × PP 8 · 全量重计算 · m = 326.9 GB0.3 GB7.3 GB ✓TP 75.2 GB(NVLink) · PP 2.7 GB(IB)21.9%
TP 8 × PP 2 × DP 4 · ZeRO-112.2 GB0.3 GB12.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 :

卡数TPCPPPDP序列长度每 DP 的 batch每步 token(现算)TFLOPs/卡BF16 MFU
8,1928116648,1923216,777,21643043%
16,38481161288,1921616,777,21640041%
16,384816168131,0721616,777,21638038%

三处可以用本章的课来读: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、KV 头几个)、集群带宽(NVLink 与 IB 差几倍)和序列长度共同决定。

四、为项目拍板

🧭

你要拍板的三件事(对应章首页的项目里程碑):

  1. 一台 8 × 80 GB 的机器训锚点(s = 4,096):ZeRO 几级?要不要 TP?激活怎么存?写下你的方案,和第一部分的表逐项对上。
  2. 64 张卡:TP、PP、DP 各取多少?说出通信最重的一维、每步每卡多少字节、走 NVLink 还是 IB;m 取多少让气泡可以接受。
  3. 我们的 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%。

演进地图:走完一轮

并行的演进:每切一维,都是被上一代的某个真数字逼出来的
  1. 起点 一张卡 C9 的结论
    解决了训练一步的全部东西都在一张卡上,不需要任何通信。
    卡在锚点的模型状态 16 字节 × 27,781,427,952 = 444.5 GB,是 80 GB 的 5.6 倍;就算放得下也太慢:DeepSeek-V3 预训练用了 2,664K H800 GPU 小时,一张卡约 304 年。
  2. 第一代 数据并行 + ring all-reduce ring 来自 HPC(2009),2017–2018 进入深度学习
    解决了每卡一份完整模型、算 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。
  3. 第一代 · 工程 分桶,边反向边同步 PyTorch DDP(Li et al. 2020)
    解决了反向逐层产出梯度,攒满一桶(默认 25 MiB)就先发,通信藏到后面几层的反向里。
    卡在DP 的通信量每步固定:锚点 8 卡每卡 97.2 GB,按 IB 50 GB/s 要 1.94 s;每卡 4,096 个 token 的反向只有约 1.05 s(推演)——token 太少就藏不住。
  4. 第二代 ZeRO-1 / 2 / 3 · FSDP Rajbhandari 2019;PyTorch FSDP 2023
    解决了不再每卡存一份:8 卡上 444.5 → 152.8 → 104.2 → 55.6 GB(依次切优化器状态、梯度、参数)。
    卡在切参数后每步多一次 all-gather,通信是 DP 的 1.5 倍;激活不切:s = 4,096 的选择性重计算要 45.6 GB,放不进剩下的 24.4 GB。
  5. 第三代 张量并行(层内切矩阵) Megatron-LM(Shoeybi 2019)
    解决了第一个矩阵按列切、第二个按行切,一个 MLP 只要一次 all-reduce;t = 8 配序列并行,激活 45.6 → 5.7 GB。
    卡在每层前向 2 次、反向 2 次同步:每 4,096 个 token 每卡要发 18.8 GB,每层都要等——只能放在机内。ZeRO 原文实测:跨两台 DGX-2,每卡约 5 TFLOPS,不到峰值 5%。
  6. 解决了按层切,跨机只传段与段之间的激活;切 micro-batch 填满流水线;1F1B 把在途激活从 m 份压到 p 份;interleaved 把气泡除以 v。
    卡在首尾必然空等:p = 8、m = 32 时气泡 (p−1)/m = 21.9%(占总时间 17.9%),interleaved v = 4 也还有 5.5%。
  7. 2023–2024 Zero Bubble · DualPipe Qi 2023;DeepSeek-V3 2024
    解决了反向拆成「对输入」B 与「对权重」W,W 拿去填空泡(F = B = W 时 ZB-H1 的气泡是 1F1B 的 1/3);DualPipe 从两头喂 micro-batch,并把 all-to-all 藏到另一批计算后面。
    卡在DualPipe 要存两份参数;调度更复杂;通信只是被藏住了,量一点没少。
  8. 岔路 · 长序列 序列并行 / 上下文并行 2021–2023:SP、Ring Attention、Ulysses
    解决了128K 的序列按序列切给多张卡;zig-zag 头尾配对,把因果负载 10 : 26 : 42 : 58 配平成每卡一样多。
    卡在每个全注意力层都要在卡之间传 K、V:锚点 s = 131,072、8 卡时每层 0.5 GB;Ulysses 按头切,KV 只有 4 个头。
  9. 岔路 · MoE 专家并行 + all-to-all GShard 2020 → DeepSeek-V3 2024
    解决了DeepSeek-V3 的 654B 路由专家参数分到 64 张卡,每卡每层 4 个;每个 token 最多去 4 个节点。
    卡在跨节点 IB 50 GB/s 只有 NVLink 160 GB/s 的约 1/3,跨节点 EP 的计算与通信约 1 : 1;热门专家所在的卡成为掉队者(→ C11)。
  10. 2021 起 组合:3D / 4D / 5D 并行 Narayanan 2021;Llama 3;DeepSeek-V3 你在这里
    解决了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。
    卡在没有万能配置:每种组合都要先算清每卡显存、每一维的通信走哪条链路、气泡多大(实验课)。
数字口径:锚点与 DeepSeek-V3 的数字由 anchor-model.json / frontier-models.json 的官方 config 在构建时按公式现算(GB = 10⁹ 字节,卡按 80 GB 计);「分桶」一行的时间是推演(有效算力 400 TFLOPS、IB 50 GB/s);5 TFLOPS 出自 ZeRO 原文 §1;GPU 小时、并行配置、带宽出自 DeepSeek-V3 报告 §1、§3.1–3.2(本地 PDF);Llama 3 的配置出自其报告表 4。本章没有我们自己的多卡实测。

一句话

📌

并行方案是几个维度的乘积:TP 放节点内、PP 跨节点、DP(配 ZeRO)在最外层,长序列加 CP、MoE 加 EP;每种组合都能先用公式算出每卡显存、通信和气泡,再去跑。

下一个缺口

放得下、算得完了。想要更多参数,却不想要更多算力? → C11 更大更省:MoE、线性 / 稀疏注意力与长上下文

本章岔路 2 已经把 MoE 的专家怎么跨卡讲清;C11 讲 MoE 本身:为什么每个 token 只算几个专家就够、专家为什么会抢活、专家该大还是小。锚点 Qwen3.8 那 48 层线性注意力(岔路 1 里「只传一个固定大小的状态」的那一种),也在 C11 揭晓。