这条路需要什么:一张 5090 和一份预期管理
先把话说清楚:单卡 32GB 能做什么、不能做什么,以及为什么这不影响你学会 RL。
学完这节你能做到
- 说出单卡 32GB 在 RL 后训练里的真实位置:能训 0.6B 全参,能 LoRA 到 8B,跑不了 MoE
- 知道为什么 slime / Miles 这类工业框架的最小配置是 8×H100,以及这对你意味着什么
- 给自己定一个能在一周内达成的终点,而不是复现一篇论文
先把预期对齐
你手上有一张 RTX 5090:32GB 显存,1.79 TB/s 带宽,算力很强,但只有一张,而且没有 NVLink。
网上关于 LLM 强化学习的资料,绝大多数默认你有 8 张 H100。这条路径不是。这里所有命令、所有参数、所有显存数字,都按单卡 32GB 校准过。
代价是:你不会在这里训出一个 SOTA 模型。收益是:你会真的把每一行代码跑起来,而不是读完一篇博客然后什么都没发生。
一个你自己训练过的 Qwen3-0.6B:在 GSM8K 小学数学题上,正确率比训练前有可见提升;一条你能逐段解释的 reward 曲线;一份两百行、每一行你都知道为什么在那里的 GRPO 训练脚本。
不是:复现 DeepSeek-R1,不是训 32B 模型,不是拿到能发论文的数字。
32GB 能做什么,不能做什么
RL 训练比监督微调贵得多,因为显存里同时要装下好几个模型。下面这张表是后面「显存账本」那一节会详细算的结论,先看个结果:
| 模型 | 训练方式 | 单卡 32GB | 说明 |
|---|---|---|---|
| Qwen3-0.6B | 全参 | ✅ 舒服 | 本路径的主力,留得下余量调参 |
| Qwen3-1.7B | 全参 | ❌ | 光优化器状态就 20GB |
| Qwen3-1.7B | LoRA | ✅ | 需要压 rollout 并发 |
| Qwen3-4B | LoRA | ⚠️ 勉强 | 训推同卡时要精打细算 |
| Qwen3-8B | QLoRA | ⚠️ 勉强 | 4bit 基座,回答长度要压到 1K 以内 |
| 任何 MoE | 任意 | ❌ | 专家权重全都要驻留 |
所以主线用 Qwen3-0.6B 全参。它足够小,让你能把注意力放在算法本身;也足够真实——它是个真的 Transformer,会出现真的 reward hacking 和真的熵崩塌。
不会。GRPO 在 0.6B 上能稳定跑出可见的 reward 上升,也会完整暴露所有典型失效模式。反过来说,模型太大你反而学不到东西:一次实验跑一天,你一周只能试五组参数。
小模型 + 快迭代 = 学得快。等你把直觉练出来了,换大模型只是改一个字符串。
为什么 slime 和 Miles 的门槛是 8 张 H100
这条路径的参考资料里有两个工业级框架:slime(清华 THUDM,GLM 系列背后的 RL 框架)和 Miles(从 slime 分叉,SGLang + Megatron)。
它们的文档里,最小的例子是 8×H100,最大的到 256×H100。这不是它们写文档时偷懒,而是设计取向决定的:
- 训练后端是 Megatron-LM —— 为张量并行、流水线并行、上下文并行设计。单卡上这些并行度全部退化成 1,Megatron 的复杂度你全付了,收益一分没拿到。
- 推理后端是 SGLang,且要独占若干张卡 —— 训练和推理分别占一组 GPU,靠高速互联同步权重。单卡上没有「另一组卡」。
- 权重同步走 P2P / RDMA —— Miles 的 P2P weight transfer 是为跨节点设计的。单卡上这个模块无事可做。
你不会在 5090 上跑 slime 或 Miles —— 试也是浪费时间。
但你会在 L3 认真读它们的设计文档,因为那时候你已经亲手踩过它们要解决的坑:采样太慢卡住训练、权重同步耗时、一步挂了全盘重来。带着伤口去读设计文档,效果和空着手读完全不同。
框架层真正上手跑的是 TRL + vLLM colocate,那是目前单卡 32GB 上最稳的路径。
为什么先手写,再上框架
顺序是刻意的。
直接上框架,你会得到一个能跑的 trainer.train(),然后:reward 不涨,你不知道该看哪;显存爆了,你不知道是谁吃的;曲线奇怪,你只能去 GitHub issue 里搜。因为对你来说,中间全是黑盒。
手写一遍之后,框架文档里的每个参数你都认识:
| 你会写的代码 | 框架里叫什么 |
|---|---|
(r - r.mean()) / (r.std() + eps) | advantage_estimator="grpo" |
| 一个 prompt 采几条 | num_generations / n_samples_per_prompt |
| KL 项前面的系数 | beta / kl_loss_coef |
torch.clamp(ratio, 1-e, 1+e) | epsilon / eps_clip |
| 训练完把权重推给 vLLM | weight sync / update_weights |
手写的目的不是重复造轮子,是把黑盒变成玻璃盒。 一旦变成玻璃盒,你就能看懂 slime 那份四十个参数的启动脚本了。
时间与前置
- 时间:完整主线约 12 小时阅读 + 若干次训练等待。按业余时间算,两周左右。
- 代码前置:会写 Python,用过 PyTorch(知道什么是 tensor、什么是
loss.backward())。不需要有 RL 背景。 - 数学前置:只要求看得懂求和号和期望符号。唯一的推导在 L1「策略梯度」那一节,会一步一步写。
- 机器:一张 ≥24GB 的 N 卡。5090 最舒服;4090(24GB)把 rollout 并发调小也能全程跟下来。
选「先搞懂原理」那条路线,把 L1 的概念课和 L2 的算法实现读完 —— 优势计算和 loss 那部分在 CPU 上用几个小张量就能验证。
等到要真跑训练时,云上租一张 4090/5090 大约每小时几块钱,跑完本路径的全部实验总共不到一百块。
为什么这条路径把 slime 和 Miles 定位成「架构教材」而不是动手工具?
下面哪些配置能在单张 32GB 的卡上跑起来?(多选)
这节课的落点
- 终点是「你自己训过一个 0.6B」,不是复现论文
- 主力配置:Qwen3-0.6B 全参 + vLLM colocate,单卡 32GB 有余量
- slime / Miles 是架构教材,动手用 TRL;这不是妥协,是分工
- 先手写后上框架,是为了把框架的参数从黑盒变成玻璃盒
- 小模型 + 快迭代,一周试五组参数比一天试一组学得快