模型合并是最近流行起来的一种新技术。它可以将多个模型合并为一个模型。这样做不仅能保证质量,还能获得额外的好处。新模型开始在任务中表现得更好,这一点在 Open LLM 排行榜上得到了清楚的证明:
在本文中,我们将探讨各种合并算法,研究如何实现这些算法,并深入探讨其工作原理。我们将通过示例展示如何使用 mergekit 工具包合并 Mistral、WizardMath 和 CodeLlama 等模型
合并算法
有多种合并模型的算法。其中很多都使用加权平均值的各种组合。不过,也有一些算法提出了不同的方法。在本文中,我将重点介绍一些我认为有趣的算法,并按照复杂度递增的顺序排列。
1. 任务矢量算术
这种方法引入了一种使用 "任务向量 "修改神经网络行为的新范式。这些向量代表了预训练模型权重空间的方向,指向特定任务中性能的提升。
可以通过求反和加法等算术运算来操作向量,从而有针对性地改变模型中的行为:
任务向量运算的优势:
总之,基于任务矢量的模型编辑为控制和提高神经网络模型在各种任务中的性能提供了一种新颖、通用的方法。
2. SLERP
SLERP 解决了模型合并中传统权重平均法的局限性。它提供了一种更细致的方法,在高维空间中以保留每个父模型独特特征和曲率的方式混合模型。
SLERP 的优势:
SLERP 的实施步骤:
SLERP 的特点是能够以参数之间平滑过渡的方式合并模型,并保留每个模型的独特特征,因此是复杂模型合并任务的首选方法。虽然 SLERP 在同时合并两个模型方面非常流行和有效,但它仅限于成对组合。
3. TIES
传统的模型合并方法面临着巨大的挑战,尤其是在处理不同模型参数之间的干扰方面。在合并多个模型时,这种干扰会导致性能大幅下降。
为了克服这些挑战,TIES 方法引入了三个步骤:
事实证明,TIES-合并方法在各种情况下都优于现有的几种合并方法。它能有效解决干扰问题,尤其是符号干扰,从而提高合并模型的整体性能。
4. DARE
DARE 是一种无需再训练或 GPU 的新方法。它主要侧重于学习相似(同源)模型的参数,以获得新的能力。它采用的方法与 TIES 相似,但有两个主要区别:
该算法按以下步骤运行:
总之,DARE 提供了一种独特而高效的方法,通过有策略地剪枝和重新调整参数来合并语言模型,从而使模型具有更强和更多样化的功能,而无需进行大量的重新训练。
实施
为了合并模型,我们将使用 mergekit,这是一个专为合并预训练语言模型而设计的工具包。它支持上述所有算法,而且设置非常简单。模型合并只需 CPU 即可运行,但只需 8GB 的 VRAM 就能加快速度。
1. 安装 mergekit:
python3 -m pip install --upgrade pip
git clone https://github.com/cg123/mergekit.gitclone https://github.com/cg123/mergekit.git
cd mergekit && pip install -q -e .
2. 在 YAML 文件中编写合并配置:
我将把 LLM 与混合架构结合起来: Mistral-7b、WizardMath-7b 和 CodeLlama-7b。以下是我的 ultra_llm_merged.yaml 配置:
models:
- model: mistralai/Mistral-7B-v0.1 # no parameters necessary for base model
- model: WizardLM/WizardMath-7B-V1.0
parameters:
density: 0.5 # fraction of weights in differences from the base model to retain
weight: # weight gradient
- filter: mlp
value: 0.5
- value: 0
- model: codellama/CodeLlama-7b-Instruct-hf
parameters:
density: 0.5
weight: 0.5
merge_method: ties
base_model: mistralai/Mistral-7B-v0.1
parameters:
normalize: true
int8_mask: true
dtype: float16
3. 运行合并:
mergekit-yaml ultra_llm_merged.yaml output_folder \
--allow-crimes \ # Allow mixing architectures# Allow mixing architectures
--copy-tokenizer \ # Copy a tokenizer to the output
--out-shard-size 1B \ # Number of parameters per output shard
--low-cpu-memory \ # Store results and intermediate values on GPU. Useful if VRAM > RAM
--write-model-card \ # Output README.md containing details of the merge
--lazy-unpickle # Experimental lazy unpickler for lower memory usage
就是这样!现在,你可以部署该模型!
结论
我们已经探索了合并模型的主要可能性,并深入研究了几种算法的工作原理。我相信,在不久的将来,我们会看到越来越多的模型是通过合并创建的。这是一种无需微调就能将有用技能结合起来的经济有效的方法。