L2
手锻
从零写一个能跑的 GRPO不用任何 RL 框架,用 transformers + vLLM 手写完整训练循环。跑完这一阶段你会拥有一个约 200 行、你完全看得懂每一行的 RL 训练脚本,并在 5090 上把 Qwen3-0.6B 的 GSM8K 分数推上去。
6 节课 · 约 5 小时已完成 0/6
- 1
写 rollout:让模型自己生成一批答案
实验45 分钟训练数据不是给的,是采的。这一节把「一个 prompt 采 8 条回答」写出来,并处理好 token 对齐。
- →用 vLLM 对一批 prompt 各采 G 条回答,拿到 token id 而不是字符串
- →解释为什么必须拿 token id 回来(token-in-token-out)
- →把采样结果整理成后面能直接喂进训练的张量
- 2
写 reward 函数:把「答对了」变成一个数
实验35 分钟两个 reward:答案对不对、格式规不规范。加起来就是这一轮的分数。
- →实现正确性 reward 与格式 reward,并组合成总分
- →在自己的 reward 上主动找出一条作弊路径并堵掉
- →打印 reward 分布,判断这一批采样有没有信息量
- 3
GRPO 的核心 20 行:优势、ratio、clip、KL
实验50 分钟整个算法真正的实现只有二十行。这一节逐行写出来,并用打印验证每个中间量。
- →写出组内归一化的优势计算,并处理 std 为 0 的情况
- →写出带 clip 的策略损失,并解释每个符号对应 L1 的哪个概念
- →写出低方差 KL 估计,并知道 KL 系数设 0 意味着什么
- 4
拼成训练循环:第一次真正的 RL 训练
实验60 分钟把 rollout、reward、loss 串起来,加上权重同步和显存管理,在 5090 上跑完第一次训练。
- →跑完一次完整训练,看到 reward 曲线上升
- →实现训练权重到 vLLM 的同步,并解释不同步会发生什么
- →在 32GB 内安排好训练与推理的显存,扛住不 OOM
- 5
闯关:读第一次训练曲线
闯关40 分钟仅大纲给你六组真实形状的训练曲线,判断哪些是在学、哪些是在作弊、哪些已经废了。
- →从 reward、KL、长度、熵四条线的组合形状判断训练状态
- →看到异常曲线时,说出下一步该改哪个参数
- →建立「先看曲线再改代码」的习惯
- 6
把分数再往上推:三轮迭代实验
实验60 分钟仅大纲同一套代码,只改超参和 reward,做三轮对照实验,把 GSM8K 分数推到你能达到的最高点。
- →设计一组只改一个变量的对照实验
- →用固定测试集比较三轮结果,并解释差异来源
- →产出一份能给别人看的实验报告