RL 訓練
Hermes Agent 內置了基於 Tinker-Atropos 的強化學習(Reinforcement Learning, RL)訓練流水線。該系統支持使用 GRPO(Group Relative Policy Optimization)結合 LoRA 適配器,在特定環境任務上對語言模型進行訓練,並完全通過 Agent 的工具接口進行編排。
概述
RL 訓練系統由三個組件構成:
- Atropos — 軌跡 API 服務器,負責協調環境交互、管理 rollout 組,並計算優勢值
- Tinker — 訓練服務,負責模型權重、LoRA 訓練、採樣/推理以及優化器步驟
- 環境 — Python 類,定義任務、評分機制和獎勵函數(例如 GSM8K 數學問題)
Agent 可通過一組 rl_* 工具實現環境發現、訓練參數配置、啟動訓練任務以及監控指標。
要求
RL 訓練需要滿足以下條件:
- Python >= 3.11(Tinker 包的要求)
- TINKER_API_KEY — Tinker 訓練服務的 API 密鑰
- WANDB_API_KEY — Weights & Biases 指標追蹤的 API 密鑰
tinker-atropos子模塊(位於 Hermes 根目錄下的tinker-atropos/目錄中)
# 設置API鍵
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
Agent 調用 rl_list_environments(),該函數通過 AST 解析掃描 tinker-atropos/tinker_atropos/environments/ 目錄,查找繼承自 BaseEnv 的 Python 類。每個環境定義了:
- 數據集加載 — 訓練數據來源(例如 HuggingFace 數據集)
- 提示構造 — 如何將數據項格式化為模型輸入
- 評分/驗證 — 如何評估模型輸出並分配獎勵
2. 選擇與配置
Select the GSM8K environment and show me the configuration
Agent 調用 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
Agent 調用 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
Agent 調用 rl_check_status(run_id),返回以下信息:
- 各進程狀態(運行中 / 已退出)
- 已運行時間
- WandB 指標(步驟數、獎勵均值、正確率百分比、評估準確率)
- 日誌文件路徑(用於調試)
每個運行 ID 的狀態檢查頻率限制為每 30 分鐘一次。此限制可防止長時間運行的訓練任務因頻繁輪詢而造成資源浪費。
5. 停止或獲取結果
Stop the training run
# 或者
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 服務器日誌
├── trainer_{run_id}.log # Tinker 訓練員日誌
├── env_{run_id}.log # 環境進程日誌
└── inference_tests/ # 推理測試結果
├── test_{env}_{model}.jsonl
└── test_{env}_{model}.log
當訓練失敗或產生意外結果時,這些日誌文件對於調試至關重要。