RL 训练
Hermes Agent 内置了基于 Tinker-Atropos 的强化学习(Reinforcement Learning, RL)训练流水线。该系统支持使用 GRPO(Group Relative Policy Optimization)结合 LoRA 适配器,在特定环境任务上对语言模型进行训练,并完全通过代理的工具接口进行编排。
概述
RL 训练系统由三个组件构成:
- Atropos — 轨迹 API 服务器,负责协调环境交互、管理 rollout 组,并计算优势值
- Tinker — 训练服务,负责模型权重、LoRA 训练、采样/推理以及优化器步骤
- 环境 — Python 类,定义任务、评分机制和奖励函数(例如 GSM8K 数学问题)
代理可通过一组 rl_* 工具实现环境发现、训练参数配置、启动训练任务以及监控指标。
要求
RL 训练需要满足以下条件:
- Python >= 3.11(Tinker 包的要求)
- TINKER_API_KEY — Tinker 训练服务的 API 密钥
- WANDB_API_KEY — Weights & Biases 指标追踪的 API 密钥
tinker-atropos子模块(位于 Hermes 根目录下的tinker-atropos/目录中)
# Set up API keys
hermes config set TINKER_API_KEY your-tinker-key
hermes config set WANDB_API_KEY your-wandb-key
当两个密钥均存在且 Python 版本 ≥ 3.11 时,rl 工具集将自动启用。
可用工具
| 工具 | 描述 |
|---|---|
rl_list_environments | 发现可用的 RL 环境 |
rl_select_environment | 选择一个环境并加载其配置 |
rl_get_current_config | 查看可配置字段与锁定字段 |
rl_edit_config | 修改可配置的训练参数 |
rl_start_training | 启动一次训练运行(启动 3 个进程) |
rl_check_status | 监控训练进度及 WandB 指标 |
rl_stop_training | 停止正在运行的训练任务 |
rl_get_results | 获取最终指标和模型权重路径 |
rl_list_runs | 列出所有活跃和已完成的训练运行 |
rl_test_inference | 使用 OpenRouter 进行快速推理测试 |
工作流程
1. 发现环境
List the available RL environments
代理调用 rl_list_environments(),该函数通过 AST 解析扫描 tinker-atropos/tinker_atropos/environments/ 目录,查找继承自 BaseEnv 的 Python 类。每个环境定义了:
- 数据集加载 — 训练数据来源(例如 HuggingFace 数据集)
- 提示构造 — 如何将数据项格式化为模型输入
- 评分/验证 — 如何评估模型输出并分配奖励
2. 选择与配置
Select the GSM8K environment and show me the configuration
代理调用 rl_select_environment("gsm8k_tinker"),随后调用 rl_get_current_config() 查看所有参数。
配置字段分为两类:
可配置字段(可修改):
group_size— 每个样本的完成数量(默认:16)batch_size— 训练批次大小(默认:128)wandb_name— WandB 运行名称(自动设置为{env}-{timestamp})- 其他环境特定参数
锁定字段(基础设施设置,不可更改):
tokenizer_name— 模型分词器(例如Qwen/Qwen3-8B)rollout_server_url— Atropos API 地址(http://localhost:8000)max_token_length— 最大 token 长度(8192)max_num_workers— 最大并行工作线程数(2048)total_steps— 总训练步数(2500)lora_rank— LoRA 适配器秩(32)learning_rate— 学习率(4e-5)max_token_trainer_length— 训练器最大 token 数(9000)
3. 启动训练
Start the training run
代理调用 rl_start_training(),该操作执行以下步骤:
- 生成一个 YAML 配置文件,合并锁定设置与可配置参数的覆盖项
- 创建唯一的运行 ID
- 启动三个进程:
- Atropos API 服务器(
run-api)—— 轨迹协调 - Tinker 训练器(
launch_training.py)—— LoRA 训练 + 在端口 8001 上运行 FastAPI 推理服务 - 环境(
environment.py serve)—— 选定的环境连接至 Atropos
- Atropos API 服务器(
这三个进程以错开的延迟启动(API 延迟 5 秒,训练器延迟 30 秒,环境延迟再加 90 秒),以确保正确的初始化顺序。
4. 监控进度
Check the status of training run abc12345
代理调用 rl_check_status(run_id),返回以下信息:
- 各进程状态(运行中 / 已退出)
- 已运行时间
- WandB 指标(步骤数、奖励均值、正确率百分比、评估准确率)
- 日志文件路径(用于调试)
每个运行 ID 的状态检查频率限制为每 30 分钟一次。此限制可防止长时间运行的训练任务因频繁轮询而造成资源浪费。
5. 停止或获取结果
Stop the training run
# or
Get the final results for run abc12345
rl_stop_training() 按照逆序终止三个进程(环境 → 训练器 → API)。rl_get_results() 用于获取最终的 WandB 指标和训练历史。
推理测试
在投入完整训练运行之前,可使用 rl_test_inference 测试环境是否正常工作。该命令运行几轮推理与评分,使用 OpenRouter —— 无需 Tinker API,仅需提供 OPENROUTER_API_KEY。
Test the selected environment with inference
默认配置:
- 3 步 × 每模型 16 次完整生成 = 每模型 48 次 rollout
- 测试 3 个不同规模的模型以验证鲁棒性:
qwen/qwen3-8b(小规模)z-ai/glm-4.7-flash(中等规模)minimax/minimax-m2.7(大规模)
- 总计:约 144 次 rollout
此配置验证了:
- 环境正确加载
- 提示构造正常工作
- 推理响应解析在不同模型规模下均具备鲁棒性
- 验证器/评分逻辑能生成有效奖励
Tinker API 集成
训练器使用 Tinker API 执行模型训练操作:
- ServiceClient — 创建训练客户端与采样客户端
- 训练客户端 — 处理带重要性采样损失的前向-反向传播、优化器步骤(Adam)及权重检查点保存
- 采样客户端 — 使用最新训练权重提供推理服务
训练循环流程:
- 从 Atropos 获取一批 rollout(提示 + 完整生成 + 评分)
- 转换为 Tinker Datum 对象,包含填充后的 logprobs 和优势值
- 执行带重要性采样损失的前向-反向传播
- 执行一次优化器步骤(Adam:lr=4e-5, β1=0.9, β2=0.95)
- 保存权重,并为下一步推理创建新的采样客户端
- 将指标记录至 WandB
架构图
创建自定义环境
要创建新的强化学习环境:
- 在
tinker-atropos/tinker_atropos/environments/目录下创建一个 Python 文件 - 定义一个继承自
BaseEnv的类 - 实现以下必需方法:
load_dataset()— 加载你的训练数据get_next_item()— 向模型提供下一个数据项score_answer()— 对模型输出进行评分并分配奖励collect_trajectories()— 收集并返回轨迹
- 可选:定义一个继承自
BaseEnvConfig的自定义配置类
请参考现有的 gsm8k_tinker.py 作为模板。Agent 可协助你创建新环境——它可以读取现有环境文件、检查 HuggingFace 数据集,并生成新的环境代码。
WandB 指标
训练运行会将关键指标记录至 Weights & Biases:
| 指标 | 描述 |
|---|---|
train/loss | 训练损失(重要性采样) |
train/learning_rate | 当前学习率 |
reward/mean | 各组的平均奖励 |
logprobs/mean | 参考 logprobs 的平均值 |
logprobs/mean_training | 训练 logprobs 的平均值 |
logprobs/diff | logprob 偏移(参考 - 训练) |
advantages/mean | 平均优势值 |
advantages/std | 优势标准差 |
日志文件
每次训练运行会在 ~/.hermes/logs/rl_training/ 目录下生成日志文件:
logs/
├── api_{run_id}.log # Atropos API server logs
├── trainer_{run_id}.log # Tinker trainer logs
├── env_{run_id}.log # Environment process logs
└── inference_tests/ # Inference test results
├── test_{env}_{model}.jsonl
└── test_{env}_{model}.log
当训练失败或产生意外结果时,这些日志文件对于调试至关重要。