mcpField
M
model-merging

model-merging

github.com/orchestra-research開発14.1k960 回インストール19 週間前に更新
リポジトリ

model-merging について

mergekit を使った事前学習済みモデルの統合を案内する実践ガイドです。モデル開発者向けに、複数の統合手法や設定、結果の評価方法を説明します。

主な機能

  1. 01重み付き線形統合と SLERP
  2. 02タスク算術、TIES、DARE
  3. 03レイヤー単位・トークナイザー統合
  4. 04YAML による統合設定
  5. 05ベンチマークと係数調整

活用シーン

  1. 01数学とチャット能力の融合
  2. 02複数のタスク特化モデルの統合
  3. 03ラベルなしデータでの重み検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/orchestra-research/ai-research-skills --skill model-merging

インストール後、Claude Code で/model-mergingを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
coefficient-tuning.md
evaluation.md
examples.md
methods.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 の範囲にしてください。
  • 評価を省略する — マージしたモデルは、デプロイ前に必ずベンチマークを実施してください(上記の「評価とテスト」セクションを参照)。

リソース

関連項目

  • references/methods.md - マージアルゴリズムの詳細
  • references/examples.md - 実際のマージ設定例
  • references/evaluation.md - ベンチマークとテストの戦略
  • references/coefficient-tuning.md - 生成の一貫性による教師なし係数探索(AdaMMS、arXiv:2503.23733)

コメント