模型合并Skill model-merging

模型合并技能用于无需重新训练即可结合多个预训练或微调AI模型的能力,通过混合不同领域专家(如数学、编程和聊天)来创建专业模型,提高性能并降低成本。关键词包括模型合并、mergekit、AI模型融合、无训练合并、大模型优化、深度学习应用。

大模型微调 0 次安装 0 次浏览 更新于 3/21/2026

名称: 模型合并 描述: 使用 mergekit 合并多个微调模型,无需重新训练即可结合能力。适用于通过混合领域特定专家(数学 + 编程 + 聊天)创建专业模型、提高单模型性能(通常在基准测试中提升 5-10%)或快速实验模型变体。涵盖 SLERP、TIES-Merging、DARE、Task Arithmetic、线性合并和生产部署策略。 版本: 1.0.0 作者: Orchestra Research 许可证: MIT 标签: [新兴技术, 模型合并, Mergekit, SLERP, TIES, DARE, 任务算术, 模型融合, 无重新训练, 多能力, Arcee AI] 依赖项: [mergekit, transformers, torch]

模型合并:组合预训练模型

何时使用此技能

使用模型合并当您需要:

  • 结合能力 从多个微调模型,无需重新训练
  • 创建专业模型 通过混合领域特定专家(数学 + 编程 + 聊天)
  • 提高性能 超越单模型(通常在基准测试中提升 5-10%)
  • 降低训练成本 - 无需 GPU,合并可在 CPU 上运行
  • 快速实验 - 在几分钟内创建新模型变体,而非数天
  • 保留多项技能 - 合并而无灾难性遗忘

成功案例:Marcoro14-7B-slerp(2024年2月 Open LLM 排行榜最佳),许多顶级的 HuggingFace 模型使用合并

工具:mergekit(Arcee AI)、LazyMergekit、Model Soup

安装

# 安装 mergekit
git clone https://github.com/arcee-ai/mergekit.git
cd mergekit
pip install -e .

# 或通过 pip
pip install mergekit

# 可选:Transformer 库
pip install transformers torch

快速开始

简单线性合并

# config.yml - 使用相等权重合并两个模型
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
# 运行合并
mergekit-yaml config.yml ./merged-model --cuda

# 使用合并模型
python -m transformers.models.auto --model_name_or_path ./merged-model

SLERP 合并(最适合 2 个模型)

# config.yml - 球形插值
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=模型1, 1=模型2)
dtype: bfloat16

核心概念

1. 合并方法

线性(Model Soup)

  • 参数的简单加权平均
  • 快速,适用于相似模型
  • 可合并 2+ 模型
merged_weights = w1 * model1_weights + w2 * model2_weights + w3 * model3_weights
# 其中 w1 + w2 + w3 = 1

SLERP(球形线性插值)

  • 在权重空间的球面上插值
  • 保持权重向量的大小
  • 最适合合并 2 个模型
  • 比线性更平滑
# SLERP 公式
merged = (sin((1-t)*θ) / sin(θ)) * model1 + (sin(t*θ) / sin(θ)) * model2
# 其中 θ = arccos(dot(model1, model2))
# t ∈ [0, 1]

任务算术

  • 提取“任务向量”(微调模型 - 基础模型)
  • 组合任务向量,添加到基础模型
  • 适用于合并多个专业模型
# 任务向量
task_vector = finetuned_model - base_model

# 合并多个任务向量
merged = base_model + α₁*task_vector₁ + α₂*task_vector₂

TIES-Merging

  • 任务算术 + 稀疏化
  • 解决参数中的符号冲突
  • 最适合合并许多任务特定模型

DARE(Drop And REscale)

  • 随机丢弃微调参数
  • 重新缩放剩余参数
  • 减少冗余,保持性能

2. 配置结构

# 基本结构
merge_method: <method>  # linear, slerp, ties, dare_ties, task_arithmetic
base_model: <path>      # 可选:任务算术的基础模型

models:
  - model: <path/to/model1>
    parameters:
      weight: <float>   # 合并权重
      density: <float>  # 用于 TIES/DARE

  - model: <path/to/model2>
    parameters:
      weight: <float>

parameters:
  # 方法特定参数

dtype: <dtype>  # bfloat16, float16, float32

# 可选
slices:  # 分层合并
tokenizer:  # 分词器配置

合并方法指南

线性合并

最适合:简单模型组合,等权重

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 合并

最适合:两个模型,平滑插值

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 = 第一个模型, 1.0 = 第二个模型
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    # 注意力层
      value: 0.3
    - filter: mlp          # MLP 层
      value: 0.7
    - value: 0.5           # 其他层的默认值
dtype: bfloat16

任务算术

最适合:结合专业技能

