RRLforge
L2

手锻

从零写一个能跑的 GRPO

不用任何 RL 框架,用 transformers + vLLM 手写完整训练循环。跑完这一阶段你会拥有一个约 200 行、你完全看得懂每一行的 RL 训练脚本,并在 5090 上把 Qwen3-0.6B 的 GSM8K 分数推上去。

6 节课 · 约 5 小时已完成 0/6
  1. 1

    写 rollout:让模型自己生成一批答案

    实验45 分钟

    训练数据不是给的,是采的。这一节把「一个 prompt 采 8 条回答」写出来,并处理好 token 对齐。

    • 用 vLLM 对一批 prompt 各采 G 条回答,拿到 token id 而不是字符串
    • 解释为什么必须拿 token id 回来(token-in-token-out)
    • 把采样结果整理成后面能直接喂进训练的张量
  2. 2

    写 reward 函数:把「答对了」变成一个数

    实验35 分钟

    两个 reward:答案对不对、格式规不规范。加起来就是这一轮的分数。

    • 实现正确性 reward 与格式 reward,并组合成总分
    • 在自己的 reward 上主动找出一条作弊路径并堵掉
    • 打印 reward 分布,判断这一批采样有没有信息量
  3. 3

    GRPO 的核心 20 行:优势、ratio、clip、KL

    实验50 分钟

    整个算法真正的实现只有二十行。这一节逐行写出来,并用打印验证每个中间量。

    • 写出组内归一化的优势计算,并处理 std 为 0 的情况
    • 写出带 clip 的策略损失,并解释每个符号对应 L1 的哪个概念
    • 写出低方差 KL 估计,并知道 KL 系数设 0 意味着什么
  4. 4

    拼成训练循环:第一次真正的 RL 训练

    实验60 分钟

    把 rollout、reward、loss 串起来,加上权重同步和显存管理,在 5090 上跑完第一次训练。

    • 跑完一次完整训练,看到 reward 曲线上升
    • 实现训练权重到 vLLM 的同步,并解释不同步会发生什么
    • 在 32GB 内安排好训练与推理的显存,扛住不 OOM
  5. 5

    闯关:读第一次训练曲线

    闯关40 分钟仅大纲

    给你六组真实形状的训练曲线,判断哪些是在学、哪些是在作弊、哪些已经废了。

    • 从 reward、KL、长度、熵四条线的组合形状判断训练状态
    • 看到异常曲线时,说出下一步该改哪个参数
    • 建立「先看曲线再改代码」的习惯
  6. 6

    把分数再往上推:三轮迭代实验

    实验60 分钟仅大纲

    同一套代码,只改超参和 reward,做三轮对照实验,把 GSM8K 分数推到你能达到的最高点。

    • 设计一组只改一个变量的对照实验
    • 用固定测试集比较三轮结果,并解释差异来源
    • 产出一份能给别人看的实验报告