RL Training
Hermes Agent включает в себя встроенный конвейер RL (Reinforcement Learning) обучения, построенный на Tinker-Atropos. Это позволяет обучать языковые модели на задачах, специфичных для окружений, с использованием GRPO (Group Relative Policy Optimization) и LoRA адаптеров, управляемых полностью через интерфейс инструментов агента.
Обзор
Система RL обучения состоит из трёх компонентов:
-
Atropos — API-сервер траекторий, который координирует взаимодействия с окружением, управляет группами развёрток и вычисляет преимущества
-
Tinker — Сервис обучения, который обрабатывает веса модели, LoRA обучение, сэмплирование/инференс и шаги оптимизатора
-
Окружения — Классы Python, которые определяют задачи, оценку и функции наград (например, математические задачи GSM8K)
Агент может обнаруживать окружения, настраивать параметры обучения, запускать тренировки и отслеживать метрики — всё через набор инструментов rl_*.
Требования
Для RL обучения требуется:
-
Python >= 3.11 (требование пакета Tinker)
-
TINKER_API_KEY — API-ключ для сервиса обучения Tinker
-
WANDB_API_KEY — API-ключ для отслеживания метрик Weights & Biases
-
Подмодуль
tinker-atropos(находится вtinker-atropos/относительно корня Hermes)
# 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(), который сканирует tinker-atropos/tinker_atropos/environments/ с использованием AST парсинга для поиска классов Python, наследующихся от BaseEnv. Каждое окружение определяет:
-
Загрузка датасета — откуда берутся тренировочные данные (например, датасеты 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— URL API Atropos (http://localhost:8000) -
max_token_length— Максимальная длина токенов (8192) -
max_num_workers— Максимальное количество параллельных workers (2048) -
total_steps— Общее количество шагов обучения (2500) -
lora_rank— Ранг LoRA адаптера (32) -
learning_rate— Скорость обучения (4e-5) -
max_token_trainer_length— Максимум токенов для Trainer (9000)
3. Запуск обучения
Start the training run
Агент вызывает rl_start_training(), который:
-
Генерирует YAML конфигурационный файл, объединяющий заблокированные настройки с настраиваемыми переопределениями
-
Создаёт уникальный ID запуска
-
Запускает три процесса:
- Atropos API сервер (
run-api) — координация траекторий - Тренер Tinker (
launch_training.py) — LoRA обучение + FastAPI сервер инференса на порту 8001 - Окружение (
environment.py serve) — выбранное окружение, подключающееся к Atropos
Процессы запускаются с задержками (5s для API, 30s для тренера, ещё 90s для окружения) для обеспечения правильного порядка инициализации.
4. Мониторинг прогресса
Check the status of training run abc12345
Агент вызывает rl_check_status(run_id), который сообщает:
-
Статус процессов (запущен/завершён для каждого из 3 процессов)
-
Время работы
-
Метрики WandB (шаг, средняя награда, процент правильных, точность оценки)
-
Расположение файлов логов для отладки
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 развёрток на модель
-
Тестирует 3 модели разного масштаба для проверки устойчивости:
qwen/qwen3-8b(малая)z-ai/glm-4.7-flash(средняя)-
minimax/minimax-m2.7(большая) -
Всего: ~144 развёртки
Это проверяет:
-
Окружение загружается корректно
-
Формирование промпта работает
-
Парсинг ответов инференса устойчив на разных масштабах моделей
-
Логика верификации/оценки выдаёт корректные награды
Интеграция с Tinker API
Тренер использует API Tinker для операций обучения модели:
-
ServiceClient — Создаёт клиенты обучения и сэмплирования
-
Training client — Обрабатывает прямой и обратный проходы с loss на основе importance sampling, шаги оптимизатора (Adam) и сохранение контрольных точек весов
-
Sampling client — Предоставляет инференс с использованием последних обученных весов
Цикл обучения:
-
Получает пакет развёрток от Atropos (промпт + завершения + оценки)
-
Преобразует в объекты Tinker Datum с дополненными logprobs и преимуществами
-
Выполняет прямой и обратный проходы с loss на основе importance sampling
-
Выполняет шаг оптимизатора (Adam: lr=4e-5, β1=0.9, β2=0.95)
-
Сохраняет веса и создаёт новый клиент сэмплирования для инференса на следующем шаге
-
Логирует метрики в WandB
Диаграмма архитектуры
flowchart LR
api["Atropos API<br/>run-api<br/>port 8000"]
env["Environment<br/>BaseEnv implementation"]
infer["OpenAI / sglang<br/>inference API<br/>port 8001"]
trainer["Tinker Trainer<br/>LoRA training + FastAPI"]
env <--> api
env --> infer
api -->|"batches: tokens, scores, logprobs"| trainer
trainer -->|"serves inference"| infer
Создание пользовательских окружений
Чтобы создать новое RL окружение:
-
Создайте файл Python в
tinker-atropos/tinker_atropos/environments/ -
Определите класс, наследующийся от
BaseEnv -
Реализуйте обязательные методы:
load_dataset()— Загрузите тренировочные данныеget_next_item()— Предоставьте следующий элемент моделиscore_answer()— Оцените выходы модели и назначьте награды-
collect_trajectories()— Соберите и верните траектории -
При необходимости определите пользовательский класс конфигурации, наследующийся от
BaseEnvConfig
Изучите существующий gsm8k_tinker.py как шаблон. Агент может помочь вам создать новые окружения — он может читать существующие файлы окружений, просматривать датасеты HuggingFace и писать новый код окружений.
Метрики WandB
Тренировочные запуски логируются в Weights & Biases со следующими ключевыми метриками:
| Метрика | Описание |
|---|---|
train/loss |
Потери обучения (importance sampling) |
train/learning_rate |
Текущая скорость обучения |
reward/mean |
Средняя награда по группам |
logprobs/mean |
Средние logprobs референса |
logprobs/mean_training |
Средние logprobs обучения |
logprobs/diff |
Отклонение logprobs (референс - обучение) |
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
Они незаменимы для отладки, когда обучение завершается ошибкой или даёт неожиданные результаты.