Инструменты15 сентября 2026 г., 05:17 МСК🤖 Auto

AsyncGRPO с LoRA на HF Jobs: ускорение обучения в 4 раза без NCCL

Команда Hugging Face представила архитектуру AsyncGRPOTrainer с поддержкой LoRA, позволяющую обучать RL-модели на разных машинах через Storage Bucket, сократив время обучения с 3.5 часов до 53 минут.

Баннер новости 7502

Суть прорыва: разделение обучения и инференса

В версии TRL v1.14 появилась поддержка AsyncGRPOTrainer с адаптерами LoRA. Ключевое отличие от классических подходов — синхронизация весов происходит не через высокоскоростную сеть NCCL, а через файловую систему. Адаптер ранга-1 для модели 1.5B весит всего несколько мегабайт (против 3 ГБ полной модели), что позволяет передавать его через Storage Bucket Hugging Face Jobs, смонтированный как FUSE-файловая система.

Это решает проблему изоляции Hugging Face Jobs: каждый Job работает на отдельной VM, и у них нет общего локального диска или возможности создать NCCL-группу. Архитектура использует бакет как общий раздел, где тренер пишет адаптер, а серверы vLLM читают его.

Архитектура: Бакет, Прокси и vLLM

Решение состоит из трех компонентов, работающих асинхронно:

  • Trainer Job: Запускает AsyncGRPOTrainer (с FSDP). Каждые несколько шагов оптимизатора он сохраняет адаптер в директорию .vllm_lora/trl-policy-v{N} и делает атомарный редирект пути.
  • vLLM Jobs (Replicas): Два экземпляра vLLM (v0.27.1) на GPU H200. Они монтируют тот же бакет в режиме чтения. Поддерживается VLLM_ALLOW_RUNTIME_LORA_UPDATING=1 для загрузки адаптеров на лету.
  • Proxy Server: Маленький прокси, который маршрутизирует запросы (rollouts) к реплике, где уже есть нужный KV-prefix, и рассылает обновления адаптеров всем репликам.

Почему это важно для RL

Исследования (например, от Thinking Machines) показывают, что для policy-gradient RL адаптера ранга-1 достаточно, так как функция преимущества дает лишь ~O(1) бит информации на эпизод. Это позволяет использовать крошечные веса для обучения, избегая передачи гигабайтов данных между узлами.

Результаты производительности

Использование LoRA и асинхронной синхронизации через бакет дало кратный прирост скорости. В тестовых запусках (5 runs) один и тот же рецепт обучения на 500 шагов сократился с 3 часов 27 минут до 53 минут.

Параметр Значение / Описание
Версия TRL v1.14 (с поддержкой LoRA в AsyncGRPO)
Версия vLLM v0.27.1 (фиксированная для стабильности API)
Модель Qwen/Qwen2.5-Math-1.5B
Размер адаптера Несколько МБ (Rank-1)
Время обучения (500 шагов) 53 мин (ранее: 3 ч 27 мин)
max_loras 6 (для max_staleness=4 + слоты для swap)
Механизм синхронизации Storage Bucket (FUSE mount), без NCCL

Технические детали настройки

Для корректной работы необходимо учитывать max_staleness. Если установлено значение 4, vLLM должен держать в памяти текущую версию политики плюс 4 предыдущие, чтобы завершить запущенные rollouts. Это требует --max-loras 6 (4 старых + 1 новая + 1 слот для переключения). Команда запуска vLLM выглядит следующим образом:

hf jobs run --detach --flavor h200 --timeout 8h \
    -v "hf://buckets/${BUCKET}:/lora:ro" \
    -e VLLM_ALLOW_RUNTIME_LORA_UPDATING=1 \
    -e VLLM_SERVER_DEV_MODE=1 \
    -- vllm/vllm-openai:v0.27.1 \
    vllm serve Qwen/Qwen2.5-Math-1.5B --host 0.0.0.0 --port 8000 \
        --enable-lora --max-lora-rank 1 --max-loras 6

Такой подход позволяет масштабировать RL-обучение на эфемерных инфраструктурах, таких как Hugging Face Jobs, без необходимости в сложных сетевых настройках между узлами.

Источник: Hugging Face blog ↗