合并 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合并分为以下三个步骤:

  1. 修剪:通过保留只有一小部分最重要的参数(密度参数),并将其余参数重置为零,在任务特定模型中减少冗余。
  2. 电子标牌:通过基于累计幅度最为主导的方向(正数或负数),创建一个统一的标牌向量,解决不同型号之间的标牌冲突。
  3. 不相交合并:平均与统一符号向量对齐的参数值,排除零值。

与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的贡献

2024-01-09 04:41:54 AI中文站翻译自原文