Danau5tin/ai-trains-ai

GitHub: Danau5tin/ai-trains-ai

该项目通过双层强化学习循环,训练出一个能自主为其他模型编写并调度完整 RL 训练作业的元智能体。

Stars: 214 | Forks: 17

# 🤓 AI 训练 AI:使用 RL 训练一个使用 RL 训练 AI 的 AI 智能体 **TL;DR:** - 我构建了一个 pipeline,其中一个 AI 智能体: - 接收一个训练任务(“教一个模型做 X”) - 编写完整的 [prime-rl](https://github.com/PrimeIntellect-ai/prime-rl) 训练作业,包括:environment、reward、dataset、hyperparameters。 - 将其提交到真实的 [Runpod](https://runpod.io/) GPU 进行训练。 - 利用 [Tinker](https://thinkingmachines.ai/tinker),我对智能体本身进行了 RL 训练,当它训练出更好的模型时就给予 reward。 - 在 54 个训练步骤中,Reward 从 ~0.0 攀升至 ~0.63 的峰值。**迁移到一个它从未训练过的留出任务族上**。

An RL agent's outer loop — RL Agent → Creates RL Jobs → Reward — whose action creates many task-specific RL jobs, each training a small model inside its own RL loop on a GPU; the reward is how much those small models improved on the hidden eval.

处于 RL 循环中的 AI,其动作是在 RL 循环中训练 AI。(来源:assets/hero.svg。)

## 📚 目录 - [🔁 工作原理](#-how-it-works) - [Episode 流程](#the-episode) - [⚖️ Reward 设计](#️-reward-design) - [🧩 任务族](#-task-families) - [📈 结果](#-results) - [Reward 分两个不同的阶梯攀升](#1-the-reward-climbed-in-two-distinct-rungs) - [技能迁移到了留出任务族](#2-the-skill-transfers-to-a-held-out-task-family) - [智能体学会了选择更好的基础模型](#3-the-agent-learned-to-pick-the-better-base-model) - [🖥️ 基础设施](#️-infrastructure) - [💰 成本](#-costs) - [🤗 模型权重](#-model-weights) - [🚀 快速开始](#-getting-started) - [🔮 未来改进](#-future-improvements) - [致谢](#acknowledgements) ## 🔁 工作原理 两个 RL 循环,带有两个完全独立的训练 stack。 | | 训练对象 | 训练形式 | stack | |---|---|---|---| | **外循环** | 训练器智能体 ([Qwen3.6-35B-A3B](https://huggingface.co/Qwen/Qwen3.6-35B-A3B),LoRA) | 编写训练作业的 episode;episode 的 reward 即为 policy-gradient 信号 | [Tinker](https://thinkingmachines.ai/tinker) + tinker-cookbook (importance-sampling GRPO) | | **内循环** | 一个小型基础模型 ([Qwen3-0.6B](https://huggingface.co/Qwen/Qwen3-0.6B) / [1.7B](https://huggingface.co/Qwen/Qwen3-1.7B)) | 智能体编写的作业:一个 [verifiers](https://github.com/PrimeIntellect-ai/verifiers) environment + rubric,带有 `[prime_rl]` 配置表 | 运行在 Runpod GPU 上的 [prime-rl](https://github.com/PrimeIntellect-ai/prime-rl) (GRPO) | Tinker 负责训练智能体。智能体编写 verifiers envs、rubrics 和 prime-rl 配置。prime-rl 负责训练小模型。内部模型的隐藏 eval 分数回传,作为外循环的 reward。 ### Episode 流程

One episode as a pipeline: task spec → agent (with its five workspace tools) → submit_job → validation probe with a retry arrow back to the agent → file-backed job queue → GPU pod RL fine-tuning the small model → hidden eval scoring pre/post behind a padlock → reward flowing back to the agent.

一个 episode 的端到端流程。(来源:assets/episode.svg。)

