[ PROMPT_NODE_22350 ]
model-merging
[ SKILL_DOCUMENTATION ]
# 模型合并:组合预训练模型
## 何时使用此技能
当您需要以下操作时,请使用模型合并:
- **组合能力**:无需重新训练即可结合多个微调模型的能力
- **创建专业模型**:通过融合领域专业知识(数学 + 编码 + 对话)来创建专用模型
- **提升性能**:超越单一模型表现(通常在基准测试中提升 5-10%)
- **降低训练成本**:无需 GPU,合并在 CPU 上运行
- **快速实验**:在几分钟内创建新的模型变体
- **保留多种技能**:在不发生灾难性遗忘的情况下进行合并
**成功案例**:Marcoro14-7B-slerp(2024年2月 Open LLM 排行榜第一),许多顶级 HuggingFace 模型都使用了合并技术。
**工具**:mergekit (Arcee AI), LazyMergekit, Model Soup
## 安装
bash
# 安装 mergekit
git clone https://github.com/arcee-ai/mergekit.git
cd mergekit
pip install -e .
# 或通过 pip
pip install mergekit
# 可选: Transformer 库
pip install transformers torch
## 快速开始
### 简单线性合并
yaml
# 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
bash
# 运行合并
mergekit-yaml config.yml ./merged-model --cuda
# 使用合并后的模型
python -m transformers.models.auto --model_name_or_path ./merged-model
### SLERP 合并 (最适合 2 个模型)
yaml
# 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 个以上模型
python
merged_weights = w1 * model1_weights + w2 * model2_weights + w3 * model3_weights
# 其中 w1 + w2 + w3 = 1
**SLERP (球面线性插值)**
- 在权重空间的球面上进行插值
- 保留权重向量的大小
- 最适合合并 2 个模型
- 比线性合并更平滑
python
# SLERP 公式
merged = (sin((1-t)*θ) / sin(θ)) * model1 + (sin(t*θ) / sin(θ)) * model2
# 其中 θ = arccos(dot(model1, model2))
# t ∈ [0, 1]
**任务算术 (Task Arithmetic)**
- 提取“任务向量” (微调后 - 基础)
- 组合任务向量