中文
← Back to tutorials

AI Model Merging: SLERP, TIES, DARE, and Model Soup Techniques

Combine multiple fine-tuned models without additional training to create superior models

By AI Skill Navigation Editorial TeamPublished June 7, 2025

模型融合(Model Merging)是一种在不增加推理成本的前提下,将多个预训练语言模型的优势结合起来的强大技术。与需要同时运行多个模型的集成方法不同,融合后的模型保持单个模型的推理开销,却往往能获得相当甚至更优的性能。本文将深入介绍几种主流的模型融合方法,并通过真实工具 arcee-ai/mergekit 展示如何在实际项目中应用这些技术。

为什么需要模型融合?

模型融合的核心价值在于:

  • 组合专长:将多个针对不同任务微调的模型合并为一个通用模型
  • 能力迁移:无需访问训练数据即可在不同模型间转移能力
  • 性能优化:在保持推理成本不变的前提下找到模型行为的最佳平衡点
  • 创新组合:通过创造性的模型组合产生新的能力
  • 工具介绍:mergekit

    mergekit 是由 Arcee AI 开发的开源模型融合工具包,采用外核计算(out-of-core)方式,即使在资源受限的环境中也能执行复杂的模型融合操作。融合过程可以完全在 CPU 上运行,或使用最少 8GB VRAM 的 GPU 加速。

    #### 安装

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

    如果遇到 setup.py 相关错误,请先升级 pip:

    bash
    python3 -m pip install --upgrade pip
    

    #### 基本使用

    mergekit-yaml 是主要入口,它读取 YAML 配置文件并输出融合后的模型:

    bash
    mergekit-yaml path/to/config.yml ./output-model-dir [--cuda] [--lazy-unpickle] [--allow-crimes]
    

    融合配置详解

    YAML 配置文件是融合过程的核心,它定义了要使用的模型、融合方法以及各种参数。

    #### 配置文件结构

    yaml
    

    融合方法

    merge_method: slerp

    使用 slices 或 models(二选一)

    slices: - model: path/to/model1 layer_range: [0, 32] - model: path/to/model2 layer_range: [0, 32]

    或使用 models(更常见)

    models: - model: path/to/model1 parameters: weight: 0.5 - model: path/to/model2 parameters: weight: 0.5

    基础模型(某些方法需要)

    base_model: path/to/base_model

    全局参数

    parameters: weight: 0.5 density: 0.5

    数据类型

    dtype: bfloat16

    分词器配置

    tokenizer: source: union

    #### 参数优先级

    参数可以在不同层级指定,优先级从高到低为:

  • slices.*.sources.parameters - 特定输入切片
  • slices.*.parameters - 特定输出切片
  • models.*.parameters - 特定输入模型
  • parameters - 全局默认值
  • 主要融合方法详解

    #### 1. Linear(线性融合)

    核心思想:对模型参数进行简单的加权平均。

    适用场景

  • 融合训练过程中不同检查点(模型汤)
  • 合并相似架构的模型
  • 快速原型验证
  • 配置示例

    yaml
    merge_method: linear
    models:
      - model: path/to/model1
        parameters:
          weight: 0.7
      - model: path/to/model2
        parameters:
          weight: 0.3
    dtype: float16
    

    注意事项

  • 要求模型架构完全相同
  • 权重之和不需要等于1,但建议归一化
  • 对参数分布差异大的模型效果可能不佳
  • #### 2. SLERP(球面线性插值)

    核心思想:在单位球面上对两个模型的参数进行插值,保持参数的几何特性。

    适用场景

  • 在两个模型之间平滑过渡
  • 需要保持参数范数一致性
  • 融合风格差异较大的模型
  • 配置示例

    yaml
    merge_method: slerp
    base_model: path/to/base_model
    models:
      - model: path/to/model1
        parameters:
          weight: 0.6
      - model: path/to/model2
        parameters:
          weight: 0.4
    dtype: bfloat16
    

    注意事项

  • 只能融合两个模型
  • 需要指定 base_model
  • 计算开销比 linear 大
  • 对参数值接近0的层效果更好
  • #### 3. TIES(Trim, Elect Sign and Merge)

    核心思想:通过三步操作减少模型间的干扰:

  • 修剪(Trim):移除每个任务向量中变化较小的参数
  • 选举(Elect Sign):对每个参数位置,选择多数模型的符号方向
  • 合并(Merge):仅保留与多数符号一致的参数进行平均
  • 适用场景

  • 融合多个微调模型(3个以上效果显著)
  • 减少模型间的冲突和干扰
  • 需要保留各模型的独特能力
  • 配置示例

    yaml
    merge_method: ties
    base_model: path/to/base_model
    models:
      - model: path/to/finetune1
        parameters:
          weight: 0.5
          density: 0.5
      - model: path/to/finetune2
        parameters:
          weight: 0.3
          density: 0.5
      - model: path/to/finetune3
        parameters:
          weight: 0.2
          density: 0.5
    parameters:
      density: 0.5  # 全局修剪比例
    dtype: bfloat16
    

    注意事项

  • 必须指定 base_model
  • density 参数控制修剪强度(0-1),值越小修剪越多
  • 对参数分布差异大的模型效果最好
  • 计算开销较大
  • #### 4. DARE(Drop And REscale)

    核心思想:随机丢弃大部分微调参数(通常90-99%),然后对剩余参数进行缩放补偿。

    变体

  • dare_linear:DARE + 线性融合
  • dare_ties:DARE + TIES 符号选举
  • 适用场景

  • 需要保留微调模型的特定能力
  • 融合大量模型(5个以上)
  • 与 TIES 结合使用效果更佳
  • 配置示例

    yaml
    merge_method: dare_ties
    base_model: path/to/base_model
    models:
      - model: path/to/finetune1
        parameters:
          weight: 0.4
          density: 0.1  # 保留10%的参数
      - model: path/to/finetune2
        parameters:
          weight: 0.3
          density: 0.1
      - model: path/to/finetune3
        parameters:
          weight: 0.3
          density: 0.1
    parameters:
      density: 0.1
    dtype: bfloat16
    

    注意事项

  • density 通常设为 0.01-0.1(保留1%-10%)
  • 过低 density 可能导致信息丢失
  • 需要足够的模型数量(至少3个)
  • 对随机种子敏感
  • #### 5. Task Arithmetic(任务算术)

    核心思想:将微调模型与基础模型的差异定义为"任务向量",然后对这些向量进行线性组合。

    适用场景

  • 正向/负向能力迁移
  • 组合多个任务的能力
  • 消除不需要的行为
  • 配置示例

    yaml
    merge_method: task_arithmetic
    base_model: path/to/base_model
    models:
      - model: path/to/finetune1
        parameters:
          weight: 1.0  # 正向迁移
      - model: path/to/finetune2
        parameters:
          weight: -0.5  # 负向迁移(消除某些能力)
    dtype: bfloat16
    

    注意事项

  • 权重可以为负值(消除能力)
  • 需要仔细调整权重避免破坏模型
  • 对基础模型质量要求高
  • #### 6. Passthrough(直通)

    核心思想:直接从单个输入模型复制张量,用于模型拼接和层替换。

    适用场景

  • Frankenmerging(拼接不同模型的层)
  • 层替换和手术
  • 创建混合架构
  • 配置示例

    yaml
    merge_method: passthrough
    slices:
      - model: path/to/model1
        layer_range: [0, 16]
      - model: path/to/model2
        layer_range: [16, 32]
    dtype: bfloat16
    

    注意事项

  • 不进行任何参数融合
  • 需要确保层维度兼容
  • 常用于实验性架构
  • 高级配置技巧

    #### 条件参数

    可以为不同层类型设置不同参数:

    yaml
    models:
      - model: path/to/model
        parameters:
          weight: 0.5
          filter: "self_attn"  # 仅应用于注意力层
    

    #### 梯度参数

    使用梯度实现平滑过渡:

    yaml
    parameters:
      weight:
        - 0.0  # 第一层
        - 0.5  # 中间层
        - 1.0  # 最后一层
    

    #### 分词器配置

    yaml
    tokenizer:
      source: union  # 合并所有模型的分词器
      tokens:
        <|im_start|>:
          source: "path/to/chatml_model"
        <|im_end|>:
          source: "path/to/chatml_model"
    

    实际案例:融合代码和数学能力

    假设我们有一个基础模型和两个微调模型(代码专家和数学专家):

    yaml
    merge_method: dare_ties
    base_model: path/to/base_model
    models:
      - model: path/to/code_expert
        parameters:
          weight: 0.5
          density: 0.1
      - model: path/to/math_expert
        parameters:
          weight: 0.5
          density: 0.1
    parameters:
      density: 0.1
    dtype: bfloat16
    tokenizer:
      source: union
    

    常见陷阱与最佳实践

  • 模型兼容性:确保所有模型使用相同的分词器和架构
  • 数据类型:使用 bfloat16float16 减少内存占用
  • 权重调整:从等权重开始,逐步调整
  • 验证:在多个基准测试上评估融合效果
  • 迭代:融合是一个迭代过程,需要多次尝试
  • 进阶工具

  • mergekit-multi:支持多阶段融合工作流
  • mergekit-moe:将多个密集模型合并为混合专家模型
  • mergekit-pytorch:融合任意 PyTorch 模型
  • mergekit-tokensurgeon:分词器移植工具
  • 社区资源

  • FrankensteinAI:提供基于浏览器的融合平台
  • Hugging Face Hub:分享和发现融合模型
  • Arcee Discord:社区讨论和支持
  • FAQ

    Q1: 融合后的模型是否需要重新训练? A: 不需要。模型融合直接在权重空间操作,无需额外训练。但如果融合效果不理想,可以尝试调整参数或使用不同的融合方法。

    Q2: 融合多个模型需要多少 GPU 内存? A: mergekit 采用外核计算,8GB VRAM 即可运行。CPU 模式也可以工作,但速度较慢。内存需求主要取决于模型大小和融合方法。

    Q3: 如何选择融合方法? A: 根据场景选择:简单平均用 Linear;两个模型平滑过渡用 SLERP;融合多个微调模型用 TIES 或 DARE;需要精细控制用 Task Arithmetic;拼接模型用 Passthrough。

    Q4: 融合后的模型性能如何评估? A: 建议在多个基准测试上评估,包括通用能力(如 MMLU)、特定任务能力(如代码生成、数学推理)和安全性测试。同时进行人工评估也很重要。

    Q5: 融合失败怎么办? A: 常见解决方案:1) 检查模型架构兼容性;2) 调整权重和密度参数;3) 尝试不同的融合方法;4) 减少融合的模型数量;5) 确保使用正确的 base_model。

    *Last updated: July 2026. Always verify against each tool's official docs.*

    Also available in 中文.