跳到主要內容

RL 訓練

Hermes Agent 內置了基於 Tinker-Atropos 的強化學習(Reinforcement Learning, RL)訓練流水線。該系統支持使用 GRPO(Group Relative Policy Optimization)結合 LoRA 適配器,在特定環境任務上對語言模型進行訓練,並完全通過 Agent 的工具接口進行編排。

概述

RL 訓練系統由三個組件構成:

  1. Atropos — 軌跡 API 服務器,負責協調環境交互、管理 rollout 組,並計算優勢值
  2. Tinker — 訓練服務,負責模型權重、LoRA 訓練、採樣/推理以及優化器步驟
  3. 環境 — 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(),該操作執行以下步驟:

  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

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)及權重檢查點保存
  • 採樣客戶端 — 使用最新訓練權重提供推理服務

訓練循環流程:

  1. 從 Atropos 獲取一批 rollout(提示 + 完整生成 + 評分)
  2. 轉換為 Tinker Datum 對象,包含填充後的 logprobs 和優勢值
  3. 執行帶重要性採樣損失的前向-反向傳播
  4. 執行一次優化器步驟(Adam:lr=4e-5, β1=0.9, β2=0.95)
  5. 保存權重,併為下一步推理創建新的採樣客戶端
  6. 將指標記錄至 WandB

架構圖

創建自定義環境

要創建新的強化學習環境:

  1. tinker-atropos/tinker_atropos/environments/ 目錄下創建一個 Python 文件
  2. 定義一個繼承自 BaseEnv 的類
  3. 實現以下必需方法:
    • load_dataset() — 加載你的訓練數據
    • get_next_item() — 向模型提供下一個數據項
    • score_answer() — 對模型輸出進行評分並分配獎勵
    • collect_trajectories() — 收集並返回軌跡
  4. 可選:定義一個繼承自 BaseEnvConfig 的自定義配置類

請參考現有的 gsm8k_tinker.py 作為模板。Agent 可協助你創建新環境——它可以讀取現有環境文件、檢查 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 服務器日誌
├── trainer_{run_id}.log # Tinker 訓練員日誌
├── env_{run_id}.log # 環境進程日誌
└── inference_tests/ # 推理測試結果
├── test_{env}_{model}.jsonl
└── test_{env}_{model}.log

當訓練失敗或產生意外結果時,這些日誌文件對於調試至關重要。