适用读者:要给训练任务配机器、要判断"先撞显存还是先撞时间"、要选 ZeRO 级别的人。
前置:S23-J12(训练预算)、J15(算力与带宽下界)、J18(并行维度)。
覆盖旧文:A-4343 §10.1–§10.2(容量与时间估算 + 状态分片/重计算/卸载,492 点)→ 492 点。
扩展点:E-S23-098(任务拆解:31,790 步 × 67.9 s)、E-S23-099(训练状态 16 B/参数 = 131.1 GB = 122.1 GiB)、E-S23-100(算力下界:够算要 6 张 H100,够装只要 2 张却要 77 天)、E-S23-101(ZeRO 0/1/2/3 各自切什么、代价是什么)。
上一篇:S23-J26 · 服务启动、扩缩容与部署比较
下一篇:S23-J28 · 流水调度、checkpoint 与强化学习。
1. 一句话结论
显存和时间是两道独立的门,先撞哪道要分开算。 Qwen3-8B 全参数训练:状态 131.1 GB(2 张 80 GB 卡就装得下),但 100B token 要 5.27×10²¹ FLOPs——2 张卡得跑 77 天,6 张 H100 才够 30 天。
出处:AI Infra 教材 §10.1–§10.2(
id 4343),任务:Qwen3-8B、100B token、30 天。
M_persistent = 16·N(BF16 权重/梯度 + FP32 主权重 + 两个矩)
T = F / (p·P·η)
2. 先把任务拆成数(E-S23-098)
| 项 | 数值 |
|---|---|
模型参数 N |
8,190,735,360 |
| 序列长度 | 8,192 |
| 每迭代序列数 | 384 |
| 每迭代 token | 3,145,728 |
| 总 token | 100B |
| 迭代次数 | ⌈1e11/3,145,728⌉ = 31,790 |
| 日历期限 | 30 天 |
| 留给训练/checkpoint/故障 | 25 天 |
| 每步预算 | 25×86400/31,790 ≈ 67.9 s |
| 平均有效吞吐要求 | 约 46,300 token/s(含预留)/38,600(全 30 天) |
判据:"有效 token"不含填充。 填充让形状规整,但照样吃算力和显存——统计完成量时必须剔除。
为什么全局 batch 停在 384:梯度噪声尺度
B_noise = tr(HΣ) / (GᵀHG)
超过临界 batch 后,加样本几乎不再减少所需步数,每步计算量却线性上涨。
3. 常驻状态:16 B/参数(E-S23-099)
| 状态 | B/参数 | Qwen3-8B |
|---|---|---|
| BF16 模型权重 | 2 | 16.4 GB |
| BF16 梯度 | 2 | 16.4 GB |
| FP32 主权重 | 4 | 32.8 GB |
| Adam 一阶矩 | 4 | 32.8 GB |
| Adam 二阶矩 | 4 | 32.8 GB |
| 合计 | 16 | 131.1 GB = 122.1 GiB |
若梯度用 FP32:18 B/参数("混合精度"并不规定梯度格式)
MoE 也是全参数:未选中的专家同样有优化器状态
判据:"能不能装下"只看这张表;"能不能训完"要看下一节。 两者经常给出完全不同的答案。
4. 算力下界:6 张才够(E-S23-100)
| 项 | 数值 |
|---|---|
| 一条 8,192 token 序列前反向 | 4.31×10¹⁴ FLOPs |
| 每 token | 52.7 GFLOPs |
| 100B token 合计 | 5.27×10²¹ FLOPs |
| H100 SXM BF16 稠密峰值 | 989 TFLOP/s |
| 取 40% 效率 | 7,507 token/s/卡 |
5 张:37,533 token/s < 需要的 38,600 → 不够
6 张:45,040 token/s → 够
2 张 80 GB:装得下 131.1 GB,但需约 77 天
判据:容量下界与算力下界要分别取最大值。 只按显存配卡,会得到一个"能开始但永远跑不完"的方案。
40% 从哪来:Llama 3 405B 在 8,192–16,384 张 H100 上 BF16 MFU 38%–43%。剩下六成分布在:无法重叠的通信、流水线气泡、受带宽限制的更新与状态转换、重计算、掉队者、checkpoint。
5. ZeRO:切什么、付什么(E-S23-101)
四张卡为例,完整 = 每卡一份,片 = 每卡 1/4:
| 阶段 | 权重 | 梯度 | 主权重 | 两个矩 | 每卡状态 | 代价 |
|---|---|---|---|---|---|---|
| DP(ZeRO-0) | 完整 | 完整 | 完整 | 完整 | 16N | 副本冗余 |
| ZeRO-1 | 完整 | 完整 | 片 | 片 | 4N + 12N/p |
更新时集合通信 |
| ZeRO-2 | 完整 | 片 | 片 | 片 | 2N + 14N/p |
梯度 ReduceScatter |
| ZeRO-3 / FSDP | 片 | 片 | 片 | 片 | 16N/p |
每层前向/反向都要 AllGather |
p=4:ZeRO-1 → 4N + 3N = 7N;ZeRO-2 → 2N + 3.5N = 5.5N;ZeRO-3 → 4N
判据:ZeRO-1/2 省的是"状态副本",ZeRO-3 才省"权重本身",但把通信从"每步一次"变成"每层两次"。 卡数少、机内带宽高时 ZeRO-3 划算;跨机时它的 AllGather 会变成瓶颈(J19 的启动开销)。
5.1 FSDP 与 SP 不是一回事
| 机制 | 切的对象 | 通信时机 |
|---|---|---|
| FSDP | 参数/梯度/优化器状态的所有权 | 模块前 AllGather、反向完 ReduceScatter |
| SP(序列并行) | 同一批输入的序列位置(LayerNorm/Dropout 等逐 token 算子) | 进矩阵乘前收集、算完再分片 |
判据:FSDP 管"模型状态归谁",SP 管"激活放哪"。 两者是两条独立的并行轴,常叠在一起用。
6. 激活:保留还是重算(§10.2.2)
反向需要前向输入 X:dX = dY·Wᵀ,dW = Xᵀ·dY
保留 X → 从前向一直驻留到反向
释放 X → 反向时重算(用额外算力换显存)
例子(Qwen3-8B MLP):h = a ⊙ u,下投影 Y = h·W_down 的梯度只需要 h。
| 策略 | 显存 | 计算 |
|---|---|---|
保留 h |
多存一份 h |
无额外 |
保留 a、u,反向前重乘 |
省一份 h |
一次逐元素乘(极便宜) |
判据:重算的选择标准是"重算代价 / 省下的字节"。 逐元素算子重算几乎免费;矩阵乘重算就要重新读权重(J23 的卸载账)。
7. 组合并行下的每卡状态(§10.2.4)
每卡状态 ≈ 16N/(DP×TP×PP 的分片数) + 激活(受 SP/重计算影响) + 通信缓冲
| 选择 | 什么时候用 |
|---|---|
| DP + ZeRO-1/2 | 模型能装进单卡、想扩吞吐 |
| TP + ZeRO-1 | 单层放不下 |
| PP + ZeRO-1/2 | 层数多、想省通信 |
| ZeRO-3/FSDP | 卡多、机内互联快、想最大压缩 |
判据:先看互联拓扑再选分片级别。 机内 NVLink 可以承受 ZeRO-3 的每层 AllGather;跨机 IB 上更该用 PP + ZeRO-1。
8. 可复算(实测)
$ cd /root/博客运营官/blog-v2 && python3 tools/s23_book_calc.py | tail -11
任务: 384×8192 = 3,145,728 token/步;31,790 步;25 天 → 67.9 s/步
状态: N=8,190,735,360 × 16 B = 131.1 GB = 122.1 GiB(FP32 梯度 18 B → 147.4 GB)
算力: 52.7 GFLOPs/token × 1e11 = 5.27e+21 FLOPs
H100 40% → 7507 token/s/卡
5 张: 37,533 token/s < 38,600
6 张: 45,040 token/s ≥ 38,600
2 张 80 GB 装得下 131.1 GB,但需约 77 天
ZeRO-0 p=4: 16N 每卡状态
ZeRO-1 p=4: 7N 每卡状态
ZeRO-2 p=4: 5.5N 每卡状态
ZeRO-3 p=4: 4N 每卡状态
9. 前提与边界
| 结论 | 成立条件 | 不成立时 |
|---|---|---|
16N |
混合精度 Adam、BF16 梯度 | FP32 梯度 → 18N |
| 67.9 s/步 | 384×8192、25 天、31,790 步 | 改序列长/批量 → 重算 |
| 6 张够算 | 40% MFU、989 TFLOP/s | 效率 30% → 8 张;50% → 5 张 |
| ZeRO-3 无通信瓶颈 | 机内高带宽 | 跨机 → 每层 AllGather 变瓶颈 |
10. 常见误区
| 误区 | 纠正 |
|---|---|
| "装得下就能训完" | 2 张卡能装,但要 77 天 |
| "混合精度就是 16 B/参数" | 换 FP32 梯度就变 18 B |
| "MoE 省显存" | 优化器状态按全部专家算 |
| "ZeRO 级别越高越好" | ZeRO-3 通信频率高一个量级 |
| "FSDP 等于 SP" | 一个切状态所有权,一个切激活位置 |
11. 自测
- 384 条 8192 token 序列,每步多少 token?100B token 要多少步?
- Qwen3-8B 混合精度 Adam,常驻状态多少 GB?换成 FP32 梯度呢?
- 5.27×10²¹ FLOPs、989 TFLOP/s、40% 效率,至少几张卡 30 天完成?
- ZeRO-2 在 4 卡上每卡多少 N?
答案
3,145,728;⌈1e11/3,145,728⌉ = 31,790步。16×8.19e9 ≈ 131.1 GB;FP32 梯度 →18N ≈ 147.4 GB。5.27e21/(989e12×0.4×30×86400) ≈ 5.1→ 6 张。2N + 14N/4 = 5.5N。
12. 下一篇
S23-J28 · 流水调度、checkpoint 与强化学习 —— micro-batch 与梯度累积、PP 气泡与激活生命周期、梯度分桶与通信重叠,以及 checkpoint 周期、掉队者和 RL 反馈循环。