RL Training

Hermes Agent включает в себя встроенный конвейер RL (Reinforcement Learning) обучения, построенный на Tinker-Atropos. Это позволяет обучать языковые модели на задачах, специфичных для окружений, с использованием GRPO (Group Relative Policy Optimization) и LoRA адаптеров, управляемых полностью через интерфейс инструментов агента.

Обзор

Система RL обучения состоит из трёх компонентов:

  1. Atropos — API-сервер траекторий, который координирует взаимодействия с окружением, управляет группами развёрток и вычисляет преимущества

  2. Tinker — Сервис обучения, который обрабатывает веса модели, LoRA обучение, сэмплирование/инференс и шаги оптимизатора

  3. Окружения — Классы Python, которые определяют задачи, оценку и функции наград (например, математические задачи GSM8K)

Агент может обнаруживать окружения, настраивать параметры обучения, запускать тренировки и отслеживать метрики — всё через набор инструментов rl_*.

Требования

Для RL обучения требуется:

# 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. Каждое окружение определяет:

2. Выбор и настройка

Select the GSM8K environment and show me the configuration

Агент вызывает rl_select_environment("gsm8k_tinker"), а затем rl_get_current_config() для просмотра всех параметров.

Поля конфигурации разделены на две категории:

Настраиваемые поля (можно изменять):

Заблокированные поля (инфраструктурные настройки, нельзя изменить):

3. Запуск обучения

Start the training run

Агент вызывает rl_start_training(), который:

  1. Генерирует YAML конфигурационный файл, объединяющий заблокированные настройки с настраиваемыми переопределениями

  2. Создаёт уникальный ID запуска

  3. Запускает три процесса:

  4. Atropos API сервер (run-api) — координация траекторий
  5. Тренер Tinker (launch_training.py) — LoRA обучение + FastAPI сервер инференса на порту 8001
  6. Окружение (environment.py serve) — выбранное окружение, подключающееся к Atropos

Процессы запускаются с задержками (5s для API, 30s для тренера, ещё 90s для окружения) для обеспечения правильного порядка инициализации.

4. Мониторинг прогресса

Check the status of training run abc12345

Агент вызывает rl_check_status(run_id), который сообщает:

Ограничение частоты запросов Проверки статуса ограничены одним запросом каждые 30 минут на каждый ID запуска. Это предотвращает избыточный опрос во время длительных тренировок, занимающих часы.

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

Конфигурация по умолчанию:

Это проверяет:

Интеграция с Tinker API

Тренер использует API Tinker для операций обучения модели:

Цикл обучения:

  1. Получает пакет развёрток от Atropos (промпт + завершения + оценки)

  2. Преобразует в объекты Tinker Datum с дополненными logprobs и преимуществами

  3. Выполняет прямой и обратный проходы с loss на основе importance sampling

  4. Выполняет шаг оптимизатора (Adam: lr=4e-5, β1=0.9, β2=0.95)

  5. Сохраняет веса и создаёт новый клиент сэмплирования для инференса на следующем шаге

  6. Логирует метрики в 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 окружение:

  1. Создайте файл Python в tinker-atropos/tinker_atropos/environments/

  2. Определите класс, наследующийся от BaseEnv

  3. Реализуйте обязательные методы:

  4. load_dataset() — Загрузите тренировочные данные
  5. get_next_item() — Предоставьте следующий элемент модели
  6. score_answer() — Оцените выходы модели и назначьте награды
  7. collect_trajectories() — Соберите и верните траектории

  8. При необходимости определите пользовательский класс конфигурации, наследующийся от 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

Они незаменимы для отладки, когда обучение завершается ошибкой или даёт неожиданные результаты.