RLforge
原理预计 30 分钟

从 1 卡到 8 卡:哪些结论会变

你在单卡上得到的所有直觉,哪些能带上多卡,哪些必须扔掉。为将来真有机器的那天做准备。

学完这节你能做到

  • 说清 batch size、学习率、G 在扩到多卡时该怎么跟着变
  • 判断一个任务是被显存卡住还是被吞吐卡住
  • 看懂多卡启动脚本里 ray / torchrun 那一层在做什么

你在单卡上学到的东西,哪些能带走

这一节是为「将来真有机器的那天」做准备。核心问题:你积累的直觉,哪些在 8 卡上仍然成立,哪些必须扔掉?

先给结论:

带得走的必须重新校准的单卡上根本没接触的
算法本身(优势、clip、KL)全局 batch 与学习率的配比并行策略 TP/PP/CP/EP
reward 设计与自查方法rollout 与训练的卡数配比异步调度与 off-policy 容忍度
八条曲线的读法每步的 prompt 数与 G 的组合跨节点权重同步
失效模式的诊断checkpoint 与容错策略集群编排(ray)
实验纪律与分辨率意识评测的采样并发容错与断点续训

左边那一列是这条路径真正的产出物。 它们不随规模变化——这也是为什么单卡学 RL 不是「阉割版」。

不变的部分

算法

(r − mean) / std、min(ratio·A, clip(ratio)·A)、k3 KL 估计——这些在 256 卡上和在你的 5090 上是同一行代码。slime 的 --advantage-estimator grpo 背后就是你写的那个函数。

reward 设计

reward 与规模完全无关。「便宜的分要给得少」、「开训前主动找作弊路径」、「reward 与 acc 分开记录」在任何规模下都成立。

而且规模越大,reward 设计错误的代价越高——8×H100 跑一天的钱,够你在 5090 上跑一个月。

曲线的读法

八条曲线的判读表在多卡上一模一样。ratio_mean 偏离 1 仍然指向权重同步;entropy 趋近 0 仍然是熵崩塌。

▣所以单卡是最好的学习环境

在 5090 上一次实验两小时,你一周能做二十次。在 8×H100 上一次实验可能也是两小时,但那两小时的成本是前者的几十倍——你不敢做二十次实验,也就练不出直觉。

先在便宜的环境里把判读能力练出来,再去贵的环境里干活。反过来做,你会在昂贵的集群上重复犯所有新手错误。

要重新校准的部分

全局 batch 与学习率

单卡上你的有效 batch 是 8 prompt × 8 = 64 条序列。8 卡数据并行之后,如果每卡还是这个量,全局 batch 就是 512。

batch 变大意味着梯度估计的噪声变小,理论上可以用更大的学习率。但 RL 里这条经验规则比监督学习弱得多,原因有两个:

  1. RL 的噪声不只来自 batch 采样,还来自策略本身的随机性和优势估计的误差。加大 batch 只降低前者。
  2. clip 机制会限制单步更新幅度。学习率提上去之后,更多 token 被截断,实际更新幅度并没有按比例增加——你会看到 clip_frac 上升而效果不涨。
✓务实的做法:先不动学习率

扩到多卡时,先保持 lr=1e-6 不变,只看 batch 变大之后曲线是不是更平滑(reward 的锯齿应该减小)。

然后按 clip_frac 决定要不要动:

clip_frac判断动作
< 2%更新过于保守学习率可以试着提到 2e-6 ~ 3e-6
3% ~ 10%健康别动
> 20%单步太猛降学习率

用 clip_frac 当学习率的仪表盘,比套用任何缩放公式都可靠。这一条你在单卡上就能开始练。

rollout 与训练的卡数配比

单卡上这个问题不存在(只有一张)。多卡上它是最重要的新决策。

以 8 卡为例,两种典型分法:

colocate(共享)
┌─────────────────────────────────────┐
│  8 张卡都同时承担训练和采样,交替执行    │
└─────────────────────────────────────┘
· 显存要装下 训练态 + 推理引擎
· 采样与训练不能重叠
· 配置简单,slime 加 --colocate 即可

disaggregated(分离)
┌───────────────┐  ┌───────────────┐
│ 卡 0-3 采样    │  │ 卡 4-7 训练    │
└───────────────┘  └───────────────┘
· 采样与训练可以重叠 → 吞吐高
· 权重要跨卡同步 → 需要高速互联
· 配比要调(采样慢就多给采样卡)

选择依据:

情况选
卡少(2~8)、模型不大colocate,配置简单
显存装不下「训练态 + 推理引擎」必须 disaggregated
采样占比极高(长思维链任务)disaggregated,且给采样多分卡
想要最高吞吐且有高速互联disaggregated + 异步

slime 的 colocate 模式有个具体提示值得记:加 --colocate 时要调 --sglang-mem-fraction-static(建议约 0.8),免得 Megatron 的常驻显存导致 OOM。这和你在单卡上调 vllm_gpu_memory_utilization 是同一个动作,只是参数名不同。

每步 prompt 数与 G 的组合

