BlockMerge 梯度(张量版)
该脚本允许您通过混合两个经过微调的Llama 1/2语言模型的层来合并它们。这对于创建模型集成或将两个不同模型的优势结合到一个单一模型中非常有用。合并是基于两个模型之间指定的梯度进行的。
**警告:**不要尝试将Llama 1与Llama 2模型合并。虽然可以运行,但结果会是一团糟。
除非您有128 GB内存,否则这个过程将占用大量虚拟内存。为获得最佳性能,请将交换文件分散到多个驱动器上。
使用方法
您可以使用以下命令运行脚本:
python BlockMerge_Gradient_Tensors.py --model_path1 /path/to/model1 --model_path2 /path/to/model2 --output_model_path /path/to/output --gradient_values '[1.0, 0.5, 0.0]' --max_shard_size '2000MiB' [--layer_only] [--no_layers]
参数:
必需:
-
--model_path1
:- 描述:包含第一个模型的目录路径。
- 类型:字符串
-
--model_path2
:- 描述:包含第二个模型的目录路径。
- 类型:字符串
-
--output_model_path
:- 描述:合并后的模型将被保存的路径。
- 类型:字符串
-
--gradient_values
:- 描述:梯度值列表。表示两个模型的张量应如何合并。
- 示例:"[1.0, 0.5, 0.0]"
- 类型:浮点数列表
可选:
-
--max_shard_size
:- 描述:保存模型时指定最大分片大小。
- 默认值:"2000MiB"
- 类型:字符串
-
--layer_only
:- 描述:如果设置,仅处理键包含"layer"的张量。此选项与
--no_layers
互斥。 - 类型:标志
- 描述:如果设置,仅处理键包含"layer"的张量。此选项与
-
--no_layers
:- 描述:如果设置,仅处理键不包含"layer"的张量。此选项与
--layer_only
互斥。 - 类型:标志
- 描述:如果设置,仅处理键不包含"layer"的张量。此选项与
梯度值(gradient_values
)
定义:
gradient_values
参数是一个浮点数列表,表示两个模型的张量应如何合并的混合比例。值通常在0.0到1.0之间,其中:
1.0
表示张量值100%来自model2
。0.0
表示张量值100%来自model1
。
介于两者之间的任何值(例如0.5
)表示该特定张量是model1
和model2
的混合。
工作原理:
该列表作为一个指导,说明混合比例如何在模型的张量中变化。脚本使用提供的梯度值之间的线性插值来为模型中的所有张量生成平滑的混合比例梯度。
示例:
假设您提供的梯度值为[1.0, 0.5, 0.0]
。这告诉脚本从100%使用model2
的值开始混合张量,逐渐过渡到两个模型的50-50混合,最后只使用model1
的值。
给定这个列表,脚本根据梯度值计算张量的部分。在这种情况下,有3-1 = 2
个部分。如果模型中有24个张量:
- 前12个张量从100%使用
model2
的值过渡到50-50混合。 - 接下来的12个张量从50-50混合过渡到100%使用
model1
的值。
因此,第一个张量可能以100%的model2
值混合,第六个张量可能以大约75%的model2
值(和25%的model1
值)混合,第十二个张量可能以每个模型50%的比例混合,以此类推。
重要提示:
脚本假设列表的长度比张量总数除以部分数少一。任何余数都通过使用最后一个梯度值进行调整。
注意事项:
-
脚本假设两个模型具有相似的架构,但可以有不同的词汇表大小。如果词汇表大小不同,脚本会处理特定张量("lm_head.weight"和"model.embed_tokens.weight")的差异,通过截断模型2的词汇表以匹配模型1的大小。
-
--model_path1
目录中的相关分词器文件也会被复制到--output_model_path
目录中。
示例
python BlockMerge_Gradient_Tensors.py --model_path1 "stabilityai/StableBeluga-7B" --model_path2 "NousResearch/Nous-Hermes-Llama2-7b" --output_model_path "mythologic-mini-7b" --gradient_values "[0.9,0.0,0.0,0.0]" --layer_only
- 这需要使用模式**"[0.9, 0.0, 0.0, 0.0]"**,从90%的Hermes开始,在33%处降至0.0并保持不变。理解这一点的一个技巧是观察使用的数字之间有多少个间隔。在这种情况下,有三个间隔,表示每个点到点之间覆盖了33%的张量。