# 飞桨大模型套件 模型融合文档
## 1.大模型融合介绍
模型融合,也称为模型合并,是一种有效的技术,通过融合多个具有不同能力的独立模型的参数,构建一个通用模型,而无需访问原始训练数据或进行昂贵的计算。与模型融合最相关的概念是集成学习,因为它们都促进了知识的融合与传递。它们之间的主要区别在于,集成学习必须保存所有的单个模型,并在推理阶段融合多个模型的预测(或输出),而模型融合则直接在参数层面进行合并,并且在推理时只有一个最终模型。
模型融合应用的场景:
- **提高模型能力**:模型融合能使模型拥有处理多领域任务的能力,并且可能提升在交叉领域的能力。
- **缓解对齐代价**:在对预训练模型进行微调 sft 后得到微调模型,之后我们通常进行 RLHF。RLHF 被证明有效提升了 LLMs 的用户友好性,但它会引入一个对齐税(alignment tax),即在对齐人类偏好后模型的性能可能有所下降。模型融合可以缓解对齐税。
## 2.大模型融合算法介绍
### 2.1 快速开始
接下来我们将介绍如何使用统一脚本进行模型融合。
#### 2.1.1 环境准备
- PaddlePaddle 3.0-beta
- PaddleNLP develop
git clone 代码到本地,即可开始。
```bash
git clone https://github.com/PaddlePaddle/PaddleNLP.git
# pip install ./PaddleNLP 使用develop版本
cd PaddleNLP/llm/tools
# 到达运行目录
```
#### 2.1.2 模型融合
```
python mergekit.py \
--device cpu \
--tensor_type np \
--n_process 2 \
--merge_method linear \
--model_path_list ../checkpoints/model1 ../checkpoints/model \
--output_path ../checkpoints/model_merge
```
### 2.2 权重融合方法
| merge_method | 权重稀疏 | 权重融合 | 支持融合模型数 |
|----------------|---------------|------------|----------------|
| linear | / | linear | >=2 |
| slerp | / | slerp | =2 |
| ties | trim | ties | >=2 |
| della | magprune | ties | >=2 |
| della_linear | magprune | linear | >=2 |
| dare_linear | dare | linear | >=2 |
| dare_ties | dare | ties | >=2 |
#### 权重融合方法介绍:
- **linear**: 权重线性融合。可选超参 `weight_list`、`normalize`。
- **slerp**: 球面线性插值融合,仅支持两个模型融合。可选超参 `slerp_alpha`。
- **ties**: [TIES](https://arxiv.org/abs/2306.01708)论文中提出权重融合方式,应用符号一致性算法来减少模型融合干扰。可选超参 `weight_list`、`normalize`。
#### 权重稀疏方法介绍:
- **trim**: [TIES](https://arxiv.org/abs/2306.01708)论文中提出稀疏方式,根据绝对值由大到小顺序,保留设定比例权重数值,将其余小数值权重设为0。可选超参 `reserve_p`、`rescale`。
- **dare**: [DARE](https://arxiv.org/abs/2311.03099)论文中提出稀疏方式,根据设定概率,随机选择保留原始权重或设为0。可选超参 `reserve_p`、`rescale`。
- **magprune**:[DELLA](https://arxiv.org/abs/2406.11617)论文中提出稀疏方式,根据权重绝对值大小给定不同保留概率,随机选择保留原始权重或设为0。可选超参 `reserve_p`、`rescale`、`epsilon`。
## 3.Mergekit 参数介绍