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
Ресурсы
- Paper: https://arxiv.org/abs/2405.14734 (NeurIPS 2024)
- GitHub: https://github.com/princeton-nlp/SimPO
- Models: https://huggingface.co/princeton-nlp
- Alignment Handbook: https://github.com/huggingface/alignment-handbook