L2「三轮迭代」得出的结论是「G=8 是收益递减点」。这个结论在多卡上仍然大致成立(各家框架默认值也在 8 附近),但组合方式会变:

单卡上你受显存和时间双重限制,只能 8 prompt × G=8。多卡上采样能力充裕,可以走 64 prompt × G=8——prompt 多样性大幅提升,而 G 不变。

这是个重要区别:加大 batch 应该优先加 prompt 数(提升数据多样性),而不是加 G(只是把同一道题采更多次)。

单卡上完全没接触的部分

ray:为什么 RL 框架都用它

slime 和 Miles 的多节点启动都走 ray:

# 主节点
ray start --head

# 其余节点
ray start --address=${MASTER_ADDR}:6379

# 提交任务
ray job submit --address="http://127.0.0.1:8265" -- python train.py ...

为什么不用 torchrun?因为 RL 的进程拓扑不是对称的。

torchrun 假设你启动 N 个一样的进程做数据并行。而 RL 里有训练 worker、rollout worker、router、可能还有 reward 服务和沙箱——角色不同、数量不同、生命周期也不同(一个 rollout 引擎挂了要能单独重启,而不是整个作业重来)。

ray 提供的正是「异构 actor 的编排与故障恢复」,这跟 RL 的结构天然契合。Miles 宣称的「SGLang 引擎挂掉后自动恢复、不重启整个训练」就建立在这层能力上。

i这也解释了为什么单卡不需要 ray

你只有一个进程,既做训练又做采样。没有拓扑,也就不需要编排。

所以在单卡上装 ray 是纯负担。等你真上多节点再学它——而且到那时候你会知道它在解决什么问题,而不是把它当成又一个必须配的东西。

并行策略的选择

L3「框架解决的五个问题」列过 TP/PP/CP/EP 各切什么。这里只补一条实用的判断顺序:

模型单卡放得下?
├── 放得下 ──→ 纯数据并行(DP)。最简单、通信最少
└── 放不下
    ├── 有 NVLink / NVSwitch?
    │   ├── 有 ──→ 先加 TP(层内切,通信重但延迟低)
    │   └── 没有 ─→ 用 PP(层间切,通信量小)
    ├── 序列特别长(数万 token)?──→ 加 CP
    └── 是 MoE?──→ 加 EP
!消费卡多机的现实

多张 5090 做 RL 有个绕不过去的问题:没有 NVLink,卡间走 PCIe。

  • TP 不划算(每层 all-reduce,通信成为瓶颈)
  • 数据并行可以(每步只同步一次梯度)
  • 但数据并行解决不了「单卡放不下」

所以消费卡多机的适用场景是:模型本来就放得下,你只是想跑更快 / 更大 batch。 想训更大的模型,还是得去租有高速互联的卡。

这是「32GB 是硬墙」的完整版本:不是钱的问题,是拓扑的问题。

成本视角

把数字摆出来,判断什么时候该租卡。

场景配置一次 200 步实验说明
你的 50900.6B 全参约 2 小时电费可忽略
云上单卡 4090/50900.6B 全参约 2 小时每小时几块钱
云上 8×H1000.6B 全参约 15 分钟每小时几十到上百
云上 8×H1008B LoRA约 2 小时单卡做不到
✓最小的租卡实验:先花二十块钱验证脚本

真要上云,不要一上去就开 8 卡跑长实验。流程应该是:

  1. 租一张卡,跑 20 步冒烟(约十几分钟,几块钱)——验证环境、数据路径、脚本能跑
  2. 同一张卡跑 200 步(约两小时)——拿到单卡基线,确认结论方向
  3. 再开多卡——此时你已经知道脚本是对的,多卡只是调并行参数

跳过第 1、2 步直接开 8 卡,你会在按小时计费的机器上调 chat_template 和 mask 对齐——那些本该在自己的 5090 上免费调完的东西。

这就是这条路径的实际价值:把所有便宜能犯的错,都在便宜的地方犯完。

Checkpoint单选

扩到多卡后 batch 变大,学习率该怎么调?

Checkpoint单选

多卡上加大 batch,应该优先加 prompt 数还是 G?

Checkpoint单选

为什么 RL 框架偏爱 ray 而不是 torchrun?

这节课的落点

  • 带得走的:算法、reward 设计、八条曲线的读法、失效诊断、实验纪律——这些不随规模变化
  • 要重新校准的:全局 batch 与学习率、rollout/训练卡数配比、prompt 数与 G 的组合
  • 学习率别套缩放公式,用 clip_frac 当仪表盘(小于 2% 可提,3%~10% 别动,超 20% 要降)
  • 加大 batch 优先加 prompt 数(多样性),不是加 G(收益递减点在 8)
  • colocate 简单适合卡少;disaggregated 吞吐高但需要高速互联和配比调优
  • ray 解决的是「异构角色的编排与单独故障恢复」,单卡没有拓扑所以不需要
  • 消费卡无 NVLink,只适合数据并行;想训更大模型必须租有高速互联的卡
  • 租卡流程:20 步冒烟(几块钱)→ 单卡 200 步 → 才开多卡,别在计费机器上调 mask 对齐

延伸资料