merge_method: task_arithmetic
base_model: mistralai/Mistral-7B-v0.1
models:
  - model: WizardLM/WizardMath-7B-V1.1  # 数学
    parameters:
      weight: 0.5
  - model: teknium/OpenHermes-2.5-Mistral-7B  # 聊天
    parameters:
      weight: 0.3
  - model: ajibawa-2023/Code-Mistral-7B  # 代码
    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  # 保留前 50% 参数
      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    # 丢弃 50% 的增量
      weight: 0.6
  - model: teknium/OpenHermes-2.5-Mistral-7B
    parameters:
      density: 0.5
      weight: 0.4
parameters:
  int8_mask: true  # 使用 int8 表示掩码(节省内存)
dtype: bfloat16

高级模式

分层合并

# 不同模型用于不同层
merge_method: passthrough
slices:
  - sources:
      - model: mistralai/Mistral-7B-v0.1
        layer_range: [0, 16]   # 前半部分
  - sources:
      - model: teknium/OpenHermes-2.5-Mistral-7B
        layer_range: [16, 32]  # 后半部分
dtype: bfloat16

从合并模型创建 MoE

# 创建专家混合
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"  # 合并两个模型的词汇表
  tokens:
    <|special_token|>:
      source: "custom/specialized-model"

最佳实践

1. 模型兼容性

# ✅ 好:相同架构
models = [
    "mistralai/Mistral-7B-v0.1",
    "teknium/OpenHermes-2.5-Mistral-7B",  # 均为 Mistral 7B
]

# ❌ 坏:不同架构
models = [
    "meta-llama/Llama-2-7b-hf",  # Llama
    "mistralai/Mistral-7B-v0.1",  # Mistral(不兼容!)
]

2. 权重选择

# ✅ 好:权重和为 1.0
models:
  - model: model_a
    parameters:
      weight: 0.6
  - model: model_b
    parameters:
      weight: 0.4  # 0.6 + 0.4 = 1.0

# ⚠️  可接受:权重和不为 1(用于任务算术)
models:
  - model: model_a
    parameters:
      weight: 0.8
  - model: model_b
    parameters:
      weight: 0.8  # 可能提升性能

3. 方法选择

# 根据使用案例选择合并方法:

# 2 个模型,平滑混合 → SLERP
merge_method = "slerp"

# 3+ 模型,简单平均 → 线性
merge_method = "linear"

# 多个任务特定模型 → 任务算术或 TIES
merge_method = "ties"

# 想减少冗余 → DARE
merge_method = "dare_ties"

4. 密度调优(TIES/DARE)

# 从保守开始(保留更多参数)
parameters:
  density: 0.8  # 保留 80%

# 如果性能好,增加稀疏性
parameters:
  density: 0.5  # 保留 50%

# 如果性能下降,减少稀疏性
parameters:
  density: 0.9  # 保留 90%

5. 分层特定合并

# 保留基础模型的开头和结尾
merge_method: passthrough
slices:
  - sources:
      - model: base_model
        layer_range: [0, 2]     # 保留前几层
  - sources:
      - model: merged_middle    # 合并中间层
        layer_range: [2, 30]
  - sources:
      - model: base_model
        layer_range: [30, 32]   # 保留最后几层

评估与测试

基准测试合并模型

from transformers import AutoModelForCausalLM, AutoTokenizer

# 加载合并模型
model = AutoModelForCausalLM.from_pretrained("./merged-model")
tokenizer = AutoTokenizer.from_pretrained("./merged-model")

# 在各种任务上测试
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 排行榜:通用能力
  • MT-Bench:多轮对话
  • MMLU:多任务准确性
  • HumanEval:代码生成
  • GSM8K:数学推理

生产部署

保存和上传

from transformers import AutoModelForCausalLM, AutoTokenizer

# 加载合并模型
model = AutoModelForCausalLM.from_pretrained("./merged-model")
tokenizer = AutoTokenizer.from_pretrained("./merged-model")

# 上传到 HuggingFace Hub
model.push_to_hub("username/my-merged-model")
tokenizer.push_to_hub("username/my-merged-model")

量化合并模型

# 使用 GGUF 量化
python convert.py ./merged-model --outtype f16 --outfile merged-model.gguf

# 使用 GPTQ 量化
python quantize_gptq.py ./merged-model --bits 4 --group_size 128

常见陷阱

❌ 陷阱 1:合并不兼容模型

# 错误:不同架构
models:
  - model: meta-llama/Llama-2-7b  # Llama 架构
  - model: mistralai/Mistral-7B   # Mistral 架构

修复:仅合并相同架构的模型

❌ 陷阱 2:过度加权一个模型

# 次优:一个模型主导
models:
  - model: model_a
    parameters:
      weight: 0.95  # 太高
  - model: model_b
    parameters:
      weight: 0.05  # 太低

修复:使用更平衡的权重(范围 0.3-0.7)

❌ 陷阱 3:不评估

# 错误:合并并部署而不测试
mergekit-yaml config.yml ./merged-model
# 立即部署(有风险!)

修复:部署前始终进行基准测试

资源

另请参阅

  • references/methods.md - 合并算法深度解析
  • references/examples.md - 现实世界合并配置
  • references/evaluation.md - 基准测试和测试策略