2098 字
约 6 分钟
8
S23-J27 · 训练容量估算与状态分片

适用读者:要给训练任务配机器、要判断"先撞显存还是先撞时间"、要选 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. 自测

  1. 384 条 8192 token 序列,每步多少 token?100B token 要多少步?
  2. Qwen3-8B 混合精度 Adam,常驻状态多少 GB?换成 FP32 梯度呢?
  3. 5.27×10²¹ FLOPs、989 TFLOP/s、40% 效率,至少几张卡 30 天完成?
  4. ZeRO-2 在 4 卡上每卡多少 N?
答案
  1. 3,145,728;⌈1e11/3,145,728⌉ = 31,790 步。
  2. 16×8.19e9 ≈ 131.1 GB;FP32 梯度 → 18N ≈ 147.4 GB。
  3. 5.27e21/(989e12×0.4×30×86400) ≈ 5.1 → 6 张。
  4. 2N + 14N/4 = 5.5N。

12. 下一篇

S23-J28 · 流水调度、checkpoint 与强化学习 —— micro-batch 与梯度累积、PP 气泡与激活生命周期、梯度分桶与通信重叠,以及 checkpoint 周期、掉队者和 RL 反馈循环。

S23-J27 · 训练容量估算与状态分片
https://www.clxhxhhr.top/posts/5554/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。