RRLforge
原理预计 20 分钟

这条路需要什么:一张 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.7BLoRA需要压 rollout 并发
Qwen3-4BLoRA⚠️ 勉强训推同卡时要精打细算
Qwen3-8BQLoRA⚠️ 勉强4bit 基座,回答长度要压到 1K 以内
任何 MoE任意专家权重全都要驻留

所以主线用 Qwen3-0.6B 全参。它足够小,让你能把注意力放在算法本身;也足够真实——它是个真的 Transformer,会出现真的 reward hacking 和真的熵崩塌。

i0.6B 会不会太小学不到东西

不会。GRPO 在 0.6B 上能稳定跑出可见的 reward 上升,也会完整暴露所有典型失效模式。反过来说,模型太大你反而学不到东西:一次实验跑一天,你一周只能试五组参数。

小模型 + 快迭代 = 学得快。等你把直觉练出来了,换大模型只是改一个字符串。

为什么 slime 和 Miles 的门槛是 8 张 H100

这条路径的参考资料里有两个工业级框架:slime(清华 THUDM,GLM 系列背后的 RL 框架)和 Miles(从 slime 分叉,SGLang + Megatron)。

它们的文档里,最小的例子是 8×H100,最大的到 256×H100。这不是它们写文档时偷懒,而是设计取向决定的:

  1. 训练后端是 Megatron-LM —— 为张量并行、流水线并行、上下文并行设计。单卡上这些并行度全部退化成 1,Megatron 的复杂度你全付了,收益一分没拿到。
  2. 推理后端是 SGLang,且要独占若干张卡 —— 训练和推理分别占一组 GPU,靠高速互联同步权重。单卡上没有「另一组卡」。
  3. 权重同步走 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
训练完把权重推给 vLLMweight 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;这不是妥协,是分工
  • 先手写后上框架,是为了把框架的参数从黑盒变成玻璃盒
  • 小模型 + 快迭代,一周试五组参数比一天试一组学得快

延伸资料