RRLforge
计算器预计 30 分钟

时间账:一次实验到底要跑多久

用你在 L0 测出的 tok/s,算出一次实验的墙钟时间。计算器帮你在开跑之前就知道要等多久。

学完这节你能做到

  • 估出一次训练的总时长,误差在 30% 以内
  • 说出 rollout 与训练各占多少时间,以及该优化哪一头
  • 在给定时间预算下反推出该缩哪个参数

开跑之前先知道要等多久

RL 实验的反馈周期以小时计。这带来一个很实际的问题:你今晚能试几组参数?

如果一次实验两小时,一晚上能试三组。如果不小心配成了十二小时,那就是一晚一组——而且往往到早上才发现方向就是错的。

所以在按下回车之前,先花两分钟算一下。

一步的时间构成

单步时间 = 采样 + 前向反向 + 权重同步 + colocate 切换
           ▲
      通常占 60%~80%

各项怎么算:

每步序列数   = prompt 数 × G
每步 token 数 = 每步序列数 × 平均回答长度

采样时间     = 每步 token 数 ÷ 生成吞吐(tok/s)
训练时间     = 每步 token 数 ÷ 训练吞吐(tok/s)
固定开销     = 权重同步 + sleep/wake     (单卡上约 3~6 秒)

总时间 = 单步时间 × 步数
!用「平均长度」而不是 max_tokens

新手常拿 max_tokens 来算,结果高估好几倍。

L2 那次训练 max_tokens=512,但平均长度只有 78~152。差了 3 到 6 倍。

平均长度只能实测。 跑 10 步冒烟测试时就能拿到,日志里的 len 就是它。而且注意它会随训练上涨(78 → 152),所以估算时用后期的值更保险。

计算器

两个吞吐数必须用你自己机器上测出来的——那是 L0「第一次推理」那一节的产出物。

建议按顺序试这几组对比

  1. 看默认配置:注意采样占了多少比例。
  2. G 的代价:把 G 从 8 改到 16,看总时长翻倍。再改到 4,看省了多少。
  3. 长度的代价:平均长度从 400 改到 800,总时长直接翻倍。
  4. 固定开销的摊薄:把每步 prompt 数从 8 加到 32,看固定开销的占比怎么降。
  5. 反推预算:假设你只有 3 小时,调参数让总时长落在 3 小时内——看你得牺牲什么。
计算器一次实验要跑多久
下面两个数必须用你自己机器上测出来的
默认值是 Qwen3-0.6B 在单卡 5090 上的一个量级参考,不同 max_model_len、 并发和 CUDA graph 设置能差三倍。L0「第一次推理」那一节就是去测这个数。
预计墙钟时间
55 分钟
每步 16.4 秒 · 共生成 5.1M token
单步时间构成
采样8.5s · 52%
训练2.8s · 17%
同步与切换5.0s · 31%
每步序列数
64 条
每步 token 数
26K
采样占比
52%
  • 训练侧占了 17%。开梯度检查点会让这一头更慢,先确认显存真的紧张再开。
  • 每步固定开销 5.0 秒,占了 31%。把每步的 batch 调大,让固定开销摊薄。

采样为什么占大头

三个原因叠加:

  1. 生成是逐 token 串行的。要生成 400 个 token,就要跑 400 次前向。而训练侧一次前向就能处理整条序列。
  2. GRPO 要采 G 条。同样的 prompt 数,采样工作量是 PPO 的 G 倍。
  3. colocate 不能重叠。多卡时采样和训练能并行,单卡只能串行。
所以单卡上「省时间」几乎等于「省采样」

按性价比排序的四个动作:

动作省多少代价
降平均回答长度线性⚠️ 可能影响效果,先确认截断率
提 vLLM 的 util(如果显存够)可观❌ 无,纯赚
确认 CUDA graph 开着几倍❌ 无,纯赚
每步 batch 调大,摊薄固定开销几个百分点显存峰值更高
降 G线性⚠️ 影响优势估计质量,别低于 4

前三个应该先做完,因为它们不影响效果。

冒烟测试的纪律

不要一上来就跑 200 步。 固定流程:

① 2 步     确认不 OOM、能跑完一个完整循环
② 10 步    确认 ratio≈1、adv_std 正常、reward/acc 同向、显存有余量
③ 20 步    确认趋势方向对(reward 在涨)
④ 放长     此时你已经知道单步时间,能算出总时长

前三步加起来约 25 分钟,能拦住 90% 的配置错误。

10 步冒烟同时给你一个准确的时间估算

跑完 10 步,你就有了真实的单步时间。乘上目标步数,就是总时长——比任何公式都准。

这也是为什么冒烟测试不算浪费:它同时验证配置校准时间预算。

一次实验的完整时间账

以 L2 那次训练为例,从零开始的完整成本:

环境搭建(一次性)            约 1 小时
下模型 + 数据(一次性)        约 10 分钟
测吞吐基线(一次性)           约 15 分钟
──────────────────────────────────
写代码 + 调通                约 2~4 小时(跟着课走会快很多)
冒烟测试 2 + 10 + 20 步       约 25 分钟
正式跑 200 步                约 1h52m
评测 1319 题                 约 8 分钟
──────────────────────────────────
单次完整实验(不含写代码)      约 2.5 小时

按这个节奏,一个周末(两天,每天 6 小时)能做:

  • 第一天:环境 + 手写实现调通 + 第一次完整训练
  • 第二天:三轮对照实验(改 G、改 KL、改 reward)+ 评测对比
i卡时成本参考

如果租云上的卡,按每小时几块钱算:走完本路径全部实验(含调试和重跑)大约 20~40 小时卡时,总成本在一百块出头。

这个数字值得说一下:RL 的入门门槛已经比很多人以为的低得多。 真正贵的是耐心,不是钱。

时间不够时砍什么

假设你只有 3 小时,而估算显示要 8 小时。按这个顺序砍:

顺序砍什么对结论的影响
1步数:200 → 80曲线趋势仍然可读,只是终点分数低一些
2数据规模:用 GSM8K 的一个子集几乎无影响(RL 本来就不是数据驱动的)
3平均长度:把 max_tokens 收紧⚠️ 要先确认截断率不高
4G:8 → 4⚠️ 优势估计变噪,别再往下
5评测题数:1319 → 300误差变大(约 ±3%),比较趋势时可接受
×先砍步数,不要先砍 G

新手容易先降 G,因为它看起来直接减少工作量。

但 G 是 GRPO 的基线来源。G=4 时组内基线的估计方差显著增大,退化组比例上升,你可能得到一个「训练效果不好」的错误结论——而真实原因只是 G 太小。

砍步数只是让你看到更短的一段曲线,结论的性质不变。这才是安全的削减方式。

检查点单选

估算训练时长时,回答长度该用哪个数?

检查点单选

单卡上「省时间」为什么几乎等于「省采样」?

检查点单选

时间不够时,先砍步数还是先砍 G?

这节课的落点

  • 单步时间 = 采样 + 前向反向 + 同步 + 切换;采样占 60%~80%
  • 实测的平均长度(后期值),不要用 max_tokens
  • 两个吞吐数必须自己测,那是 L0 的产出物
  • 冒烟纪律:2 步 → 10 步 → 20 步 → 放长;前三步 25 分钟拦住 90% 配置错误
  • 10 步冒烟同时给你准确的时间估算,比公式更可靠
  • 省时间先做不影响效果的:提 util、保住 CUDA graph、摊薄固定开销
  • 时间不够先砍步数,不要先砍 G —— 保住结论的有效性
  • 走完全路径约 20~40 小时卡时,租卡成本一百块出头