AI Model Merging: SLERP, TIES, DARE, and Model Soup Techniques
Combine multiple fine-tuned models without additional training to create superior models
模型融合(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
注意事项:
#### 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
注意事项:
#### 3. TIES(Trim, Elect Sign and Merge)
核心思想:通过三步操作减少模型间的干扰:
适用场景:
配置示例:
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
注意事项:
#### 4. DARE(Drop And REscale)
核心思想:随机丢弃大部分微调参数(通常90-99%),然后对剩余参数进行缩放补偿。
变体:
dare_linear:DARE + 线性融合dare_ties:DARE + 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
注意事项:
#### 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(直通)
核心思想:直接从单个输入模型复制张量,用于模型拼接和层替换。
适用场景:
配置示例:
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
常见陷阱与最佳实践
bfloat16 或 float16 减少内存占用进阶工具
社区资源
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 中文.