model-merging について
mergekit を使った事前学習済みモデルの統合を案内する実践ガイドです。モデル開発者向けに、複数の統合手法や設定、結果の評価方法を説明します。
主な機能
- 01重み付き線形統合と SLERP
- 02タスク算術、TIES、DARE
- 03レイヤー単位・トークナイザー統合
- 04YAML による統合設定
- 05ベンチマークと係数調整
活用シーン
- 01数学とチャット能力の融合
- 02複数のタスク特化モデルの統合
- 03ラベルなしデータでの重み検証
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ orchestra-research/ ai-research-skills --skill model-mergingインストール後、Claude Code で/model-mergingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/coefficient-tuning.mdevaluation.mdexamples.mdmethods.md詳細
モデルマージ:事前学習済みモデルの組み合わせ
このスキルを使用する場面
次のような場合は、モデルマージを使用してください。
- 複数のファインチューニング済みモデルの能力を組み合わせる:再トレーニングは不要です
- 特化型モデルを作成する:数学+コーディング+チャットなど、ドメイン固有の専門知識をブレンドします
- パフォーマンスを向上させる:単一のモデルを上回る性能を実現します(ベンチマークで多くの場合+5~10%)
- トレーニングコストを削減する:GPU は不要で、マージは CPU で実行できます
- すばやく実験する:数日ではなく、数分で新しいモデルのバリエーションを作成できます
- 複数のスキルを保持する:壊滅的忘却を起こさずにマージできます
成功事例:Marcoro14-7B-slerp(2024 年 2 月の Open LLM Leaderboard で最高位)、HuggingFace の多数の上位モデルでマージを使用
ツール:mergekit(Arcee AI)、LazyMergekit、Model Soup
インストール
# Install mergekit
git clone https://github.com/arcee-ai/mergekit.git
cd mergekit
pip install -e .
# Or via pip
pip install mergekit
# Optional: Transformer library
pip install transformers torch
クイックスタート
シンプルな線形マージ
# config.yml - Merge two models with equal weights
merge_method: linear
models:
- model: mistralai/Mistral-7B-v0.1
parameters:
weight: 0.5
- model: teknium/OpenHermes-2.5-Mistral-7B
parameters:
weight: 0.5
dtype: bfloat16
# Run merge
mergekit-yaml config.yml ./merged-model --cuda
# Use merged model
python -m transformers.models.auto --model_name_or_path ./merged-model
SLERP マージ(2 つのモデルに最適)
# config.yml - Spherical interpolation
merge_method: slerp
slices:
- sources:
- model: mistralai/Mistral-7B-v0.1
layer_range: [0, 32]
- model: teknium/OpenHermes-2.5-Mistral-7B
layer_range: [0, 32]
parameters:
t: 0.5 # Interpolation factor (0=model1, 1=model2)
dtype: bfloat16
基本概念
1. マージ手法
線形(Model Soup)
- パラメーターの単純な加重平均です
- 高速で、類似したモデルで良好に動作します
- 2 つ以上のモデルをマージできます(
w1 + w2 + ... = 1)
SLERP(球面線形補間)
- 重み空間の球面に沿って補間します
- 重みベクトルの大きさを保持します
- 2 つのモデルのマージに最適です
- 線形補間より滑らかです
# SLERP formula
merged = (sin((1-t)*θ) / sin(θ)) * model1 + (sin(t*θ) / sin(θ)) * model2
# where θ = arccos(dot(model1, model2))
# t ∈ [0, 1]
タスク算術
- 「タスクベクトル」(ファインチューニング済みモデル − ベースモデル)を抽出します
- タスクベクトルを組み合わせて、ベースモデルに加えます
- 複数の特化型モデルのマージに適しています(
merged = base + α₁·tv₁ + α₂·tv₂)
TIES-Merging
- タスク算術とスパース化を組み合わせます
- パラメーターの符号の競合を解決します
- タスク固有のモデルを多数マージする場合に最適です
DARE(Drop And REscale)
- ファインチューニング済みのパラメーターをランダムにドロップします
- 残りのパラメーターを再スケーリングします
- 冗長性を減らしながら、パフォーマンスを維持します
2. 設定の構造
# Basic structure
merge_method: <method> # linear, slerp, ties, dare_ties, task_arithmetic
base_model: <path> # Optional: base model for task arithmetic
models:
- model: <path/to/model1>
parameters:
weight: <float> # Merge weight
density: <float> # For TIES/DARE
- model: <path/to/model2>
parameters:
weight: <float>
parameters:
# Method-specific parameters
dtype: <dtype> # bfloat16, float16, float32
# Optional
slices: # Layer-wise merging
tokenizer: # Tokenizer configuration
マージ手法ガイド
線形マージ
最適な用途:シンプルなモデルの組み合わせ、均等な重み付け
merge_method: linear
models:
- model: WizardLM/WizardMath-7B-V1.1
parameters:
weight: 0.4
- model: teknium/OpenHermes-2.5-Mistral-7B
parameters:
weight: 0.3
- model: NousResearch/Nous-Hermes-2-Mistral-7B-DPO
parameters:
weight: 0.3
dtype: bfloat16
SLERP マージ
最適な用途:2 つのモデル、滑らかな補間
merge_method: slerp
slices:
- sources:
- model: mistralai/Mistral-7B-v0.1
layer_range: [0, 32]
- model: teknium/OpenHermes-2.5-Mistral-7B
layer_range: [0, 32]
parameters:
t: 0.5 # 0.0 = first model, 1.0 = second model
dtype: bfloat16
レイヤー固有の SLERP:
merge_method: slerp
slices:
- sources:
- model: model_a
layer_range: [0, 32]
- model: model_b
layer_range: [0, 32]
parameters:
t:
- filter: self_attn # Attention layers
value: 0.3
- filter: mlp # MLP layers
value: 0.7
- value: 0.5 # Default for other layers
dtype: bfloat16
タスク算術
最適な用途:特化したスキルの組み合わせ
merge_method: task_arithmetic
base_model: mistralai/Mistral-7B-v0.1
models:
- model: WizardLM/WizardMath-7B-V1.1 # Math
parameters:
weight: 0.5
- model: teknium/OpenHermes-2.5-Mistral-7B # Chat
parameters:
weight: 0.3
- model: ajibawa-2023/Code-Mistral-7B # Code
parameters:
weight: 0.2
dtype: bfloat16
TIES-Merging
最適な用途:多数のモデル、競合の解決
merge_method: ties
base_model: mistralai/Mistral-7B-v0.1
models:
- model: WizardLM/WizardMath-7B-V1.1
parameters:
density: 0.5 # Keep top 50% of parameters
weight: 1.0
- model: teknium/OpenHermes-2.5-Mistral-7B
parameters:
density: 0.5
weight: 1.0
- model: NousResearch/Nous-Hermes-2-Mistral-7B-DPO
parameters:
density: 0.5
weight: 1.0
parameters:
normalize: true
dtype: bfloat16
DARE マージ
最適な用途:冗長性の削減
merge_method: dare_ties
base_model: mistralai/Mistral-7B-v0.1
models:
- model: WizardLM/WizardMath-7B-V1.1
parameters:
density: 0.5 # Drop 50% of deltas
weight: 0.6
- model: teknium/OpenHermes-2.5-Mistral-7B
parameters:
density: 0.5
weight: 0.4
parameters:
int8_mask: true # Use int8 for masks (saves memory)
dtype: bfloat16
高度なパターン
レイヤー単位のマージ
# Different models for different layers
merge_method: passthrough
slices:
- sources:
- model: mistralai/Mistral-7B-v0.1
layer_range: [0, 16] # First half
- sources:
- model: teknium/OpenHermes-2.5-Mistral-7B
layer_range: [16, 32] # Second half
dtype: bfloat16
マージ済みモデルから MoE を作成
# Create Mixture of Experts
merge_method: moe
base_model: mistralai/Mistral-7B-v0.1
experts:
- source_model: WizardLM/WizardMath-7B-V1.1
positive_prompts:
- "math"
- "calculate"
- source_model: teknium/OpenHermes-2.5-Mistral-7B
positive_prompts:
- "chat"
- "conversation"
- source_model: ajibawa-2023/Code-Mistral-7B
positive_prompts:
- "code"
- "python"
dtype: bfloat16
トークナイザーのマージ
merge_method: linear
models:
- model: mistralai/Mistral-7B-v0.1
- model: custom/specialized-model
tokenizer:
source: "union" # Combine vocabularies from both models
tokens:
<|special_token|>:
source: "custom/specialized-model"
ベストプラクティス
1. モデルの互換性
# ✅ Good: Same architecture
models = [
"mistralai/Mistral-7B-v0.1",
"teknium/OpenHermes-2.5-Mistral-7B", # Both Mistral 7B
]
# ❌ Bad: Different architectures
models = [
"meta-llama/Llama-2-7b-hf", # Llama
"mistralai/Mistral-7B-v0.1", # Mistral (incompatible!)
]
2. 重みの選択
# ✅ Good: Weights sum to 1.0
models:
- model: model_a
parameters:
weight: 0.6
- model: model_b
parameters:
weight: 0.4 # 0.6 + 0.4 = 1.0
# ⚠️ Acceptable: Weights don't sum to 1 (for task arithmetic)
models:
- model: model_a
parameters:
weight: 0.8
- model: model_b
parameters:
weight: 0.8 # May boost performance
教師なし係数の調整(ラベル付きデータは不要)
手動で探索する代わりに、生成の一貫性を利用します。候補となる複数の係数でマージし、ラベルのない小規模なサブセットに対して応答を生成して、隣接する係数の出力と最も類似する係数を選びます。一貫した出力は、安定性と性能に優れたマージ領域を示します(AdaMMS、arXiv:2503.23733)。
# Pseudocode — see references/coefficient-tuning.md for full implementation
candidates = [0.3, 0.4, 0.5, 0.6, 0.7]
for alpha in candidates:
merged_paths[alpha] = merge_with_coefficient(alpha, model_a, model_b)
responses[alpha] = generate_responses(merged_paths[alpha], eval_prompts)
# Score each alpha by similarity to its neighbors (alpha ± 0.1)
best_alpha = max(candidates, key=lambda a: generation_consistency(a, responses))
アルゴリズム、類似度指標、複数係数の探索、エンドツーエンドのパイプラインについて詳しくは、references/coefficient-tuning.md を参照してください。
3. 手法の選択
# Choose merge method based on use case:
# 2 models, smooth blend → SLERP
merge_method = "slerp"
# 3+ models, simple average → Linear
merge_method = "linear"
# Multiple task-specific models → Task Arithmetic or TIES
merge_method = "ties"
# Want to reduce redundancy → DARE
merge_method = "dare_ties"
4. 密度の調整(TIES/DARE)
# Start conservative (keep more parameters)
parameters:
density: 0.8 # Keep 80%
# If performance good, increase sparsity
parameters:
density: 0.5 # Keep 50%
# If performance degrades, reduce sparsity
parameters:
density: 0.9 # Keep 90%
5. レイヤー固有のマージ
ベースモデルの最初と最後のレイヤーは保持し(多くの場合、そのままにしておくのが最適です)、merge_method: passthrough と slices を使用して中間部分のみをマージします。上記のレイヤー単位のマージパターンを参照してください。
評価とテスト
マージ済みモデルのベンチマーク
from transformers import AutoModelForCausalLM, AutoTokenizer
# Load merged model
model = AutoModelForCausalLM.from_pretrained("./merged-model")
tokenizer = AutoTokenizer.from_pretrained("./merged-model")
# Test on various tasks
test_prompts = {
"math": "Calculate: 25 * 17 =",
"code": "Write a Python function to reverse a string:",
"chat": "What is the capital of France?",
}
for task, prompt in test_prompts.items():
inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**inputs, max_length=100)
print(f"{task}: {tokenizer.decode(outputs[0])}")
一般的なベンチマーク
- Open LLM Leaderboard:汎用的な能力
- MT-Bench:複数ターンの会話
- MMLU:マルチタスクの正確性
- HumanEval:コード生成
- GSM8K:数学的推論
本番環境へのデプロイ
保存とアップロード
from transformers import AutoModelForCausalLM, AutoTokenizer
# Load merged model
model = AutoModelForCausalLM.from_pretrained("./merged-model")
tokenizer = AutoTokenizer.from_pretrained("./merged-model")
# Upload to HuggingFace Hub
model.push_to_hub("username/my-merged-model")
tokenizer.push_to_hub("username/my-merged-model")
マージ済みモデルの量子化
# Quantize with GGUF
python convert.py ./merged-model --outtype f16 --outfile merged-model.gguf
# Quantize with GPTQ
python quantize_gptq.py ./merged-model --bits 4 --group_size 128
よくある落とし穴
- アーキテクチャの不一致 — 同じアーキテクチャを共有するモデルのみをマージしてください(例:Llama と Mistral を混在させないでください)。
- 特定のモデルへの過剰な重み付け(例:
0.95 / 0.05)— 重みのバランスを保ち、通常は 0.3〜0.7 の範囲にしてください。 - 評価を省略する — マージしたモデルは、デプロイ前に必ずベンチマークを実施してください(上記の「評価とテスト」セクションを参照)。
リソース
- mergekit GitHub:https://github.com/arcee-ai/mergekit
- HuggingFace のチュートリアル:https://huggingface.co/blog/mlabonne/merge-models
- LazyMergekit:自動マージ用ノートブック
- TIES の論文:https://arxiv.org/abs/2306.01708
- DARE の論文:https://arxiv.org/abs/2311.03099
関連項目
references/methods.md- マージアルゴリズムの詳細references/examples.md- 実際のマージ設定例references/evaluation.md- ベンチマークとテストの戦略references/coefficient-tuning.md- 生成の一貫性による教師なし係数探索(AdaMMS、arXiv:2503.23733)