并行:一张卡不够怎么办
主线定位
切什么每张卡一份完整模型,各算全局 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 个节点。
- 上游 · C9 精度与显存:训练时一个参数要 16 字节(16 位权重 2、梯度 2,FP32 主权重与 Adam 的 m、v 各 4),锚点 27,781,427,952 个参数就是 444.5 GB,是一张 80 GB 卡的 5.6 倍,还没算激活。C9 已经把每个数的位数、激活的存法都压到了头。
- 本章:一张卡不够,就用很多张。问题变成「按哪一维切」:切 batch(数据并行)、切模型状态(ZeRO)、切层内矩阵(张量并行)、切层(流水线并行),岔路再切序列(上下文并行)和专家(专家并行)。每切一维,就多付一种通信代价;现代做法把这些通信藏到计算后面。
- 下游 · C11 更大更省:并行解决「放得下、算得完」。C11 问另一件事:想要更多参数,却不想要更多算力——MoE。本章岔路 2 先把 MoE 的专家怎么跨卡讲清。
本章的贯穿任务:接着 C9 的「在一张 80 GB 的卡上训锚点的一步」,把这一步摊到 8 张 80 GB 的卡上(一台 8 卡机),再扩到 64 张。上面这条流水线每一课多切一维;点任一维度,能看到它切了什么、多出哪种通信、在锚点上有多大。贯穿例句「小明把苹果给了小王」在第 1 课是全局 batch 里分给 0 号卡的那一条,在第 3 课是张量并行验算的输入。
本章的数字从哪来(先说清楚)
我们的项目是单机单卡(Apple M5 Max),做不了真实的多卡实验,所以本章没有我们自己跑出的训练数据。页面上的数字只有三种来源:
- 公式现算:通信量、显存、气泡率、负载,全部在浏览器里按公式和真实算法算出来,参数量与维度取自锚点 Qwen3.8-27B 与 DeepSeek-V3 的官方 config。算法演示用的小数(环上每张卡的梯度块、张量并行的权重、专家路由的打分)是固定种子生成的测试输入,组件里都标明了。
- 推演:凡是「要多少秒」的数,都是「FLOPs ÷ 有效算力、字节 ÷ 带宽」的估算,默认带宽取 DeepSeek-V3 报告里 H800 集群的数字(节点内 NVLink 160 GB/s、节点间 IB 50 GB/s),组件里标「推演」。
- 公开实测:ZeRO、Megatron、Zero Bubble、DeepSeek-V3、Llama 3 等报告里的数字,逐条给出处,并标明是作者自报。
唯一一个我们自己的数:C9 实验里,我们 3,688,704 个参数的小模型在 M5 Max 上 fp32 每秒约 81,031 个 token(c09-precision.json)。它的模型状态只有 16 × 3,688,704 字节 = 56.3 MiB,一张卡绰绰有余——本章的问题只属于大模型。
本章问题链
每一课只回答一个问题;上一课的失败,逼出下一课的问题。
| 课 | 这一课的问题 | 朴素方案在哪个真数字上失败 | 一句话 |
|---|---|---|---|
| 第 1 课 | 一张卡太慢,8 张卡怎么一起训同一个模型? | 梯度全部汇总到 0 号卡:锚点 8 卡时 0 号卡每步收 388.9 GB(ring 每卡只发 97.2 GB);而且每张卡仍要放下 444.5 GB | 数据并行每步把梯度加起来;ring 让每卡只收发约 2 倍梯度、与卡数几乎无关——但它只解决「慢」 |
| 第 2 课 | 每张卡都放不下怎么办? | 每卡一份:8 张卡存 8 份一模一样的 444.5 GB | ZeRO 不压缩任何数,只是不再存副本:8 卡上 444.5 → 152.8 → 104.2 → 55.6 GB |
| 第 3 课 | 一层的矩阵乘,能不能拆到几张卡上一起算? | 沿收缩维切第一个矩阵、各卡各自做非线性:结果与不切分差到 0.6 量级(浏览器实算) | 第一个矩阵按列切、第二个按行切,一个 MLP 只要一次 all-reduce;但每 4,096 个 token 每卡要发 18.8 GB,只能放机内 |
| 第 4 课 | 按层切到不同卡上,为什么有卡在等? | 整批依次流过 8 段:任何时刻只有 1 张卡在算,空等 87.5% | 切 micro-batch 让空等降到 (p−1)/m,1F1B 省激活,interleaved、Zero Bubble、DualPipe 继续填空 |
| 岔路 1 | 128K 的序列,激活放在哪? | 一条 131,072 token 的序列放一张卡:只存每层输入就要 85.9 GB | 按序列切;因果注意力让负载不均,zig-zag 头尾配对就精确均衡 |
| 岔路 2 | MoE 的几百个专家放在哪?token 怎么送过去? | 每张卡放全部专家:DeepSeek-V3 的路由专家光 BF16 权重就 1.31 TB | 专家分到各卡,两次 all-to-all 送去收回;限每个 token 最多 4 个节点,再把通信藏到计算后面 |
| 实验课 | 给锚点在 8 张卡和 64 张卡上各配一套并行方案 | — | 并行方案是几维的乘积:先用公式算清每卡显存、每一维的通信和气泡,再去跑 |
演进地图
- 解决了训练一步的全部东西都在一张卡上,不需要任何通信。卡在锚点的模型状态 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。卡在没有万能配置:每种组合都要先算清每卡显存、每一维的通信走哪条链路、气泡多大(实验课)。
三层交互
| 层 | 本章里的组件 | 在哪一课 |
|---|---|---|
| 概念动画 | 集体通信步进器(ring all-reduce、reduce-scatter、all-gather、all-to-all,逐步显示谁把哪一块发给谁);训练一步摊到多卡的累计数据流;演进地图 | 第 1、2 课,岔路 2,各课开头 |
| 算法模拟器(真算法、小数据) | 环上整数部分和逐元素核对;DP 分桶重叠泳道;ZeRO 切分账本;张量并行三种切法的真矩阵验算(贯穿例句的 5 × 4 输入);流水线调度由 GPipe / 1F1B / Megatron interleaved / Zero Bubble 的算法生成并按依赖排时间;因果注意力的 token 对精确计数与 zig-zag;DeepSeek-V3 的 node-limited 路由 | 第 1–4 课、岔路 1–2 |
| 真模型 / 真数据 | 锚点 Qwen3.8-27B、Qwen3-8B、DeepSeek-V3 的官方 config 代入全部组件;公开实测对照:ZeRO 原文图 1、Megatron 的扩展效率、DeepSeek-V3 的并行配置与带宽、Llama 3 表 4 的 4D 配置;设备网格把几维并行组合到 8 / 64 张卡上现算每卡显存、通信与气泡 | 第 2–4 课、实验课 |
第三层没有我们自己的多卡实验(单机单卡做不了),用「真 config 代入 + 公开实测对照」代替,页面上如实标注。
项目推进:给锚点定一套并行方案
对应 04-实践项目/MILESTONES.md 的「C10 并行」:单机单卡无法做真实的并行实验,本章不产出项目数据,而是把 C9 的显存分项代入各种并行方案做计算题。分工照旧:代码 AI 来写,决策你来做。
你要拍板的三件事
- 一台 8 × 80 GB 的机器,序列长度 4,096,训锚点:ZeRO 切到几级?要不要 TP?激活用哪种重计算?(第 2、3 课与实验课)
- 64 张卡(8 台机):TP、PP、DP 各取多少?为什么 TP 不跨机?每步 micro-batch 取多少,让气泡 (p−1)/m 可以接受?(第 3、4 课与实验课)
- 我们自己的 3,688,704 参数小模型要不要并行?它的模型状态 56.3 MiB。(第 1 课)
验收标准(全部可测):
- 每卡显存分项(权重 / 梯度 / 优化器状态 / 激活)的手算值与实验课设备网格的现算值逐项一致,合计 ≤ 80 GB。参考点:8 卡、ZeRO-3、全量重计算时模型状态 55.6 GB + 激活 2.7 GB;换成选择性重计算,激活 45.6 GB,放不下。
- 说出你的方案里通信最重的一维、每步每卡多少字节、走 NVLink 还是 IB。
- 在第 3 课的验算台里:列切 → 行切的最大差是浮点舍入级(< 10⁻¹²),朴素的按行切最大差不为 0,并能说出为什么。
- (可选,代码交给 AI)在项目上单卡模拟数据并行:把一个 batch 切成 8 份分别反向、梯度取平均,与整个 batch 的梯度逐元素比较,fp32 下最大差 < 10⁻⁶——这就是第 1 课「平均梯度 = 大 batch 梯度」的实证。
坑与带走
| 坑 | 症状 | 后果 | 怎么办 |
|---|---|---|---|
| 以为数据并行能让大模型放进小卡 | 加卡后照样 OOM | 白加卡 | DP 每卡仍是 16 字节/参数,放不下要靠 ZeRO / TP / PP(第 1、2 课) |
| 梯度同步不分桶、不重叠 | 反向结束后卡长时间空等 | 加卡后吞吐远低于线性 | 分桶边反向边同步;每卡 token 太少时通信藏不住(第 1 课) |
| 以为 ZeRO 会降低精度 | 不敢开 ZeRO | 白白浪费显存 | ZeRO 不改任何数的位数,只是不存副本(第 2 课) |
| ZeRO-3 不预取 | 每层都在等 all-gather | 通信全部露在外面 | 预取下一层参数;DeepSeek-V3 只用 ZeRO-1(第 2 课) |
| TP 跨机 | 吞吐骤降 | ZeRO 原文实测每卡约 5 TFLOPS,不到峰值 5% | TP 只放机内;跨机用 PP / DP(第 3 课) |
| TP 大于 KV 头数 | 形状对不上或显存超预期 | KV 头要复制 | 锚点只有 4 个 KV 头,TP = 8 时每个 KV 头复制到 2 张卡(第 3 课) |
| micro-batch 太少 | 流水线大段空等 | p = 8、m = 8 时空等占总时间 7/15 ≈ 46.7%(相对理想时间 (p−1)/m = 87.5%) | m 至少是 p 的几倍;或 interleaved / Zero Bubble(第 4 课) |
| 最后一段带 lm_head | 最后一张卡总是最慢 | 整条流水线等它 | 锚点的 lm_head 算量约等于 3.3 层,切段时要算进去(第 4 课) |
| 长序列连续切给 CP | 最后一张卡最忙 | 序列很长时 4 张卡的因果负载趋近 1 : 3 : 5 : 7 | zig-zag 头尾配对(岔路 1) |
| MoE 专家随意分布 | 跨节点流量大、热门专家的卡掉队 | all-to-all 等最慢的卡 | 限节点路由 + 负载均衡(岔路 2、C11) |
另有三个真实工程坑:数据并行时学习率要按全局 batch 设(回扣 C5);梯度累积与数据并行数学上等价,但一个是串行、一个是并行;BatchNorm 这类跨样本的统计在 DP 下只看本卡(LLM 用 RMSNorm,不受影响)。
这一章你应该带走的(各课「一句话」):
- 数据并行让每张卡拿一份完整模型、算 1/N 的数据,每步用 all-reduce 把梯度加起来;ring 让每张卡只收发约 2 倍梯度、与卡数几乎无关,分桶把通信藏到反向后面——但它只解决「慢」。
- ZeRO 不压缩任何数,只是让 N 张卡不再各存一份一样的优化器状态、梯度和参数;前两级通信和 DP 一样,切参数多 50%。
- 张量并行把一层的矩阵乘拆给 t 张卡:第一个矩阵按列切、第二个按行切,一个 MLP 只要一次 all-reduce;通信跟着 token 数走、每层都要等,所以只放机内。
- 流水线并行按层切,首尾必然空等;切成 m 个 micro-batch 让空等降到 (p−1)/m,1F1B 把在途激活压到 p 份,interleaved、Zero Bubble、DualPipe 继续填空。
- 长序列按序列切;因果注意力让连续切出的块负载不等,zig-zag 头尾配对就精确均衡;Ring 传 K、V,Ulysses 按头切、受头数限制。
- 专家并行用两次 all-to-all 把 token 送去收回;跨节点带宽只有节点内的约 1/3,所以限制每个 token 去的节点数,并把通信藏到另一批计算后面。
- 并行方案是几维的乘积:TP 放机内、PP 跨机、DP(配 ZeRO)在最外层,长序列加 CP、MoE 加 EP;每种组合都能先算清再跑。
深入这一章
每条都实际打开核对过(2026-09-26):写清它讲清了什么、对应哪一课、为什么推荐。外部链接都需要联网;论文暂时链 arXiv,之后会统一下载到本地。
🎮 想更直观 10–30 分钟
🔬 想吃透原理 1–3 小时
📄 想读原文 按需
排除了什么(也是筛选标准):① Lilian Weng《How to Train Really Large Models on Many GPUs?》(2021)——仍然可读,但被 Ultra-Scale Playbook 全面覆盖且后者更新;② HF 显存估算器——只算推理,C9 已说明不能拿来估训练;③ PyTorch《Understanding GPU Memory 1》——讲显存快照工具,与并行无关,留给 C9;④ 李宏毅 ML2025 助教课《利用多张 GPU 训练大型语言模型》——内容以 ZeRO、FlashAttention、Liger Kernel、量化为主,并行部分与 C9、本章第 2 课重叠;⑤ Picotron 教程(Playbook 作者亲讲)——以写代码为主,本课程的定位是理解与拍板,想自己实现时再看;⑥ 知乎「图解大模型训练」系列——脚本访问返回 403,无法核实,不列;⑦ ZOMI 酱《分布式并行》系列第 2 篇——内容与 RethinkFun 那条重叠,后者动画更清楚。