mcpField
M
model-merging

model-merging

github.com/ovachiever開発5645 回インストール48 週間前に更新
リポジトリ

model-merging について

互換性のある事前学習済みファインチューニングモデルを再学習なしで組み合わせる、モデル開発者向けスキルです。mergekit の手法、設定、評価、デプロイの手順を説明します。

主な機能

  1. 01Linear と SLERP によるマージ
  2. 02Task arithmetic、TIES、DARE
  3. 03レイヤー単位のモデルマージ
  4. 04Tokenizer のマージ
  5. 05マージモデルのベンチマーク

活用シーン

  1. 01数学とチャットの能力を組み合わせる
  2. 02再学習なしでモデル変種を作成する
  3. 03デプロイ前にマージモデルを評価する

インストール

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

$npx skills add https://github.com/ovachiever/droid-tings --skill model-merging

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

同梱ファイル

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

references/
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 つ以上のモデルをマージできます
merged_weights = w1 * model1_weights + w2 * model2_weights + w3 * model3_weights
# where w1 + w2 + w3 = 1

SLERP(球面線形補間)

  • 重み空間上の球面に沿って補間します
  • 重みベクトルの大きさを保持します
  • 2 つのモデルのマージに最適です
  • 線形補間よりも滑らかです
# SLERP formula
merged = (sin((1-t)*θ) / sin(θ)) * model1 + (sin(t*θ) / sin(θ)) * model2
# where θ = arccos(dot(model1, model2))
# t ∈ [0, 1]

Task Arithmetic(タスクアリスメティック)

  • 「タスクベクトル」(ファインチューニング済み − ベース)を抽出します
  • タスクベクトルを組み合わせて、ベースに加算します
  • 複数の専門モデルをマージする場合に有効です
# Task vector
task_vector = finetuned_model - base_model

# Merge multiple task vectors
merged = base_model + α₁*task_vector₁ + α₂*task_vector₂

TIES-Merging

  • Task arithmetic + スパース化
  • パラメータの符号の衝突を解消します
  • 多数のタスク特化モデルのマージに最適です

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
Task Arithmetic

最適な用途: 専門スキルの組み合わせ

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
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. レイヤー固有のマージ
# Preserve base model's beginning and end
merge_method: passthrough
slices:
  - sources:
      - model: base_model
        layer_range: [0, 2]     # Keep first layers
  - sources:
      - model: merged_middle    # Merge middle layers
        layer_range: [2, 30]
  - sources:
      - model: base_model
        layer_range: [30, 32]   # Keep last layers

評価とテスト

マージ済みモデルのベンチマーク
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

よくある落とし穴

❌ 落とし穴 1: 互換性のないモデルのマージ
# Wrong: Different architectures
models:
  - model: meta-llama/Llama-2-7b  # Llama architecture
  - model: mistralai/Mistral-7B   # Mistral architecture

対処法: 同じアーキテクチャのモデルのみをマージしてください

❌ 落とし穴 2: 特定のモデルへの過度な重み付け
# Suboptimal: One model dominates
models:
  - model: model_a
    parameters:
      weight: 0.95  # Too high
  - model: model_b
    parameters:
      weight: 0.05  # Too low

対処法: よりバランスの取れた重み(0.3〜0.7 の範囲)を使用してください

❌ 落とし穴 3: 評価をしないこと
# Wrong: Merge and deploy without testing
mergekit-yaml config.yml ./merged-model
# Deploy immediately (risky!)

対処法: デプロイの前に必ずベンチマークを実行してください

リソース

関連項目

  • references/methods.md - マージアルゴリズムの詳細解説
  • references/examples.md - 実際のマージ設定の例
  • references/evaluation.md - ベンチマークとテスト戦略

コメント