Перейти к основному содержимому

Slime RL Training

Предоставляет руководство по пост-тренировке LLM с подкреплением (RL) с использованием slime, фреймворка на основе Megatron+SGLang. Используйте при обучении моделей GLM, реализации пользовательских рабочих процессов генерации данных или при необходимости тесной интеграции с Megatron-LM для масштабирования RL.

Метаданные навыка​

ИсточникОпционально — установка через vibeos 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
Платформыlinux, macos
ТегиReinforcement Learning, Megatron-LM, SGLang, GRPO, Post-Training, GLM

Справочник: полный SKILL.md​

к сведению

Ниже приведено полное определение навыка, которое VibeOS загружает при его активации. Это инструкции, которые видит агент, когда навык активен.

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

Обзор архитектуры​

┌─────────────────────────────────────────────────────────┐
│ Буфер данных │
│ - Инициализация и управление промптами │
│ - Пользовательская генерация и фильтрация данных │
│ - Хранение сэмплов прогонов │
└─────────────┬───────────────────────────┬───────────────┘
│ │
┌─────────────▼───────────┐ ┌─────────────▼───────────────┐
│ Обучение (Megatron-LM) │ │ Прогон (SGLang + Router) │
│ - Обучение модели-актора│ │ - Генерация ответов │
│ - Критик (опционально) │ │ - Вывод награды/верификатора│
│ - Синхронизация весов │ │ - Поддержка нескольких │
│ с прогоном │ │ витков (multi-turn) │
└─────────────────────────┘ └─────────────────────────────┘

Установка​

# Рекомендуется: 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

Из исходного кода​

git clone https://github.com/THUDM/slime.git
cd slime
pip install -r requirements.txt
pip install -e .

Быстрый старт: обучение GRPO​

# Конфигурация исходной модели
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[@]}

Рабочий процесс 1: Стандартное обучение GRPO​

Используйте этот рабочий процесс для обучения моделей рассуждений с групповыми относительными преимуществами.

Контрольный список предварительных требований​

  • Окружение Docker или установленные Megatron-LM + SGLang
  • Контрольная точка модели (формат HuggingFace или Megatron)
  • Обучающие данные в формате JSONL

Шаг 1: Подготовка данных​

# Формат data.jsonl
{"prompt": "Сколько будет 2 + 2?", "label": "4"}
{"prompt": "Решите: 3x = 12", "label": "x = 4"}

Или в чат-формате:

{
"prompt": [
{"role": "system", "content": "Вы — репетитор по математике."},
{"role": "user", "content": "Сколько будет 15 + 27?"}
],
"label": "42"
}

Шаг 2: Настройка модели​

Выберите предварительно настроенный скрипт модели:

# Список доступных моделей
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

Шаг 3: Запуск обучения​

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[@]}

Шаг 4: Мониторинг обучения​

  • Проверьте TensorBoard: tensorboard --logdir outputs/
  • Убедитесь, что кривые награды растут
  • Отслеживайте загрузку GPU на всех узлах

Рабочий процесс 2: Асинхронное обучение​

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

Когда использовать асинхронный режим​

  • Большие модели с длительным временем генерации
  • Высокое время простоя GPU в синхронном режиме
  • Достаточный объем памяти для буферизации

Запуск асинхронного обучения​

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[@]}

Специфические параметры асинхронного режима​

--async-buffer-size 4        # Количество прогонов для буферизации
--update-weights-interval 2 # Синхронизация весов каждые N прогонов

Рабочий процесс 3: Многовитковое агентное обучение​

Используйте этот рабочий процесс для обучения агентов с использованием инструментов или многошаговых рассуждений.

Предварительные требования​

  • Пользовательская функция генерации для многовитковой логики
  • Интерфейс инструмента/окружения

Шаг 1: Определение пользовательской функции генерации​

# 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

Шаг 2: Запуск с пользовательской функцией​

python train.py \
--custom-generate-function-path custom_generate.py \
--max-turns 5 \
--prompt-data /path/to/agent_data.jsonl \
${MODEL_ARGS[@]}

Полный пример многовиткового поиска см. в examples/search-r1/.


Справочник по конфигурации​

Три категории аргументов​

slime использует три типа аргументов:

1. Аргументы Megatron (передаются напрямую):

--tensor-model-parallel-size 2
--pipeline-model-parallel-size 1
--num-layers 32
--hidden-size 4096

2. Аргументы SGLang (с префиксом --sglang-):

--sglang-mem-fraction-static 0.8
--sglang-context-length 8192
--sglang-log-level INFO

3. Аргументы slime:

# Выделение ресурсов
--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

Ключевые ограничения​

rollout_batch_size × n_samples_per_prompt = global_batch_size × num_steps_per_rollout

Пример: 32 × 8 = 256 × 1


Система буфера данных​

Буфер данных slime обеспечивает гибкое управление данными:

Базовый источник данных​

class RolloutDataSource:
def get_samples(self, num_samples):
"""Получение промптов из набора данных."""
return self.dataset.sample(num_samples)

def add_samples(self, samples):
"""Вызывается после генерации (по умолчанию ничего не делает)."""
pass

Буферизованный источник данных (Off-Policy)​

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)

Часто встречающиеся проблемы и их решения​

Проблема: Сбой движка SGLang​

Симптомы: Движок инференса падает в середине обучения

Решения:

# Включение отказоустойчивости
--use-fault-tolerance

# Увеличение выделения памяти
--sglang-mem-fraction-static 0.85

# Уменьшение размера пакета
--rollout-batch-size 16

Проблема: Тайм-аут синхронизации весов​

Симптомы: Обучение зависает после прогона

Решения:

# Увеличение интервала синхронизации
--update-weights-interval 5

# Использование совмещенного режима (без сетевой передачи)
--colocate

Проблема: OOM во время обучения​

Симптомы: CUDA OOM при обратном проходе

Решения:

# Включение градиентной контрольной точки
--recompute-activations

# Уменьшение размера микро-пакета
--micro-batch-size 1

# Включение последовательного параллелизма
--sequence-parallel

Проблема: Медленная загрузка данных​

Симптомы: GPU простаивает во время выборки данных

Решения:

# Увеличение количества рабочих процессов для данных
--num-data-workers 4

# Использование потокового набора данных
--streaming-data

Поддерживаемые модели​

Семейство моделейКонфигурации
GLMGLM-4.5, GLM-4.6, GLM-4.7, GLM-Z1-9B
QwenQwen3 (4B, 8B, 30B-A3B), Qwen3-MoE, Qwen2.5
DeepSeekV3, V3.1, R1
LlamaLlama 3 (8B, 70B)
ДругиеKimi K2, Moonlight-16B

Для каждой модели есть предварительно настроенные скрипты в scripts/models/.


Продвинутые темы​

Режим совместного размещения (Co-location)​

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

python train.py \
--colocate \
--actor-num-gpus-per-node 8 \
--sglang-mem-fraction-static 0.4 \
${MODEL_ARGS[@]}

Пользовательская модель награды​

# 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()
--custom-rm-path custom_rm.py

Многозадачная оценка​

--eval-prompt-data aime /path/to/aime.jsonl \
--eval-prompt-data gsm8k /path/to/gsm8k.jsonl \
--n-samples-per-eval-prompt 16

Ресурсы​