simpo-training について
SimPOは、参照モデルを必要としない選好最適化の学習方法で、ペア形式の選好データを使って言語モデルを調整する研究者やエンジニア向けです。このスキルは、モデル調整、推論タスク、一般的な問題への学習設定と手順を示します。
主な機能
- 01参照モデル不要の選好最適化
- 02chosen/rejectedの選好ペアを使用
- 03設定ファイルによる学習実行
- 04SFT正則化オプション
- 05勾配チェックポイントなどの省メモリ機能
活用シーン
- 01選好データでベースモデルを調整
- 02指示モデルに選好学習を実施
- 03数学やコーディングタスク向けに学習設定
- 04勾配累積でメモリ不足を緩和
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ kalarislabs/ research-agent-skills --skill simpo-trainingインストール後、Claude Code で/simpo-trainingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/datasets.mdhyperparameters.mdloss-functions.md詳細
SimPO - シンプルな選好最適化
クイックスタート
SimPOは、参照モデルを必要とせずにDPOを上回る、参照モデル不要の選好最適化手法です。
インストール:
# Create environment
conda create -n simpo python=3.10 && conda activate simpo
# Install PyTorch 2.2.2
# Visit: https://pytorch.org/get-started/locally/
# Install alignment-handbook
git clone https://github.com/huggingface/alignment-handbook.git
cd alignment-handbook
python -m pip install .
# 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
model_name_or_path: mistralai/Mistral-7B-v0.1
torch_dtype: bfloat16
# Dataset
dataset_mixer:
HuggingFaceH4/ultrafeedback_binarized: 1.0
dataset_splits:
- train_prefs
- test_prefs
# SimPO hyperparameters
beta: 2.0 # Reward scaling (2.0-10.0)
gamma_beta_ratio: 0.5 # Target margin (0-1)
loss_type: sigmoid # sigmoid or hinge
sft_weight: 0.0 # Optional SFT regularization
# Training
learning_rate: 5e-7 # Critical: 3e-7 to 1e-6
num_train_epochs: 1
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
# Output
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:指示チューニング済みモデルをファインチューニングする(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 # Add SFT loss to preserve capabilities
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 # Higher for stronger signal
gamma_beta_ratio: 0.7 # Larger margin
learning_rate: 3e-7 # Lower LR for reasoning
sft_weight: 0.0
num_train_epochs: 1
per_device_train_batch_size: 1
gradient_accumulation_steps: 16
代替手法と比べた選び方
SimPOを使う場合:
- DPOよりシンプルなトレーニングが必要(参照モデル不要)
- 選好データ(選択/拒否のペア)がある
- DPOを上回る性能が必要
- 計算リソースが限られている
- 単一ノードでのトレーニングで十分
アルゴリズムの選択:
- SimPO:最もシンプルで最高の性能、参照モデル不要
- DPO:参照モデルをベースラインとして必要とし、より保守的
- PPO:最大限の制御が可能。報酬モデルが必要で、設定が複雑
- GRPO:メモリ効率に優れたRL、クリティック不要
代わりに別の手法を使う場合:
- OpenRLHF:マルチノード分散トレーニング、PPO/GRPO
- TRL:1つのフレームワーク内で複数の手法が必要
- DPO:確立されたベースラインとの比較
よくある問題
問題:損失が発散する
学習率を下げます:
learning_rate: 3e-7 # Reduce from 5e-7
betaを下げます:
beta: 1.0 # Reduce from 2.0
問題:モデルが能力を忘れる
SFT正則化を追加します:
sft_weight: 0.1 # Add SFT loss component
問題:選好の分離が不十分
betaとマージンを大きくします:
beta: 5.0 # Increase from 2.0
gamma_beta_ratio: 0.8 # Increase from 0.5
問題:トレーニング中にOOMが発生する
バッチサイズを小さくします:
per_device_train_batch_size: 1
gradient_accumulation_steps: 16 # Maintain effective batch
勾配チェックポイントを有効にします:
gradient_checkpointing: true
高度なトピック
損失関数:シグモイド損失とヒンジ損失、数式、およびそれぞれの使いどころについては、references/loss-functions.mdを参照してください。
ハイパーパラメーターの調整:beta、gamma、学習率の選択ガイド、およびモデルサイズごとの推奨設定については、references/hyperparameters.mdを参照してください。
データセットの準備:選好データの形式、品質フィルタリング、カスタムデータセットの作成については、references/datasets.mdを参照してください。
ハードウェア要件
- GPU:NVIDIA A100/H100を推奨
- VRAM:
- 7Bモデル:A100 40GB × 1(DeepSpeed ZeRO-3)
- 8Bモデル:A100 40GB × 2
- 70Bモデル:A100 80GB × 8
- 単一ノード:DeepSpeed ZeRO-3で十分
- 混合精度:BF16を推奨
メモリの最適化:
- DeepSpeed ZeRO-3(デフォルト設定)
- 勾配チェックポイント
- Flash Attention 2
リソース
- 論文:https://arxiv.org/abs/2405.14734(NeurIPS 2024)
- GitHub:https://github.com/princeton-nlp/SimPO
- モデル:https://huggingface.co/princeton-nlp
- Alignment Handbook:https://github.com/huggingface/alignment-handbook
エージェントの作業手順
- 環境を確認します。 GPU の種類、メモリ、ドライバー/CUDA のバージョン(
nvidia-smi)、フレームワークのバージョン、データセットの場所とサイズを確認します。 - 入力を明確にします。 データまたはユーザーに確認し、形式、識別子、パラメーターを特定します。結果が変わる値については、推測せずに質問します。
- まず小規模なバージョンを実行します。 スモークテストとして、小さなモデルまたはサブセットで少ないステップ数を実行し、損失が減少することとチェックポイントが保存されることを確認します。
- 上記の手順と参考情報を使用して、タスク全体を実行します。
- 結果を検証します。 保留データでメトリクスを追跡し、ベースラインと比較して、シード、設定、ハードウェアを記録します。
- 報告します。 実行内容(バージョン、コマンド、パラメーター)、確認した内容、未解決の不確実な点を明記します。
| 発生した場合 | 対応 |
|---|---|
| CUDA のメモリ不足 | バッチサイズを小さくする、勾配累積/チェックポイント作成または混合精度を有効にする、あるいはモデルをシャーディングします。 |
| 損失が NaN になる、または発散する | 学習率を下げ、データに無効な値がないか確認し、勾配クリッピングを有効にします。 |
| この手順に記載されている関数、フラグ、エンドポイントがインストール済みバージョンにない | インストール済みバージョンのドキュメント(help()、--help、公式ドキュメント)を確認し、適宜対応してユーザーに伝えます。API を捏造してはいけません。 |
| 必須の入力、識別子、パラメーターが曖昧 | ユーザーに質問するか、実行前に仮定を明示します。 |
誠実さに関するルール
- 結果、パラメーター、識別子、引用、統計を捏造してはいけません。実行または検証できないことは、率直に伝えます。
- ログがない状態で学習結果を主張してはいけません。大規模なジョブを開始する前に、計算コストを見積もります。
- ここに記載されているバージョン固有の情報は古くなっている可能性があるものとして扱い、インストール済みバージョンの公式ドキュメントで確認します。
- 金銭がかかる、共有 GPU やクラウドクォータを消費する、個人データまたは患者データを扱う、あるいは取り消せない操作を行う前に、ユーザーに確認します。
関連スキル
fine-tuning-with-trl:TRL を使用した強化学習による LLM のファインチューニング。指示チューニング用の SFT、選好アライメント用の DPO、報酬最適化用の PPO/GRPO…openrlhf-training:Ray と vLLM による高速化を備えた高性能 RLHF フレームワーク。axolotl:Axolotl を使用した大規模言語モデルのファインチューニングに関するガイダンスを提供します。YAML の学習設定、LoRA と QLoRA、選好学習 w…