Simpo Training

Simple Preference Optimization для выравнивания LLM. Не требует референсной модели — в отличие от DPO — и при этом показывает лучшие результаты (+6,4 балла на AlpacaEval 2.0). Подходит, когда нужно выравнивание по предпочтениям, но DPO или PPO кажутся слишком тяжёлыми.

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

ИсточникОпциональный — установить командой hermes skills install official/mlops/simpo
Путьoptional-skills/mlops/simpo
Версия1.0.0
АвторOrchestra Research
ЛицензияMIT
Зависимостиtorch, transformers, datasets, trl, accelerate
Платформыlinux, macos, windows
ТегиPost-Training, SimPO, Preference Optimization, Alignment, DPO Alternative, Reference-Free, LLM Alignment, Efficient Training

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

инфо

Ниже приведено полное определение навыка, которое Hermes Agent загружает при его активации. Именно это видит агент в качестве инструкций, когда навык включён.

SimPO - Simple Preference Optimization

Быстрый старт

SimPO — метод оптимизации по предпочтениям без референсной модели. Превосходит DPO, не требуя при этом референсной модели.

Установка:

# Создать окружение
conda create -n simpo python=3.10 && conda activate simpo

# Установить PyTorch 2.2.2
# Visit: https://pytorch.org/get-started/locally/

# Установить alignment-handbook
git clone https://github.com/huggingface/alignment-handbook.git
cd alignment-handbook
python -m pip install .

# Установить Flash Attention 2
python -m pip install flash-attn --no-build-isolation

Обучение (Mistral 7B):

ACCELERATE_LOG_LEVEL=info accelerate launch \
  --config_file accelerate_configs/deepspeed_zero3.yaml \
  scripts/run_simpo.py \
  training_configs/mistral-7b-base-simpo.yaml

Типовые сценарии

Сценарий 1: Обучение с нуля (Mistral 7B)

Конфиг (mistral-7b-base-simpo.yaml):

# Модель
model_name_or_path: mistralai/Mistral-7B-v0.1
torch_dtype: bfloat16

# Датасет
dataset_mixer:
  HuggingFaceH4/ultrafeedback_binarized: 1.0
dataset_splits:
  - train_prefs
  - test_prefs

# Гиперпараметры SimPO
beta: 2.0                  # Масштабирование наград (2.0–10.0)
gamma_beta_ratio: 0.5       # Целевой отступ (0–1)
loss_type: sigmoid          # sigmoid или hinge
sft_weight: 0.0             # Опциональная SFT-регуляризация

# Обучение
learning_rate: 5e-7         # Критично: от 3e-7 до 1e-6
num_train_epochs: 1
per_device_train_batch_size: 1
gradient_accumulation_steps: 8

# Вывод
output_dir: ./outputs/mistral-7b-simpo

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

accelerate launch --config_file accelerate_configs/deepspeed_zero3.yaml \
  scripts/run_simpo.py training_configs/mistral-7b-base-simpo.yaml

Сценарий 2: Дообучение instruct-модели (Llama 3 8B)

Конфиг (llama3-8b-instruct-simpo.yaml):

model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct

dataset_mixer:
  argilla/ultrafeedback-binarized-preferences-cleaned: 1.0

beta: 2.5
gamma_beta_ratio: 0.5
learning_rate: 5e-7
sft_weight: 0.1             # Добавить SFT-потери для сохранения возможностей модели

num_train_epochs: 1
per_device_train_batch_size: 2
gradient_accumulation_steps: 4
output_dir: ./outputs/llama3-8b-simpo

Запуск:

accelerate launch --config_file accelerate_configs/deepspeed_zero3.yaml \
  scripts/run_simpo.py training_configs/llama3-8b-instruct-simpo.yaml

Сценарий 3: Задачи с интенсивным рассуждением (низкий LR)

Для задач по математике и коду:

model_name_or_path: deepseek-ai/deepseek-math-7b-base

dataset_mixer:
  argilla/distilabel-math-preference-dpo: 1.0

beta: 5.0                   # Выше — для более сильного сигнала
gamma_beta_ratio: 0.7       # Больший отступ
learning_rate: 3e-7         # Меньший LR для задач рассуждения
sft_weight: 0.0

num_train_epochs: 1
per_device_train_batch_size: 1
gradient_accumulation_steps: 16

Когда использовать SimPO и когда — альтернативы

SimPO подходит, если:

  • Нужно обучение проще DPO (без референсной модели)
  • Есть данные с предпочтениями (пары chosen/rejected)
  • Требуется качество выше DPO
  • Вычислительные ресурсы ограничены
  • Достаточно обучения на одном узле

Выбор алгоритма:

  • SimPO: проще всего, лучшее качество, без референсной модели
  • DPO: нужен базовый ориентир с референсной моделью, более консервативный
  • PPO: максимальный контроль, требует reward-модели, сложная настройка
  • GRPO: эффективное по памяти RL, без критика

Когда лучше взять альтернативу:

  • OpenRLHF: распределённое обучение на нескольких узлах, PPO/GRPO
  • TRL: нужны несколько методов в одном фреймворке
  • DPO: устоявшийся базовый ориентир для сравнений

Типичные проблемы

Проблема: расходимость функции потерь

Снизить learning rate:

learning_rate: 3e-7  # Уменьшить с 5e-7

Снизить beta:

beta: 1.0  # Уменьшить с 2.0

Проблема: модель забывает прежние возможности

Добавить SFT-регуляризацию:

sft_weight: 0.1  # Добавить компонент SFT-потерь

Проблема: плохое разделение предпочтений

Увеличить beta и отступ:

beta: 5.0            # Увеличить с 2.0
gamma_beta_ratio: 0.8  # Увеличить с 0.5

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

Уменьшить размер батча:

per_device_train_batch_size: 1
gradient_accumulation_steps: 16  # Сохранить эффективный размер батча

Включить gradient checkpointing:

gradient_checkpointing: true

Дополнительные материалы

Функции потерь: подробнее о sigmoid vs hinge loss, математических формулировках и выборе между ними — в references/loss-functions.md.

Подбор гиперпараметров: руководство по выбору beta, gamma, learning rate и рекомендации по размерам моделей — в references/hyperparameters.md.

Подготовка датасетов: форматы данных с предпочтениями, фильтрация качества и создание собственных датасетов — в references/datasets.md.

Требования к оборудованию

  • GPU: рекомендуются NVIDIA A100/H100
  • VRAM:
    • Модель 7B: 1× A100 40 ГБ (DeepSpeed ZeRO-3)
    • Модель 8B: 2× A100 40 ГБ
    • Модель 70B: 8× A100 80 ГБ
  • Один узел: достаточно DeepSpeed ZeRO-3
  • Смешанная точность: рекомендуется BF16

Оптимизация памяти:

  • DeepSpeed ZeRO-3 (конфиг по умолчанию)
  • Gradient checkpointing
  • Flash Attention 2

Ресурсы

ESC