Show HN: I RL-trained an agent that trains models with RL (for –$1.3k)
AI 深度解读
背景
在 AI 研究的前沿,强化学习(RL)被广泛用于训练模型,但鲜有人尝试将 RL 应用于训练一个“训练者”——即一个能够自主编写训练流程、配置训练任务并评估结果的 AI agent。近期,Hacker News 上出现了一个名为 “Show HN: I RL-trained an agent that trains models with RL (for –$1.3k)” 的项目,作者 Danau5tin 完整开源了整套流程,包括训练好的 agent 权重、任务框架、奖励代码、GPU 编排、RL 训练脚本以及所有实验的回顾文档(包括失败案例)。该项目展示了两个嵌套的 RL 循环:外层 RL 训练一个 agent,该 agent 的动作是编写内层 RL 训练任务,从而训练出更好的小型模型。
核心内容
总体架构
项目构建了一条流水线:一个 AI agent(基于 Qwen3.6-35B-A3B,使用 LoRA 适配器)通过与环境交互,编写训练配置和验证器,触发内层 RL 训练(使用 prime-rl 框架进行 GRPO 训练),然后根据训练出的模型在隐藏评估集上的表现获得奖励。外层 RL 循环(使用 Tinker,Thinking Machines 的托管 RL API)根据每个 episode 的奖励来训练 agent 本身。
两个 RL 循环使用完全独立的训练栈:
- 外层循环(Tinker):训练 agent。
- 内层循环(prime-rl):由 agent 编写的训练任务,训练一个小型模型。
每个 episode 代表 agent 的一次尝试,目标是为一个给定的任务生成一个有效且高质量的训练任务。流程如下:
- 任务规范:包含任务描述(如“教会小型模型解决多跳身份查询”)、硬约束边界、评估工具接口以及少量开发示例。
- Agent 工作:Agent 通过
read_file、write_file、edit_file、list_files等工具在沙盒工作区中编辑文件,并可调用get_baseline_scores查看未训练基础模型在隐藏评估集上的得分,然后提交submit_job触发验证探针。失败时返回并给予有限次重试。 - 调度:验证通过的任务被排队,由一组预热的 Runpod GPU 节点(最多 16 个)拾取,这些节点运行 prime-rl 的 GRPO 训练,并在训练前后对 checkpoint 进行隐藏评估评分。
- 奖励计算:结合验证效率与训练模型相比最佳未训练基线的提升。
奖励设计
每个 episode 的奖励是三个分量的加权和(权重 0.35 / 0.60 / 0.05):
- 验证分量:首次尝试即有效提交得 1.0,每多一次尝试衰减;若 episode 从未通过验证则为 0。若 agent 从未生成可解析的提交,外层循环额外给 -0.1 奖励(CSV 中的 -1.0 是“无后得分”的记录哨兵,不是奖励)。
- 任务质量分量:混合了训练模型的绝对后训练得分及其相对于最佳未训练模型(
best_pre)的提升:0.25 * post + 0.75 * uplift_term。若任务在 GPU 上崩溃,此分量为 0(但验证分量仍保留)。 - 训练速度分量:仅对成功任务生效,作为小项破平衡器,奖励更快的任务。
注意:agent 面对的提示(template/INSTRUCTIONS.md)给出了简化版视图——任务质量中的 75/25 提升/绝对拆分,以及减少尝试次数的提示——而非完整的 0.35/0.60/0.05 分解。发布的适配器正是基于该提示训练的,实际计算的奖励为上述完整版本。
任务族
项目构建了六个任务族,故意设计成未训练模型难以处理,且都需要多步骤工具使用和推理。其中五个用于训练 agent,一个名为 triage 的任务族从未用于训练,作为泛化探针。
实验结果
设置:训练者 agent 为 Qwen3.6-35B-A3B,LoRA rank 8,学习率 4e-5,GRPO 组大小 8,最多 16 个并发 GPU 节点,每批约 40 个真实训练任务。运行序列:pilot-7(10 步)→ 7b(24 步,热启动)→ 7c(20 步,热启动),总计 54 步。
奖励分解:
- 第一阶(pilot-7):早期的全部收益来自将验证失败和 GPU 崩溃任务转化为成功 episode。任务质量保持平稳,总奖励升至约 0.26。说明 GRPO 先走最陡的梯度。
- 第二阶(pilot-7b 起):随着可靠性饱和(验证约 0.75–0.80),任务得分从 0.30 升至 0.41,隐藏评估后训练得分从约 0.04 噪声升至持续的 0.22–0.48。agent 开始制造更好的模型,而不仅仅是可工作的模型。
泛化:从未训练过的任务族(triage)的表现随着外层训练而上升,随后趋于平稳。
模型选择行为:早期训练是模型选择盲目的——77/79 个 episode 选择了较弱的 0.6B 模型。引入 get_baseline_scores 工具和提升评分后,策略翻转,并在训练过程中保持,1.7B 模型在任务编写 episode 中的占比从 42% 升至 95%。同时,agent 开始使用暴露的 [prime_rl] 配置接口(从 21% 升至约 78%),并包含合理的键组合:采样温度、优化器选择、算法变体、调度器、损失函数。
基础设施与成本
内层循环(agent 编写的任务):
- Runpod 预热节点池:最多 16 个节点,固定到精确的 prime-rl + 验证器版本,从提供到服务约 2 分钟。空闲节点被回收,队列基于文件(
queued/ → running/ → done/)。 - GPU 选择基于数据驱动的基准矩阵(GPU × 基础模型),发现 2× RTX A5000 以 £0.10/任务(约 $0.13)胜出;但实际库存不足,大多数任务运行在 A40 上(64% 的 GPU 训练小时,约 340 小时),RTX 4090 占 32%(151 小时),RTX A6000 3%,RTX A5000 1%。
- 内层训练使用 prime-rl(GRPO)训练小型模型,checkpoint 在隐藏评估上使用 vLLM 进行前后评分。
外层循环(训练 agent):
- Tinker(Thinking Machines 的托管 RL API)通过 tinker-cookbook 的重要性采样 GRPO 训练 Qwen3.6-35B-A3B(LoRA)。一个控制反转桥接器将每个 episode 作为后台任务运行,使用队列支持策略,使得 cookbook 循环逐 episode 驱动,而所有 harness 逻辑(验证重试、提示、评分)保持不变。
- 异步 off-policy(
max_steps_off_policy=2)克服了拖后腿节点问题——一个慢 episode 不再阻塞整个批次。在整个实验中没有废弃任何过时数据。 - 所有操作都有计量:每次 LLM 调用记录
