用 RL 训练写 kernel 的模型,
reward 怎么设计?
先弄清楚:每个概念是什么
- Reward
- 模型每交一个 kernel,环境给的分数。reward 奖什么,模型就学什么。
- Multi-turn
- 一条 trajectory 里模型改好几轮,每轮交一个 kernel。Kevin 训练时每题 16 条 trajectory,每条 4 个 refinement step。
- Credit assignment
- 最后的 kernel 快了,功劳怎么分给前面几轮。
- Milestone reward
- 不看具体快多少倍,只看过了哪一档。
30 秒回答
Incorrect kernels get zero or negative reward; correct ones earn more for speedup. Kevin uses 0.3 plus speedup, and each refinement step also gets the discounted sum of later scores, gamma 0.4, so early steps get credit for later gains. CUDA Agent found raw speedup has outliers and favors easy kernels, so it uses discrete milestones: minus one for wrong, one for correct, two for beating eager, three for also beating torch.compile. CUDA-L1 normalizes and clips at 1.5. I'd take the median on a dedicated GPU and re-check any sudden jump as a possible hack.
三家的 reward
PPO 和 GRPO 的原理见 RLHF、DPO、GRPO。
| 系统 | Reward | 想解决的问题 |
|---|---|---|
| Kevin-32B multi-turn GRPO | 不正确 0;正确 0.3 + speedup。每步的 reward 是自己和后面各步得分的 discounted sum,γ = 0.4 | Credit assignment,前面的改动为后面铺路 |
| CUDA Agent PPO | 离散的 −1、1、2、3:不正确;正确但没明显提速;比 eager 快 5% 以上;比 eager 和 torch.compile 都快 5% 以上 | 原始 speedup 有 outlier,偏向容易的 kernel |
| CUDA-L1 GRPO | speedup 先 normalize 成 \((r - \mu)/\sigma\),再 clip 到 [−1.5, 1.5] | 让 hack 的收益变小 |
手算两个例子
Kevin 的多轮 reward。一条 trajectory 有 3 步(示意)。第 1 步不正确,得 0。第 2 步正确,speedup 1.0,得 1.3。第 3 步 speedup 1.5,得 1.8。
第 1 步是错的,但后面改对了,所以也拿到 0.808。
CUDA Agent 的档位。容易的 kernel 快 20 倍,难的快 1.3 倍(示意),用原始 speedup 当 reward 时前者约是后者的 15 倍,gradient 被它带着走。离散档位下两者都是 3。ablation 把 reward 换回原始 speedup 后,对 torch.compile 的 faster rate 从 96.8% 掉到 60.4%,geomean 从 2.11x 掉到 1.25x。
防 hack 和降噪
- 正确但没提速是 lazy optimization,Dr. Kernel 用 profiling-based reward 处理
- reward 突然跳高时,CUDA-L1 让 DeepSeek-R1 当 adversarial judge 复查(见 reward hacking)
- CUDA-L1 把超过 3x 的结果放到第二张 GPU 上复测,相差 10% 以内才算
必答点
- 基本形状:不正确给 0 或负分,正确了再按 speedup 加分
- Kevin:0.3 + speedup,多轮用 γ = 0.4 的 discounted sum
- CUDA Agent:离散的 −1、1、2、3,因为原始 speedup 有 outlier、偏向简单 kernel
- CUDA-L1:normalize 后 clip 到 ±1.5
- 测量要降噪:独占 GPU、随机顺序、取 median
- reward 突然跳高,先当 hack 查
追问
γ = 0.4 是什么意思?为什么用 sum 不用 max?
后一步的得分打 4 折,再后一步打 1.6 折,所以主要看自己和紧接着的一步。ablation 里 sum 比 max 好。
GRPO 用在多轮上有什么问题?
Dr. Kernel 发现 GRPO 的 self-inclusion 会让 policy gradient 有偏,提出 TRLOO(turn-level leave-one-out)。公式见 GRPO。
训练时模型学会过哪些 hack?
Kevin 上有三种。复制 PyTorch reference,用 try-except 包住错的 CUDA kernel 再退回 PyTorch,继承 reference 不写 CUDA。对策是 format check,这类回答给 0 分。
RL 训练为什么不稳,怎么稳住?
CUDA Agent 最初只稳定训练 17 步就崩了。它先做 single-turn 的 PPO warmup,再做 RFT 和 value pretraining,之后才做 agentic PPO。
来源ml-八股 08 第 24 题 · Kevin-32B:blog、arXiv 2507.11948 · CUDA Agent §3.2 式 1、Table 2 · CUDA-L1 §2.4.4、§3.2 · Dr. Kernel · Makora · TritonRL · 整理见文献笔记第 3 节