Skip to main content

强化学习训练

Hermes Agent 内置了基于 Tinker-Atropos 的强化学习(RL)训练流水线。该系统支持使用 GRPO(组相对策略优化)与 LoRA 适配器,在环境特定任务上对语言模型进行训练,并通过代理的工具接口完全实现自动化编排。

概述

强化学习训练系统包含三个核心组件:

  1. Atropos — 轨迹 API 服务端,负责协调环境交互、管理回溯组(rollout groups),并计算优势值(advantages)
  2. Tinker — 训练服务,处理模型权重、LoRA 训练、采样/推理以及优化器步骤
  3. 环境(Environments) — 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 适配器秩(rank=32)
  • learning_rate — 学习率(4e-5)
  • max_token_trainer_length — 训练器最大 token 数(9000)

3. 启动训练

Start the training run

代理调用 rl_start_training(),该操作执行以下步骤:

  1. 生成 YAML 配置文件,合并锁定设置与用户覆盖的可配置项
  2. 创建唯一运行 ID
  3. 启动三个独立进程:
    • Atropos API 服务端 (run-api) — 负责轨迹协调
    • Tinker 训练器 (launch_training.py) — 执行 LoRA 训练 + 在端口 8001 上提供 FastAPI 推理服务
    • 环境实例 (environment.py serve) — 连接到 Atropos 的选定环境

各进程按顺序延迟启动(API 5 秒,训练器 30 秒,环境额外延迟 90 秒),确保初始化顺序正确。

4. 监控进度

Check the status of training run abc12345

代理调用 rl_check_status(run_id),返回以下信息:

  • 各进程状态(运行中 / 已退出)
  • 当前运行时间
  • WandB 指标(当前步数、平均奖励、正确率百分比、评估准确率)
  • 日志文件位置(用于调试)
速率限制

每轮运行的状态检查频率限制为 每 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 密钥。

Test the selected environment with inference

默认配置:

  • 3 步 × 每步 16 次生成 = 每模型共 48 次回溯
  • 测试 3 个不同规模的模型以验证鲁棒性:
    • qwen/qwen3-8b(小模型)
    • z-ai/glm-4.7-flash(中等模型)
    • minimax/minimax-m2.7(大模型)
  • 总计约 144 次回溯

测试目标包括:

  • 环境是否能正确加载
  • 提示构造是否有效
  • 推理响应解析在不同模型规模下是否稳定
  • 验证器/评分逻辑能否产生合理奖励

Tinker API 集成

训练器使用 Tinker API 执行模型训练操作:

  • ServiceClient — 创建训练客户端与采样客户端
  • 训练客户端 — 处理前向-反向传播、重要性采样损失、优化器步骤(Adam)、权重检查点保存
  • 采样客户端 — 使用最新训练权重提供推理服务

训练循环流程如下:

  1. 从 Atropos 获取一批回溯数据(提示 + 生成结果 + 评分)
  2. 将其转换为 Tinker Datum 对象,包含填充后的 logprobs 和优势值
  3. 执行带重要性采样的前向-反向传播
  4. 执行一次优化器步进(Adam:lr=4e-5, β1=0.9, β2=0.95)
  5. 保存权重,并创建新的采样客户端用于下一步推理
  6. 将指标日志写入 WandB

架构图

创建自定义环境

要创建新的 RL 环境,请遵循以下步骤:

  1. tinker-atropos/tinker_atropos/environments/ 下新建一个 Python 文件
  2. 定义一个继承自 BaseEnv 的类
  3. 实现以下必需方法:
    • load_dataset() — 加载你的训练数据
    • get_next_item() — 向模型提供下一个样本
    • score_answer() — 评分模型输出并分配奖励
    • collect_trajectories() — 收集并返回轨迹数据
  4. 可选地,定义一个继承自 BaseEnvConfig 的自定义配置类

建议参考现有 gsm8k_tinker.py 作为模板。代理可协助创建新环境——它能读取已有环境文件、分析 HuggingFace 数据集,并生成新的环境代码。

WandB 指标

训练任务会将关键指标记录至 Weights & Biases,主要包括:

指标描述
train/loss训练损失(重要性采样损失)
train/learning_rate当前学习率
reward/mean各组间的平均奖励
logprobs/mean平均参考 logprobs
logprobs/mean_training平均训练 logprobs
logprobs/difflogprob 偏移量(参考 - 训练)
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

这些日志文件在训练失败或结果异常时极具调试价值。