从 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 里这条经验规则比监督学习弱得多,原因有两个:
- RL 的噪声不只来自 batch 采样,还来自策略本身的随机性和优势估计的误差。加大 batch 只降低前者。
- 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 引擎挂掉后自动恢复、不重启整个训练」就建立在这层能力上。
你只有一个进程,既做训练又做采样。没有拓扑,也就不需要编排。
所以在单卡上装 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 步实验 | 说明 |
|---|---|---|---|
| 你的 5090 | 0.6B 全参 | 约 2 小时 | 电费可忽略 |
| 云上单卡 4090/5090 | 0.6B 全参 | 约 2 小时 | 每小时几块钱 |
| 云上 8×H100 | 0.6B 全参 | 约 15 分钟 | 每小时几十到上百 |
| 云上 8×H100 | 8B LoRA | 约 2 小时 | 单卡做不到 |
真要上云,不要一上去就开 8 卡跑长实验。流程应该是:
- 租一张卡,跑 20 步冒烟(约十几分钟,几块钱)——验证环境、数据路径、脚本能跑
- 同一张卡跑 200 步(约两小时)——拿到单卡基线,确认结论方向
- 再开多卡——此时你已经知道脚本是对的,多卡只是调并行参数
跳过第 1、2 步直接开 8 卡,你会在按小时计费的机器上调 chat_template 和 mask 对齐——那些本该在自己的 5090 上免费调完的东西。
这就是这条路径的实际价值:把所有便宜能犯的错,都在便宜的地方犯完。
扩到多卡后 batch 变大,学习率该怎么调?
多卡上加大 batch,应该优先加 prompt 数还是 G?
为什么 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 对齐