一个 Episode = 训练器智能体针对给定任务,尝试生成一个有效且高质量训练作业的过程: 1. **Task spec** — 关于训练内容的描述(“教导一个小模型解析多跳角色查询”)、硬性约束边界、eval 工具接口,以及少量开发示例。 2. **智能体工作** — 它通过 `read_file` / `write_file` / `edit_file` / `list_files` 编辑沙盒化的 workspace,并可以调用 `get_baseline_scores` 查看未训练基础模型在隐藏 eval 中的得分。 3. **`submit_job`** — 触发验证探针。任何失败都会被返回,并且智能体会获得有限的重试次数。 4. **分发** — 验证通过的作业进入队列,由预热的 Runpod GPU pod 池接收,这些 pod 使用 prime-rl 运行 GRPO 训练,并在隐藏 eval 中对训练前后的 checkpoint 进行评分。 5. **Reward** — 结合了验证效率以及训练后模型相对于最佳未训练 baseline 的提升幅度。 随后,**外循环** 使用 [Tinker](https://thinkingmachines.ai/tinker) 根据 episode reward 对智能体本身进行 RL 训练。每个外循环 batch 最多会在 16 个 GPU pod 上生成 40 个真实的内部训练作业。 ## ⚖️ Reward 设计

Episode reward as a proportional bar: 0.35 validation + 0.60 job quality + 0.05 train speed, with job quality expanding into 0.25·post + 0.75·uplift over best_pre (worse <0.5, coasting 0.5, genuine gain toward 1.0).

Episode reward 是一个加权和(当前权重为 0.35 / 0.60 / 0.05): - **验证** — 首次提交即有效为 1.0,每多一次尝试会衰减;如果 episode 始终未通过验证则为 0。(另外,当智能体完全无法生成可解析的提交时,外循环对该 episode 的评分为 −0.1。你在 CSV 中看到的 −1.0 值是“无训练后分数”的日志哨兵值,而不是 reward。) - **作业质量** — 训练后模型的绝对分数与其相对于 `best_pre`(最佳*未训练*模型的固定 baseline)的带符号提升幅度的混合:`0.25·post + 0.75·uplift_term`。在 GPU 上崩溃的作业此项得分为 0(该 episode 保留其验证项的分数)。 - **训练速度** — 作为针对更快作业的小型决胜条件,以作业成功为前提。 给仔细阅读者的提示:面向智能体的 prompt(`template/INSTRUCTIONS.md`)为智能体提供了一个简化的视角 —— 即作业质量内部 75/25 的提升/绝对比例划分,加上“减少尝试次数”的轻推机制 —— 而不是完整的 0.35/0.60/0.05 分解。已发布的 adapter 是基于该 prompt 训练的;实际计算的 reward 是上述的完整公式。 ## 🧩 任务族 六个任务族,刻意设计成让未训练模型在没有经过训练的情况下难以完成,且都需要多步工具使用和推理: | 族 | 形式 | 未训练的 best_pre (n=200) | |---|---|---| | calc_chain | 链式算术,每一步的结果作为下一步的输入 | 0.742 | | multi_hop | 角色世界查询,需要多次依赖性查找 | 0.654 | | string_pipeline | 组合字符串转换 | 0.545 | | ledger | 通过工具进行有状态的账户记账 | 0.242 | | dispatch | 条件路由决策 | 0.323 | | **triage** (留出) | 值班事件分类:跨工具关联服务、事件和部署 | 0.352 | 五个族用于训练智能体;**triage 从未在训练中使用**,作为泛化能力探针。 ## 📈 结果 *设置:Qwen3.6-35B-A3B 训练器智能体,LoRA rank 8,lr 4e-5,GRPO group size 为 8,最多 16 个并发 GPU pod,每个 batch 约 40 个真实训练作业。运行过程:pilot-7 (10 步) → 7b (24 步,热启动) → 7c (20 步,热启动) — 总共 54 步。* ### 1. Reward 分两个不同的阶梯攀升

Batch reward per outer-loop step across the 7 → 7b → 7c arc: near zero for the first four steps, a steep climb through pilot-7 and early 7b, then a high plateau around 0.55–0.63.

分解 reward 展示了学到了*什么*,以及学习的顺序: - **阶梯 1 — 流程可靠性 (pilot-7)。** 早期所有的收益都来自于将验证失败和在 GPU 上崩溃的作业转化为已完成的 episode。总 reward 升至 ~0.26 的同时,作业质量保持平稳。这表明 GRPO 优先选择了最陡峭的梯度。 - **阶梯 2 — 制造更好的模型 (从 pilot-7b 开始)。** 随着可靠性趋于饱和(验证率约 ~0.75–0.80),作业评分从 0.30 升至 0.41,隐藏 eval 的训练后得分从 ~0.04 的噪音水平持续提升到了 0.22–0.48。**智能体开始制造*更好*的模型,而不仅仅是能用的模型。**

Hidden-eval post-training score per step: flat near zero for the first ~22 steps, then a clear climb to a ~0.3–0.36 plateau — the rung-2 transition made visible.

### 2. 技能迁移到了留出任务族 一个智能体从未训练过的任务族,其表现随着外循环训练而上升,随后趋于稳定: | checkpoint | 外循环步数 | 平均 reward | 验证通过 | 内部作业成功 | 最差 episode | |---|---|---|---|---|---| | 基础模型 | 0 | 0.399 | 9/10 | 5/9 | 0.000 | | pilot-7 最终 | 10 | 0.438 | 8/10 | 8/8 | 0.000 | | pilot-7b 最终 | 34 | **0.545** | **10/10** | 9/10 | **0.290** | | pilot-7c 最终 | 54 | 0.492 | 10/10 | 8/10 | 0.175 |

Triage holdout: per-episode rewards (faint dots) and arm means at 0, 10, 34 and 54 outer-loop steps — 0.399, 0.438, 0.545, 0.492: a rise through 34 steps, then a plateau.

### 3. 智能体学会了选择更好的基础模型和更好的超参数 早期的训练运行对模型选择是盲目的:77/79 个 episode 选择了较弱的 0.6B 模型。在引入 `get_baseline_scores` 工具和提升幅度评分后,策略发生了翻转,并在训练期间保持不变,且在整个过程中不断加深:1.7B 在编写作业 episode 中的占比从 **42% → 95%**。它还采用了暴露出来的 `[prime_rl]` 配置界面(在一个热启动边界内,占比由 21% → ~78%),并混合使用了合理的键位:sampling temperature、optimizer 选择、algorithm 变体、scheduler、loss。 ## 🖥️ 基础设施 **16 个随时保持预热的 GPU pod 同时进行训练:** ![16x_runpod_gpus_screenshot](https://raw.githubusercontent.com/Danau5tin/ai-trains-ai/main/assets/many_gpus_runpod.jpg) **内循环(智能体编写的作业):** - **Runpod 预热 pod 集群** — 一个有上限的池(最多 16 个 pod),在 bootstrap 阶段锁定确切的 prime-rl + verifiers 版本,以确保每个节点都是完全相同的副本;从配置到提供服务约需 2 分钟。空闲 pod 会被回收清理;队列由文件系统支撑(`queued/ → running/ → done/`)。 - **GPU 选择是数据驱动的** — 一个基于 GPU × 基础模型的 benchmark 矩阵发现,2× RTX A5000 在 **£0.10/作业 (~$0.13)** 的成本上胜出;在配置时会遍历偏好阶梯,以使用当前有库存的设备。 - **集群实际运行的设备**(核心阶段,约 1,750 个作业 — 低于名义上的 54 步 × 40 个,因为未通过验证的 episode 从未分发作业):**A40 64%** (340 GPU-训练-小时) · **RTX 4090 32%** (151h) · RTX A6000 3% · RTX A5000 1%。benchmark 中的成本赢家很少有大库存,因此集群在大部分时间里都在 A40 上运行。 - **prime-rl (GRPO)** 负责训练小模型;checkpoint 使用 vLLM 在隐藏 eval 中进行训练前后的评分。 **外循环(训练智能体):** - **Tinker**(Thinking Machines 托管的 RL API)通过 tinker-cookbook 的 importance-sampling GRPO,使用 LoRA 训练 Qwen3.6-35B-A3B。控制反转桥接器将每个 episode 作为后台任务运行在队列支撑的 policy 之后,因此 cookbook 循环可以逐步驱动 episode,同时保持所有 harness 逻辑(验证重试、轻推机制、评分)不变。 - **异步 off-policy** (`max_steps_off_policy=2`) 克服了落后者的障碍 — 一个缓慢的 episode 不再会阻塞整个 batch。在整个核心阶段,零过时数据被丢弃。 - **所有内容都有计量。** 每次调用 LLM 都会记录 token 数量和美元成本;`runs/costs.jsonl` 是一个强制执行每个 episode 预算的全局总账。 整个编排过程运行在一台 CPU 机器上,通过 [Nebius](https://nebius.com/) 租用。 ## 💰 成本 | 项目 | (粗略)测量成本 | |---|---| | 一个内部训练作业(训练 + 训练前/后 eval) | 在短任务上 benchmark 约为 \~£0.10–0.15 (\~$0.13–0.20);对于长角色族任务约为 \~£0.15–0.22 (\~$0.20–.30) | | 一个外循环 episode(智能体 token,Tinker) | \~£0.11–0.19 (\~$0.15–0.25) | | 一个外循环 batch(40 个真实 GPU 作业 + 智能体 token) | 全包约 \~£11–17 (\~$15–23) | | 留出 eval 分支 (n=10) | \~£4–6 (\~$5–8) | | Runpod,在整个核心阶段窗口内计费 | \~£605 (\~$810) — 包括一些并发的 baseline-seeding 和 GPU-benchmark pod | | Tinker 贯穿整个核心阶段(开票 — 包含所有智能体采样和训练,包括留出 eval episode) | \~£345 (\~$465) | | **整个核心阶段总计** | 全包约 **\~£950 (\~$1,275)**(\~£605 Runpod,\~£345 Tinker) | 诚实度脚注:\~£950 是核心阶段的花费,而不是整个项目的花费 — 到达这一步所经历的试点、GPU benchmark、baseline seeding 以及走入的死胡同(写在 `docs/` 的回顾中)在此基础上还多花了几百英镑。冷 pod 上的 benchmark 矩阵行成本高达 \~$0.37/作业(参见 `benchmarks/REPORT.md`);上述的每作业范围是预热池核心作业的成本。英镑数字按 £0.745/$1 计算(2026 年 7 月 10 日)。 ## 🤗 模型权重 训练好的训练器智能体位于 Hugging Face:**[Danau5tin/ai-trains-ai-trainer](https://huggingface.co/Danau5tin/ai-trains-ai-trainer)**。 这是来自 **step-34 checkpoint** 的 LoRA adapter(rank 8,\~560MB)— 即上表中的留出迁移峰值点 — 派生自 [Qwen/Qwen3.6-35B-A3B](https://huggingface.co/Qwen/Qwen3.6-35B-A3B),并在 Apache-2.0 下发布以与基础模型保持一致。使用 PEFT 加载或通过 vLLM 的 LoRA 支持进行服务;要运行完整的 episode,请通过此 harness 驱动它。模型卡片中包含用法代码片段和诚实度说明。 ## 🚀 快速开始 如果您想复现或扩展,以下内容将帮您实现目标! ``` # repo 根目录下的 .env,包含 OPENROUTER_API_KEY=...(以及用于 outer RL 的 TINKER_API_KEY) 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 使用量和美元成本,并将完整的 artifacts(trajectory、manifest、智能体的 workspace)写入 `runs//`。 使用 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/architecture.md)(组件与契约)、[docs/outer-rl-tinker.md](docs/outer-rl-tinker.md)(完整 RL runbook)、[docs/gpu-runner-spec.md](docs/gpu-runner-spec.md)(计算提供商契约),以及 `docs/` 中的回顾系列 — 每一次试点,包括失败的经历,都记录在内(试点 4–5 位于 [eval-integrity 回顾](docs/retro-2026-07-07-eval-integrity.md)中,而不是独立的文件中)。 ## 🔮 未来改进 - **🔄 迭代实验** — 如今,智能体每个 episode 只提交一个作业;下一个自然的阶梯是让它读取结果并提交后续实验,和/或允许同时分发多个实验,即评估多作业的*研究品味*,而不是一次性的作业质量。 - **🧠 更丰富的任务** — 目前仅暴露了无状态工具调用 envs;开放 verifiers 的其他 env 类型将允许训练器智能体去训练有状态的编程智能体。 ## 致谢 - [Prime-RL](https://github.com/PrimeIntellect-ai/prime-rl):一个真正优秀的 GRPO 训练框架。我已经用过它很多次了,团队非常棒而且非常乐于助人! - [Verifiers](https://github.com/PrimeIntellect-ai/verifiers):一个用于 envs 和 rubrics 的优秀框架。 - [Thinking Machines 的 Tinker](https://thinkingmachines.ai/tinker):我第一次使用它,不需要自己去管理训练基础设施绝对是一个很棒的生活方式选择。强烈推荐。 - [Runpod](https://runpod.io) 提供便宜、可脚本化的 GPU pod。 - 感谢 Qwen 团队提供的基础模型,它们小到只需花几分钱就能训练,又大到值得去训练。 - 感谢 Anthropic 团队提供的令人难以置信的编程模型(Fable-5 编写了本项目中的每一行代码),以及 Claude Code harness。 这个项目非常有趣!一个内部包含 RL 循环的 RL 循环令人困惑、激动、害怕,并且指向了一个前方疯狂的未来。感谢阅读! [Dan Austin](https://www.danaustin.ai)
标签:AutoML, 人工智能, 强化学习, 模型训练, 用户模式Hook绕过, 自动化机器学习, 逆向工具