verl, часть 1: что это, установка и быстрый старт (PPO на GSM8K)
Перевод документации verl — библиотеки RL-дообучения LLM от ByteDance Seed: что она умеет, как её поставить через uv, и полный перевод «Быстрого старта» — PPO на задачах GSM8K с моделью Qwen2.5-0.5B, функцией награды по правилам и разбором логов.
verl — библиотека для RL-обучения больших языковых моделей, начатая командой ByteDance Seed и поддерживаемая сообществом
verl. Расшифровка названия: Volcano Engine Reinforcement Learning for LLMs. verl — гибкая, эффективная и готовая
к продакшену библиотека; это открытая версия статьи HybridFlow: A Flexible and Efficient RLHF Framework.
verl гибкая и простая:
Лёгкое расширение разными RL-алгоритмами. Модель программирования с гибридным контроллером позволяет гибко
описывать и эффективно выполнять сложные потоки данных пост-трейнинга. Потоки RL вроде GRPO и PPO собираются в несколько
строк кода.
Бесшовная интеграция с существующей инфраструктурой LLM через модульные API: вычисления и зависимости данных разделены,
поэтому легко подключаются FSDP, Megatron-LM, vLLM, SGLang и др.
Гибкое размещение на устройствах: модели можно по-разному раскладывать по группам GPU — для эффективного использования
ресурсов и масштабирования на кластеры разного размера.
Готовая интеграция с популярными моделями Hugging Face.
verl быстрая:
Пропускная способность уровня лучших систем: интеграция с лучшими движками обучения и инференса LLM.
Эффективная перекладка весов актора с 3D-HybridEngine: убирает лишние копии в памяти и заметно сокращает обмен
данными при переходе между фазами обучения и генерации.
Обучение. Для исследований и прототипов разных моделей, датасетов и RL-алгоритмов мы рекомендуем бэкенд
FSDP / FSDP2. Тем, кому нужна лучшая масштабируемость, рекомендуем Megatron-LM. Оба бэкенда обслуживаются
одним и тем же унифицированным слоем воркеров.
Инференс. Поддерживается vLLM 0.18.0 и новее; более старые выпуски с verl больше не работают. Генерация на SGLang
активно развивается и предлагает много продвинутых возможностей. Интеграция с TGI от Hugging Face обычно используется
для отладки и опытов на одной GPU.
Окружение Python в verl управляется uv: один зафиксированный в репозитории файл uv.lock
покрывает все бэкенды, а для конкретного запуска бэкенды выбираются как extras:
инференс: vllm или sglang;
обучение: fsdp или megatron;
cpu: без GPU, для CI и быстрых проверок.
Отдельного шага установки нет.uv run --extra ... при первом использовании создаёт виртуальное окружение проекта
(.venv) из uv.lock, а дальше переиспользует его, так что запуск задачи — одна и та же команда, есть окружение или нет.
Окружение uv рассчитано на Linux с Python 3.12 на x86_64 и aarch64. uv никогда не собирает нативные пакеты
из исходников: apex, transformer-engine и flash-attn берутся готовыми из индекса колёс verl (собраны под CUDA 13.0,
torch 2.13, CPython 3.12); движки инференса — прямо с PyPI.
Подготовка на своей машине (без Docker):
Окно терминала
# один раз: установить uv
curl-LsSfhttps://astral.sh/uv/install.sh|sh
gitclonehttps://github.com/verl-project/verl.git
cdverl
# шага установки нет: первый uv run соберёт .venv из зафиксированного uv.lock
--frozen — использовать зафиксированный uv.lock как есть, никогда не пересчитывать зависимости;
--all-packages — установить все пакеты рабочего пространства uv;
--extra <движок> --extra <тренер> — комбинация бэкендов для этого запуска.
Правила комбинаций: не больше одного движка инференса (vllmилиsglang), плюс бэкенд обучения (fsdp по
умолчанию или megatron); cpu используется отдельно. Держите один и тот же набор extras во всех командах одной задачи:
uv run синхронизирует .venv ровно с переданными extras, и чередование комбинаций каждый раз переустанавливает torch.
Скрипты в examples/ уже содержат всю обвязку uv — тестовый запуск не требует подготовки:
Драйвер запускается под uv run, а Ray запускает TaskRunner и всех воркеров той же командой через
ray_kwargs.ray_init.runtime_env.py_executable — так все процессы задачи используют одно окружение.
Откат на системный Python. Установите VERL_USE_UV=0, чтобы запускать текущим интерпретатором:
VERL_USE_UV=0 bash examples/grpo_trainer/run_qwen3_8b_fsdp.sh.
В этом примере мы обучаем LLM решать задачи GSM8K с наградой,
вычисляемой функцией.1
Что нужно заранее:
последняя версия verl и зависимостей, установленная по руководству по установке. Рекомендуется Docker-образ;
GPU как минимум с 24 ГБ памяти.
Команды python3 ниже предполагают интерпретатор, в котором verl уже есть, — один из Docker-образов или
активированный .venv. В варианте с uv шага установки нет: запускайте их из корня репозитория с префиксом uv run,
который при первом использовании собирает .venv из uv.lock:
Окно терминала
UV_RUN="uv run --frozen --all-packages --extra vllm --extra fsdp"
GSM8K — датасет математических задач. Промпт — задача уровня начальной школы, модель должна её решить. Пример:
Промпт:
Katy makes coffee using teaspoons of sugar and cups of water in the ratio of 7:13. If she used a total of 120
teaspoons of sugar and cups of water, calculate the number of teaspoonfuls of sugar she used.
(«Кейти варит кофе, беря чайные ложки сахара и чашки воды в отношении 7:13. Всего она взяла 120 ложек сахара и чашек воды.
Сколько чайных ложек сахара она использовала?»)
Решение:
The total ratio representing the ingredients she used to make the coffee is 7+13 = <<7+13=20>>20 Since the
fraction representing the number of teaspoons she used is 7/20, she used 7/20*120 = <<7/20*120=42>>42 #### 42
(«Сумма частей отношения: 7 + 13 = 20. Доля сахара — 7/20, значит, она взяла 7/20 · 120 = 42 ложки. #### 42».
Вставки в двойных угловых скобках — вычисления калькулятором из разметки датасета; ответ — после ####.)
Мы используем заранее заданную награду по правиламправиловая наградаENrule-based rewardНаграду считает программа (сверка ответа, запуск тестов, проверка формата), а не нейросеть. Её трудно «взломать».. Модель обязана выдавать итоговый
ответ после четырёх символов «#», как в решении. Регулярным выражением извлекаем итоговый ответ и из эталонного решения,
и из вывода модели. Награда: 1 — за правильный ответ, 0,0 — за неправильный и 0 — если ответа нет.
Подробности — в verl/utils/reward_score/gsm8k.py.
Скрипт обучения
Теперь запустим PPO-обучение с этими датасетом и моделью.2
Задайте data.train_files, data.val_files, actor_rollout_ref.model.path и critic.model.path под имена или пути
ваших датасета и модели. Можно установить VERL_USE_MODELSCOPE=True, чтобы качать модели с ModelScope, а не с Hugging Face.
Полные логи обучения и валидации для сравнения — на странице Algorithm Baselines документации.
По умолчанию чекпойнт сохраняется в checkpoints/${trainer.project_name}/${trainer.experiment_name}. Сохранённые
чекпойнты можно слить в модель Hugging Face модулем verl.model_merger, например:
Быстрый старт рассчитан на одну GPU с 24 ГБ — ваша RTX 4080 на 32 ГБ подходит с запасом. Ожидаемое время шага —
десятки секунд (в логе оригинала шаг ≈ 70 с на их GPU), эпоха GSM8K при train_batch_size=256 — около 29 шагов
(7473 задачи / 256). Для первого знакомства хватит 20–30 шагов: смотрите, растёт ли critic/score/mean.
Чтобы занять все четыре карты, поставьте trainer.n_gpus_per_node=4 — подробности и подводные камни (PCIe без NVLink,
делимость батчей) — в части 3.
Сравните с GRPO из части 2: там нет критика, поэтому меньше памяти и одна фаза обучения вместо двух.
Оригинальная статья (https://arxiv.org/pdf/2110.14168) в основном посвящена обучению верификатора (модели награды),
который решает математические задачи выбором лучшего из N ответов (Best-of-N). В этом примере мы обучаем RL-агента
с наградой по правилам. ↩
Больше примеров скриптов обучения для бэкендов FSDP и Megatron-LM — в папке
examples/ppo_trainer. ↩
Перевод выполнен по лицензии оригинала (Apache-2.0); автор оригинала — ByteDance Seed и сообщество verl (verl-project). Нашли неточность — сверяйтесь с оригиналом по ссылке выше. · обновлено 2026-10-05