合并 LLM 并使用私有数据集进行测试
什么是LLM合并,为什么我们需要它
模型合并是一种将两个或更多LLMs合并成一个模型的技术。这是一种相对较新的实验性方法,可以以较低成本(无需GPU)创建新模型。模型合并的效果非常出色,在开放LLM领导板上产生了许多最先进的模型。
这是我对最新的mergekit库的看法。
感谢创作者的贡献
我尝试过HF上的一些LLM,并发现它非常有用,然后我用它来测试了IIT JEE考试的问题和模拟考试。发现效果要好得多。
合并算法
在本节中,我们将重点介绍mergekit目前实施的四种方法。请注意,还有其他方法,如线性方法和任务算法。
1 1. SLERP 描述了两个四元数之间的球面插值方法。它根据一定的插值因子在两个四元数之间进行平滑的插值运算。这种插值方法可以用于动画、旋转和变换等领域。
球面线性插值(SLERP)是一种在两个向量之间进行平滑插值的方法。它保持了一个恒定的变化速率,并保留了向量所在球面空间的几何特性。
有几个原因支持使用SLERP而不是传统线性插值。例如,在高维空间中,线性插值可能导致插值向量的幅度减小(即减小权重的比例)。此外,权重方向的变化通常比变化的幅度更表示有意义的信息(如特征学习和表示)。
使用以下步骤实现SLERP:
1. 将输入向量归一化为单位长度,确保它们代表方向而非大小。
2. 使用它们的点积计算这些向量之间的角度。
3. 如果向量近乎共线,则为了提高效率,默认使用线性插值。否则,使用SLERP计算基于插值因子t(t=0表示第一个向量的100%,t=1表示第二个向量的100%)和向量之间的角度的比例因子。
4. 这些因素用于权衡原始向量,然后将它们相加以获得插值向量。
SLERP目前是最流行的合并方法,但它仅限于一次性合并两个模型。仍然有可能以层次结构方式合并多个模型。
切片:
来源:
- 模型:psmathur/orca_mini_v3_13b
layer_range: [0, 40] 图层范围:[0, 40]
车库模型:garage-bAInd/Platypus2–13B
层级范围:[0, 40]
# 或者,等效模型: 句法:
#模型:
# - 模型:psmathur/orca_mini_v3_13b
# - 模型:车库-bAInd/鸭嘴兽2-13B
合并方法:slerp
base_model:psmathur/orca_mini_v3_13b
参数:
保持HTML结构,将以下英文文本翻译成简体中文: t:
筛选:自我关注
值:[0, 0.5, 0.3, 0.7, 1]
- 过滤器:多层感知器(MLP)
value: [1, 0.5, 0.7, 0.3, 0] 数值:[1,0.5,0.7,0.3,0]
- 值:0.5 # 其余张量的后备方案
dtype: float16 数据类型:float16
2条领带
TIES-Merging 旨在将多个特定任务模型有效合并为一个多任务模型,同时保持HTML结构不变。
- 模型参数的冗余性:它在任务特定模型中识别和消除冗余参数。通过关注于微调过程中的变化,识别出最重要的变化的前k%并丢弃其余部分来实现这一目标。
- 参数符号之间的不一致性:当不同模型对同一参数提出相反的调整建议时,就会产生冲突。TIES-Merging通过创建一个统一的符号向量来解决这些冲突,该向量代表了所有模型中变化最显著的方向。
TIES合并分为以下三个步骤:
- 修剪:通过保留只有一小部分最重要的参数(密度参数),并将其余参数重置为零,在任务特定模型中减少冗余。
- 电子标牌:通过基于累计幅度最为主导的方向(正数或负数),创建一个统一的标牌向量,解决不同型号之间的标牌冲突。
- 不相交合并:平均与统一符号向量对齐的参数值,排除零值。
与SLERP不同,TIES可以同时合并多个模型。
3挑战
DARE使用了与TIES相似的方法,但有两个主要区别:
- 剪枝:DARE将精调之后的权重随机重置为原始值(即基础模型的权重)。
- 重缩放:DARE 重新缩放权重,以保持模型输出期望值的近似不变。它通过乘以一个缩放因子,将一个或多个模型的重新缩放权重加到基础模型的权重上。
Mergekit的实现方法有两种版本:带有TIES(dare_ties)的符号选取步骤,或者不带(dare_linear)。
4 透过
传递方法与之前的方法有很大的不同。通过连接来自不同LLM的层,它可以生成具有异域数量参数的模型(例如,通过两个7B参数模型生成9B模型)。这些模型通常被社区称为“科学怪人合并”或者“弗兰肯斯坦模型”。
这个技术非常实验性,但它成功地创建了引人注目的模型,例如使用两个Llama 2 70B模型的goliath-120b。最近发布的SOLAR-10.7B-v1.0也在他们的论文中使用了相同的思路,称之为深度缩放。
💻 合并您自己的模型
在本部分,我们将使用mergekit来加载合并配置,运行它,并将生成的模型上传到Hugging Face Hub。
首先,我们从源代码直接安装合并工具包,如下所示:
!git 克隆 https://github.com/cg123/mergekit.git !cd mergekit && pip 安装 -q -e .
在下面的区块中,我们以 YAML 格式加载合并配置。我们还指定合并后模型的名称以备将来使用。您可以将任何配置从前面的部分复制/粘贴到这里。
这次我们将使用两个不同的模型:Marcoroni-7B-v3和Mistral-7B-Merge-14-v0.1,并使用SLERP方法将它们合并在一起。我们将配置保存为一个yaml文件,用作合并命令的输入。
导入torch
导入 yaml
从mergekit.config导入MergeConfiguration
从mergekit.merge导入MergeOptions,运行合并操作
使用open(CONFIG_YML,"r",encoding="utf-8")打开fp:
merge_config = MergeConfiguration.model_validate(yaml.safe_load(fp)) merge_config = MergeConfiguration.model_validate(yaml.safe_load(fp))保留HTML结构翻译如下: merge_config = MergeConfiguration.model_validate(yaml.safe_load(fp))
run_merge(运行合并)
合并配置
out_path=输出路径,
options=MergeOptions(选项=
lora_merge_cache = LORA_MERGE_CACHE,请保持 HTML 结构。
cuda = torch.cuda.is_available(),
复制Tokenizer=COPY_TOKENIZER
lazy_unpickle = 懒散解封 Please note that the translation may vary depending on the context or specific usage.
low_cpu_memory = 低CPU内存,
),
)
print("完成!")
你完成了,现在你可以自由使用一个新的合并模型。
感谢https://github.com/cg123/mergekit#merge-methods的贡献