创意项目展示用强化学习训练一个Agent,让它自动训练其他模型,成本控制在$1300以内,是AI研究的有趣探索。
🔓 一切都开源了,包括:训练好的 agent 权重(🤗 HF 上的 LoRA 适配器)、agent 框架、任务族、reward 代码、GPU 编排、tinker RL 训练脚本,以及每个试点(包括失败)的回顾写稿。跳到快速开始 ↓
我构建了一个管道,其中 AI agent:
然后利用 Tinker,我对 agent 本身进行了 RL 训练,当它训练出更好的模型时给予奖励。
Reward 在 54 个训练步骤中从 ~0.0 攀升到 ~0.63 的峰值。转移到一个 agent 从未训练过的隐藏任务族上也能工作。
一个 AI 在 RL 循环中,其行为是在另一个 RL 循环中训练 AI。
📈 结果
两个 RL 循环,拥有两个完全独立的训练栈。
Tinker 训练 agent。Agent 写出验证器环境、评分标准和 prime-rl 配置。prime-rl 训练小模型。内层模型的隐藏评估分数作为外层循环的 reward 流回来。
从头到尾一个 episode。
一个 episode = trainer agent 尝试为给定任务产生一个有效的、高质量的训练任务的一次尝试:
Task spec — 一个对要训练的内容的描述("教一个小模型解决多跳 persona 查询")、硬约束边界、eval 工具接口和一些开发示例。
Agent 工作 — 它通过 read_file / write_file / edit_file / list_files 编辑沙箱工作区,可以调用 get_baseline_scores 来查看未训练基础模型在隐藏 eval 上的分数。
submit_job — 触发一个验证探针。任何失败都会返回,agent 获得有限重试次数。
Dispatch — 一个经过验证的任务入队并被 Runpod GPU pod 的热池拿起,这些 pod 运行 prime-rl 的 GRPO 训练,并在隐藏 eval 上对 checkpoint 在训练前后评分。
Reward — 结合验证效率和训练模型相对于最佳未训练基线的提升。
外层循环随后使用 Tinker 对 episode reward 进行 RL 训练。每个外层批次在多达 16 个 GPU pod 上产生 40 个真实的内层训练任务。
Episode reward 是一个加权和(当前权重 0.35 / 0.60 / 0.05):
Validation — 首次有效提交得 1.0,每多尝试一次衰减;如果 episode 从未验证通过则为 0。(另外,外层循环在 agent 从不产生可解析提交时为 episode 评分 −0.1。你在 CSV 中看到的 −1.0 值是"无事后评分"日志哨兵,不是 reward。)
Job quality — 训练模型的绝对训练后分数及其相对于 best_pre(最佳未训练模型的冻结基线)的有符号提升的混合体:0.25·post + 0.75·uplift_term。一个在 GPU 上失败的任务在这里得 0 分(episode 保留其验证项)。
Train speed — 针对更快任务的小平局破坏者,以任务成功为条件。
给细心读者的注意:agent 面向的 prompt(template/INSTRUCTIONS.md)给 agent 一个简化的视图 — job quality 内的 75/25 uplift/绝对分割,加上更少尝试的推动 — 而不是完整的 0.35/0.60/0.05 分解。发布的适配器是针对该 prompt 训练的;实际计算的 reward 就是上面这个。
六个任务族,有意构建使得未训练模型在不训练时会困难,且都需要多步工具使用和推理:
五个任务族训练 agent;分类任务从不被训练,作为泛化探针。
设置:Qwen3.6-35B-A3B trainer agent,LoRA rank 8,lr 4e-5,GRPO with group size 8,最多 16 个并发 GPU pod,每个批次约 40 个真实训练任务。运行:pilot-7(10 步)→ 7b(24 步,warm-started)→ 7c(20 步,warm-started)— 总共 54 步。
分解 reward 展示了学到的东西,以及学习的顺序:
阶梯 1 — 过程可靠性(pilot-7)。整个早期收益来自于将验证失败和 GPU 上的死任务转换为完成的 episode。当总 reward 上升到 ~0.26 时,job 质量保持平稳。显示 GRPO 首先沿着陡峭的梯度上升。
阶梯 2 — 制造更好的模型(pilot-7b 及之后)。随着可靠性饱和(~0.75–0.80 验证),job 等级上升 0.30 → 0.41,隐藏 eval 的训练后评分从 ~0.04 噪声升至持续的 0.22–0.48。Agent 开始制造更好的模型,而不仅仅是工作的模型。
一个 agent 从未训练过的任务族随着外层循环训练显示性能上升,然后平稳:
早期训练运行在模型选择上是盲目的:77/79 个 episode 选择了较弱的 0.6B 模型。在引入 get_baseline_scores 工具和 uplift 评分后,策略反转并在训练期间保持不变,在弧线中深化:1.7B 个 job 编写 episode 从 42% → 95%。它还采用了暴露的 [prime_rl] 配置表面(一个 warm-start 边界内的 21% → ~78% episodes),配置组合合理:采样温度、优化器选择、算法变体、调度器、损失。
16x 热 GPU pod 在任何时刻训练:
Runpod 热 pod 队列 — 一个受限的 pod 池(最多 16 个),bootstrap 固定到确切的 prime-rl + verifiers 修订版本,所以每个节点都是副本;从供应到服务约 2 分钟。空闲 pod 被清理;队列由文件支持(queued/ → running/ → done/)。
GPU 选择是数据驱动的 — 一个 GPU × base-model 的基准矩阵发现 2× RTX A5000 以成本赢出,£0.10/job (~$0.13);偏好阶梯在供应时行走以获取库存中的任何东西。
队列实际运行的(标题弧,~1,750 个任务 — 低于名义 54 步 × 40,因为未通过验证的 episode 从不分发任务):A40 64%(340 GPU 训练小时)· RTX 4090 32%(151h)· RTX A6000 3% · RTX A5000 1%。基准成本赢家很少有库存,所以阶梯在弧线的大部分时间花在 A40 上。
prime-rl(GRPO) 训练小模型;checkpoint 在隐藏 eval 上用 vLLM 进行训练前后评分。
Tinker(Thinking Machines 的托管 RL API)通过 tinker-cookbook 的重要性采样 GRPO 训练 Qwen3.6-35B-A3B with LoRA。一个控制反演桥将每个 episode 作为后台任务在队列支持的策略后面运行,所以 cookbook 循环逐个 episode 驱动,而所有框架逻辑(验证重试、推动、评分)保持不变。
异步离策略(max_steps_off_policy=2)打败了掉队障碍 — 一个慢 episode 不再阻门整个批次。在标题弧中零个陈旧丢弃。
一切都被计量。每个 LLM 调用都记录 token 和美元;runs/costs.jsonl 是一个全局支出账本,针对每 episode 的预算执行。
整个编排运行在一个 CPU 盒子上,通过 Nebius 租赁。
诚实脚注:~£950 是标题弧,不是项目 — 试点、GPU 基准测试、基线播种和盲目的巷子(在 docs/ 回顾中写过)在上面花费了更多的几百。基准矩阵行在冷 pod 上运行高达 ~$0.37/job(见 benchmarks/REPORT.md);上面的每个任务范围是热池弧线任务。GBP 数字以 £0.745/$1(2026 年 7 月 10 日)计。
训练好的 trainer agent 在 Hugging Face 上:Danau5tin/ai-trains-ai-trainer。
它是来自 step-34 checkpoint 的 LoRA 适配器(rank 8,~560MB) — 上面表格中隐藏转移峰值 — 衍生自 Qwen/Qwen3.6-35B-A3B 并根据 Apache-2.0 发布以匹配基础模型。使用 PEFT 或 vLLM 的 LoRA 支持来加载它;要运行完整 episode,通过此框架驱动它。模型卡包含使用片段和诚实注释。
如果你想重现或扩展。下面会让你到达那里!
# .env at repo root with OPENROUTER_API_KEY=... (and TINKER_API_KEY for outer RL)
uv sync
uv run pytest # fully offline: no network, no keys
uv run at-episode --task examples/tasks/calc_chain_v1_fast.json --model qwen3.6-27b # run one episode with a frontier agent
每个 episode 打印 reward、token 使用和美元成本,并将完整工件(轨迹、清单、agent 的工作区)写入 runs/<run_id>/。
带有 Runpod + Tinker 密钥:
uv run at-worker --max-pods 2 --once # drain the job queue on real GPUs
uv run python scripts/seed_baselines.py # freeze eval baselines (required before RL)
uv run python scripts/train_trainer.py smoke=True # outer RL smoke test
更深入的指南:docs/architecture.md(组件和合约)、docs/outer-rl-tinker.md(完整 RL 手册)、docs/gpu-runner-spec.md(计算提供商合约)和 docs/ 中的回顾系列 — 每个试点,包括失败,都被写出来了(试点 4–5 在 eval 完整性回顾内,而不是独立文件)。
⚠️ 信任模型:agent 写的代码在主机上的超时保护子进程中执行,不是容器。对前沿 API 和您自己的 checkpoint 在模板合约中很好;在运行不受信任或重度 RL'd 策略前对探针进行容器化。
🔄 迭代实验 — 今天 agent 每个 episode 提交一个任务;自然的下一个阶梯是让它读取结果并提交后续实验,和/或允许多个实验同时分发,即对多任务研究品味评分而不是一次性任务质量。
🧠 更丰富的任务 — 今天只有无状态工具调用环境被暴露;打开 verifier 的其他环境类型将让 trainer agent 训练有状态编码 agent。
Prime-RL:一个真正优秀的 GRPO 训练框架。我使用过许多次,团队很好,非常乐于助人!
Verifiers:一个很好的环境和评分标准框架。
Thinking Machines 的 Tinker:第一次我使用它,这是一个很好的生活选择,不必管理训练基础设施。强烈推荐。
Runpod 用于便宜的、可脚本化的 GPU pod。
Qwen 团队 提供的基础模型小到可以以便士训练,大到值得训练。
Anthropic 团队 因为其令人难以置信的编码模型(Fable-5 写了这个项目的每一行代码),以及 Claude Code 框架。
这个项目太有趣了!一个 RL 循环内有一个 RL 循环是令人困惑的、令人兴奋的、令人可怕的,并指向前面的疯狂未来。感谢阅读!