时间账:一次实验到底要跑多久
用你在 L0 测出的 tok/s,算出一次实验的墙钟时间。计算器帮你在开跑之前就知道要等多久。
学完这节你能做到
- 估出一次训练的总时长,误差在 30% 以内
- 说出 rollout 与训练各占多少时间,以及该优化哪一头
- 在给定时间预算下反推出该缩哪个参数
开跑之前先知道要等多久
RL 实验的反馈周期以小时计。这带来一个很实际的问题:你今晚能试几组参数?
如果一次实验两小时,一晚上能试三组。如果不小心配成了十二小时,那就是一晚一组——而且往往到早上才发现方向就是错的。
所以在按下回车之前,先花两分钟算一下。
一步的时间构成
单步时间 = 采样 + 前向反向 + 权重同步 + colocate 切换
▲
通常占 60%~80%
各项怎么算:
每步序列数 = prompt 数 × G
每步 token 数 = 每步序列数 × 平均回答长度
采样时间 = 每步 token 数 ÷ 生成吞吐(tok/s)
训练时间 = 每步 token 数 ÷ 训练吞吐(tok/s)
固定开销 = 权重同步 + sleep/wake (单卡上约 3~6 秒)
总时间 = 单步时间 × 步数
新手常拿 max_tokens 来算,结果高估好几倍。
L2 那次训练 max_tokens=512,但平均长度只有 78~152。差了 3 到 6 倍。
平均长度只能实测。 跑 10 步冒烟测试时就能拿到,日志里的 len 就是它。而且注意它会随训练上涨(78 → 152),所以估算时用后期的值更保险。
计算器
两个吞吐数必须用你自己机器上测出来的——那是 L0「第一次推理」那一节的产出物。
建议按顺序试这几组对比:
- 看默认配置:注意采样占了多少比例。
- G 的代价:把 G 从 8 改到 16,看总时长翻倍。再改到 4,看省了多少。
- 长度的代价:平均长度从 400 改到 800,总时长直接翻倍。
- 固定开销的摊薄:把每步 prompt 数从 8 加到 32,看固定开销的占比怎么降。
- 反推预算:假设你只有 3 小时,调参数让总时长落在 3 小时内——看你得牺牲什么。
- 每步序列数
- 64 条
- 每步 token 数
- 26K
- 采样占比
- 52%
- →训练侧占了 17%。开梯度检查点会让这一头更慢,先确认显存真的紧张再开。
- →每步固定开销 5.0 秒,占了 31%。把每步的 batch 调大,让固定开销摊薄。
采样为什么占大头
三个原因叠加:
- 生成是逐 token 串行的。要生成 400 个 token,就要跑 400 次前向。而训练侧一次前向就能处理整条序列。
- GRPO 要采 G 条。同样的 prompt 数,采样工作量是 PPO 的 G 倍。
- colocate 不能重叠。多卡时采样和训练能并行,单卡只能串行。
按性价比排序的四个动作:
| 动作 | 省多少 | 代价 |
|---|---|---|
| 降平均回答长度 | 线性 | ⚠️ 可能影响效果,先确认截断率 |
| 提 vLLM 的 util(如果显存够) | 可观 | ❌ 无,纯赚 |
| 确认 CUDA graph 开着 | 几倍 | ❌ 无,纯赚 |
| 每步 batch 调大,摊薄固定开销 | 几个百分点 | 显存峰值更高 |
| 降 G | 线性 | ⚠️ 影响优势估计质量,别低于 4 |
前三个应该先做完,因为它们不影响效果。
冒烟测试的纪律
不要一上来就跑 200 步。 固定流程:
① 2 步 确认不 OOM、能跑完一个完整循环
② 10 步 确认 ratio≈1、adv_std 正常、reward/acc 同向、显存有余量
③ 20 步 确认趋势方向对(reward 在涨)
④ 放长 此时你已经知道单步时间,能算出总时长
前三步加起来约 25 分钟,能拦住 90% 的配置错误。
跑完 10 步,你就有了真实的单步时间。乘上目标步数,就是总时长——比任何公式都准。
这也是为什么冒烟测试不算浪费:它同时验证配置和校准时间预算。
一次实验的完整时间账
以 L2 那次训练为例,从零开始的完整成本:
环境搭建(一次性) 约 1 小时
下模型 + 数据(一次性) 约 10 分钟
测吞吐基线(一次性) 约 15 分钟
──────────────────────────────────
写代码 + 调通 约 2~4 小时(跟着课走会快很多)
冒烟测试 2 + 10 + 20 步 约 25 分钟
正式跑 200 步 约 1h52m
评测 1319 题 约 8 分钟
──────────────────────────────────
单次完整实验(不含写代码) 约 2.5 小时
按这个节奏,一个周末(两天,每天 6 小时)能做:
- 第一天:环境 + 手写实现调通 + 第一次完整训练
- 第二天:三轮对照实验(改 G、改 KL、改 reward)+ 评测对比
如果租云上的卡,按每小时几块钱算:走完本路径全部实验(含调试和重跑)大约 20~40 小时卡时,总成本在一百块出头。
这个数字值得说一下:RL 的入门门槛已经比很多人以为的低得多。 真正贵的是耐心,不是钱。
时间不够时砍什么
假设你只有 3 小时,而估算显示要 8 小时。按这个顺序砍:
| 顺序 | 砍什么 | 对结论的影响 |
|---|---|---|
| 1 | 步数:200 → 80 | 曲线趋势仍然可读,只是终点分数低一些 |
| 2 | 数据规模:用 GSM8K 的一个子集 | 几乎无影响(RL 本来就不是数据驱动的) |
| 3 | 平均长度:把 max_tokens 收紧 | ⚠️ 要先确认截断率不高 |
| 4 | G:8 → 4 | ⚠️ 优势估计变噪,别再往下 |
| 5 | 评测题数:1319 → 300 | 误差变大(约 ±3%),比较趋势时可接受 |
新手容易先降 G,因为它看起来直接减少工作量。
但 G 是 GRPO 的基线来源。G=4 时组内基线的估计方差显著增大,退化组比例上升,你可能得到一个「训练效果不好」的错误结论——而真实原因只是 G 太小。
砍步数只是让你看到更短的一段曲线,结论的性质不变。这才是安全的削减方式。
估算训练时长时,回答长度该用哪个数?
单卡上「省时间」为什么几乎等于「省采样」?
时间不够时,先砍步数还是先砍 G?
这节课的落点
- 单步时间 = 采样 + 前向反向 + 同步 + 切换;采样占 60%~80%
- 用实测的平均长度(后期值),不要用
max_tokens - 两个吞吐数必须自己测,那是 L0 的产出物
- 冒烟纪律:2 步 → 10 步 → 20 步 → 放长;前三步 25 分钟拦住 90% 配置错误
- 10 步冒烟同时给你准确的时间估算,比公式更可靠
- 省时间先做不影响效果的:提 util、保住 CUDA graph、摊薄固定开销
- 时间不够先砍步数,不要先砍 G —— 保住结论的有效性
- 走完全路径约 20~40 小时卡时,租卡成本一百块出头