На этой странице Содержит руководство по пост-тренировке LLM с RL с использованием slime — фреймворка на базе Megatron+SGLang. Используйте при обучении моделей GLM, реализации собственных рабочих процессов генерации данных или при необходимости тесной интеграции с Megatron-LM для масштабирования RL.
Метаданные навыка¶
| |
|---|---|
|Источник| Опционально — установка: hermes skills install official/mlops/slime |
|Путь| optional-skills/mlops/slime |
|Версия| 1.0.0 |
|Автор| Orchestra Research |
|Лицензия| MIT |
|Зависимости| sglang-router>=0.2.3, ray, torch>=2.0.0, transformers>=4.40.0 |
|Теги| Reinforcement Learning, Megatron-LM, SGLang, GRPO, Post-Training, GLM |
Справочник: полный SKILL.md¶
info Далее приведено полное определение навыка, которое Hermes загружает при его активации. Это инструкции, которые агент видит, когда навык активен.
slime: Фреймворк пост-тренировки LLM для масштабирования RL¶
slime — это фреймворк пост-тренировки LLM от команды THUDM из Университета Цинхуа, на базе которого работают GLM-4.5, GLM-4.6 и GLM-4.7. Он объединяет Megatron-LM для обучения и SGLang для высокопроизводительной генерации прогонов (rollout).
Когда использовать slime¶
Выбирайте slime, когда вам нужно: * Нативное обучение Megatron-LM с инференсом SGLang * Собственные рабочие процессы генерации данных с гибкими буферами данных * Обучение моделей GLM, Qwen3, DeepSeek V3 или Llama 3 * Исследовательский фреймворк с производственной поддержкой (Z.ai)
Рассмотрите альтернативы, когда: * Вам нужны функции корпоративной стабильности → используйте miles * Вы хотите гибкую смену бэкенда → используйте verl * Вам нужны абстракции, родные для PyTorch → используйте torchforge
Ключевые особенности¶
- Обучение: Megatron-LM с полной поддержкой параллелизма (TP, PP, DP, SP)
- Прогон (Rollout): Высокопроизводительная генерация на SGLang с маршрутизатором
- Буфер данных: Гибкое управление промптами и хранение семплов
- Модели: GLM-4.x, Qwen3, DeepSeek V3/R1, Llama 3
Обзор архитектуры¶
[code]
┌─────────────────────────────────────────────────────────┐
│ Буфер данных (Data Buffer) │
│ - Инициализация и управление промптами │
│ - Пользовательская генерация и фильтрация данных │
│ - Хранение семплов прогонов (rollout) │
└─────────────┬───────────────────────────┬───────────────┘
│ │
┌─────────────▼───────────┐ ┌─────────────▼───────────────┐
│ Обучение (Megatron-LM) │ │ Прогон (SGLang + Router) │
│ - Обучение модели-актора│ │ - Генерация ответов │
│ - Критик (опционально) │ │ - Вывод награды/верификатора│
│ - Синхронизация весов │ │ - Поддержка нескольких ходов│
└─────────────────────────┘ └─────────────────────────────┘
[/code]
Установка¶
[code]
# Рекомендуется: Docker
docker pull slimerl/slime:latest
docker run --rm --gpus all --ipc=host --shm-size=16g \
-it slimerl/slime:latest /bin/bash
# Внутри контейнера
cd /root/slime && pip install -e . --no-deps
[/code]
Из исходников¶
[code]
git clone https://github.com/THUDM/slime.git
cd slime
pip install -r requirements.txt
pip install -e .
[/code]
Быстрый старт: GRPO обучение¶
[code]
# Конфигурация исходной модели
source scripts/models/qwen3-4B.sh
# Запуск обучения
python train.py \
--actor-num-nodes 1 \
--actor-num-gpus-per-node 4 \
--rollout-num-gpus 4 \
--advantage-estimator grpo \
--use-kl-loss --kl-loss-coef 0.001 \
--rollout-batch-size 32 \
--n-samples-per-prompt 8 \
--global-batch-size 256 \
--num-rollout 3000 \
--prompt-data /path/to/data.jsonl \
${MODEL_ARGS[@]} ${CKPT_ARGS[@]}
[/code]
Рабочий процесс 1: Стандартное GRPO обучение¶
Используйте этот рабочий процесс для обучения моделей рассуждения с групповыми относительными преимуществами.
Контрольный список предварительных требований¶
- Docker-среда или установленные Megatron-LM + SGLang
- Контрольная точка модели (формат HuggingFace или Megatron)
- Обучающие данные в формате JSONL
Шаг 1: Подготовка данных¶
[code]
# Формат data.jsonl
{"prompt": "What is 2 + 2?", "label": "4"}
[/code]
Или в чат-формате:
[code]
{
"prompt": [
{"role": "system", "content": "You are a math tutor."},
{"role": "user", "content": "What is 15 + 27?"}
],
"label": "42"
}
[/code]
Шаг 2: Настройка модели¶
Выберите предварительно настроенный скрипт модели:
[code]
# Список доступных моделей
ls scripts/models/
# glm4-9B.sh, qwen3-4B.sh, qwen3-30B-A3B.sh, deepseek-v3.sh, llama3-8B.sh, ...
# Загрузите вашу модель
source scripts/models/qwen3-4B.sh
[/code]
Шаг 3: Запуск обучения¶
[code]
python train.py \
--actor-num-nodes 1 \
--actor-num-gpus-per-node 8 \
--rollout-num-gpus 8 \
--advantage-estimator grpo \
--use-kl-loss \
--kl-loss-coef 0.001 \
--prompt-data /path/to/train.jsonl \
--input-key prompt \
--label-key label \
--apply-chat-template \
--rollout-batch-size 32 \
--n-samples-per-prompt 8 \
--global-batch-size 256 \
--num-rollout 3000 \
--save-interval 100 \
--eval-interval 50 \
${MODEL_ARGS[@]}
[/code]
Шаг 4: Мониторинг обучения¶
- Проверьте TensorBoard:
tensorboard --logdir outputs/ - Убедитесь, что кривые наград растут
- Мониторьте использование GPU на всех узлах
Рабочий процесс 2: Асинхронное обучение¶
Используйте асинхронный режим для более высокой пропускной способности за счёт перекрытия прогонов и обучения.
Когда использовать асинхронный режим¶
- Крупные модели с длительным временем генерации
- Высокий простой GPU в синхронном режиме
- Достаточный объём памяти для буферизации
Запуск асинхронного обучения¶
[code]
python train_async.py \
--actor-num-nodes 1 \
--actor-num-gpus-per-node 8 \
--rollout-num-gpus 8 \
--advantage-estimator grpo \
--async-buffer-size 4 \
--prompt-data /path/to/train.jsonl \
${MODEL_ARGS[@]}
[/code]
Специфичные параметры асинхронного режима¶
[code]
--async-buffer-size 4 # Количество буферизируемых прогонов
--update-weights-interval 2 # Частота синхронизации весов (каждые N прогонов)
[/code]
Рабочий процесс 3: Многоходовое агентное обучение¶
Используйте этот рабочий процесс для обучения агентов с использованием инструментов или многошаговых рассуждений.
Предварительные требования¶
- Пользовательская функция генерации для многоходовой логики
- Интерфейс инструментов/окружения
Шаг 1: Определение пользовательской функции генерации¶
[code]
# custom_generate.py
async def custom_generate(args, samples, evaluation=False):
"""Многоходовая генерация с вызовом инструментов."""
for sample in samples:
conversation = sample.prompt
for turn in range(args.max_turns):
# Генерация ответа
response = await generate_single(conversation)
# Проверка на вызов инструмента
tool_call = extract_tool_call(response)
if tool_call:
tool_result = execute_tool(tool_call)
conversation.append({"role": "assistant", "content": response})
conversation.append({"role": "tool", "content": tool_result})
else:
break
sample.response = response
sample.reward = compute_reward(sample)
return samples
[/code]
Шаг 2: Запуск с пользовательской функцией¶
[code]
python train.py \
--custom-generate-function-path custom_generate.py \
--max-turns 5 \
--prompt-data /path/to/agent_data.jsonl \
${MODEL_ARGS[@]}
[/code]
Смотрите examples/search-r1/ для полного примера многоходового поиска.
Справочник по конфигурации¶
Три категории аргументов¶
slime использует три типа аргументов:
1\. Аргументы Megatron (передаются напрямую):
[code]
--tensor-model-parallel-size 2
--pipeline-model-parallel-size 1
--num-layers 32
--hidden-size 4096
[/code]
2\. Аргументы SGLang (с префиксом --sglang-):
[code]
--sglang-mem-fraction-static 0.8
--sglang-context-length 8192
--sglang-log-level INFO
[/code]
3\. Аргументы slime:
[code]
# Выделение ресурсов
--actor-num-nodes 1
--actor-num-gpus-per-node 8
--rollout-num-gpus 8
--colocate # Совместное использование GPU между обучением/инференсом
# Данные
--prompt-data /path/to/data.jsonl
--input-key prompt
--label-key label
# Цикл обучения
--num-rollout 3000
--rollout-batch-size 32
--n-samples-per-prompt 8
--global-batch-size 256
# Алгоритм
--advantage-estimator grpo # или: gspo, ppo, reinforce_plus_plus
--use-kl-loss
--kl-loss-coef 0.001
[/code]
Ключевые ограничения¶
[code] rollout_batch_size × n_samples_per_prompt = global_batch_size × num_steps_per_rollout
[/code] Пример: 32 × 8 = 256 × 1
Система буфера данных¶
Буфер данных slime обеспечивает гибкое управление данными:
Базовый источник данных¶
[code]
class RolloutDataSource:
def get_samples(self, num_samples):
"""Получить промпты из набора данных."""
return self.dataset.sample(num_samples)
def add_samples(self, samples):
"""Вызывается после генерации (по умолчанию ничего не делает)."""
pass
[/code]
Буферизированный источник данных (Off-Policy)¶
[code]
class RolloutDataSourceWithBuffer(RolloutDataSource):
def init(self):
self.buffer = []
def add_samples(self, samples):
"""Сохранить сгенерированные семплы для повторного использования."""
self.buffer.extend(samples)
def buffer_filter(self, args, buffer, num_samples):
"""Пользовательская логика выбора (приоритетная, стратифицированная и т.д.)."""
return select_best(buffer, num_samples)
[/code]
Частые проблемы и решения¶
Проблема: Сбой SGLang Engine¶
Симптомы: Движок инференса падает во время обучения
Решения:
[code]
# Включить отказоустойчивость
--use-fault-tolerance
# Увеличить выделение памяти
--sglang-mem-fraction-static 0.85
# Уменьшить размер батча
--rollout-batch-size 16
[/code]
Проблема: Тайм-аут синхронизации весов¶
Симптомы: Обучение зависает после прогона
Решения:
[code]
# Увеличить интервал синхронизации
--update-weights-interval 5
# Использовать режим совместного размещения (без сетевой передачи)
--colocate
[/code]
Проблема: OOM во время обучения¶
Симптомы: CUDA OOM при обратном проходе
Решения:
[code]
# Включить градиентную контрольную точку
--recompute-activations
# Уменьшить размер микро-батча
--micro-batch-size 1
# Включить последовательный параллелизм
--sequence-parallel
[/code]
Проблема: Медленная загрузка данных¶
Симптомы: GPU простаивает во время выборки данных
Решения:
[code]
# Увеличить количество рабочих процессов данных
--num-data-workers 4
# Использовать потоковый набор данных
--streaming-data
[/code]
Поддерживаемые модели¶
| Семейство моделей | Конфигурации |
|---|---|
| GLM | GLM-4.5, GLM-4.6, GLM-4.7, GLM-Z1-9B |
| Qwen | Qwen3 (4B, 8B, 30B-A3B), Qwen3-MoE, Qwen2.5 |
| DeepSeek | V3, V3.1, R1 |
| Llama | Llama 3 (8B, 70B) |
| Другие | Kimi K2, Moonlight-16B |
Для каждой модели есть предварительно настроенные скрипты в scripts/models/. |
|
| * * * | |
| ## Продвинутые темы | |
| ### Режим совместного размещения (Co-location) | |
| Совместное использование GPU между обучением и инференсом для уменьшения потребления памяти: | |
| [code] | |
| python train.py \ | |
| --colocate \ | |
| --actor-num-gpus-per-node 8 \ | |
| --sglang-mem-fraction-static 0.4 \ | |
| ${MODEL_ARGS[@]} |
[/code]
Пользовательская модель награды¶
[code]
# custom_rm.py
class CustomRewardModel:
def init(self, model_path):
self.model = load_model(model_path)
def compute_reward(self, prompts, responses):
inputs = self.tokenize(prompts, responses)
scores = self.model(inputs)
return scores.tolist()
[/code] [code] --custom-rm-path custom_rm.py
[/code]
Оценка нескольких задач¶
[code]
--eval-prompt-data aime /path/to/aime.jsonl \
--eval-prompt-data gsm8k /path/to/gsm8k.jsonl \
--n-samples-per-eval-prompt 16
[/code]
Ресурсы¶
- Документация: https://thudm.github.io/slime/
- GitHub: https://github.com/THUDM/slime
- Блог: https://lmsys.org/blog/2025-07-09-slime/
-
Примеры: Смотрите директорию
examples/— 14+ готовых примеров - Справочник: полный SKILL.md
- Когда использовать slime
- Ключевые особенности
- Обзор архитектуры
- Установка
- Быстрый старт: GRPO обучение
- Рабочий процесс 1: Стандартное GRPO обучение
- Рабочий процесс 2: Асинхронное обучение
- Рабочий процесс 3: Многоходовое агентное обучение
- Справочник по конфигурации
- Система буфера данных
- Частые проблемы и решения
- Поддерживаемые модели
- Продвинутые темы
- Ресурсы