当前位置: 首页 > article >正文

使用mergekit合并大型语言模型

https://www.dong-blog.fun/post/1966

使用mergekit合并大型语言模型

在人工智能领域,模型合并是一种将多个大型语言模型(LLM)整合为单一模型的技术。这种方法不仅成本低廉(无需GPU),还能生成性能卓越的模型。本文将介绍如何使用mergekit库来实现模型合并,并详细讲解四种常用的合并方法:SLERP、TIES、DARE和Passthrough。最后,我们将通过实际操作创建一个名为Marcoro14-7B-slerp的模型,并将其上传至Hugging Face Hub。

1. 准备工作

首先,我们需要安装mergekit库。可以通过以下命令从GitHub直接安装:

!git clone https://github.com/cg123/mergekit.git
!cd mergekit && pip install -q -e .
2. 合并方法简介
SLERP(球面线性插值)

SLERP是一种在两个向量之间平滑插值的方法,适用于高维空间中的向量插值。它能够保持向量的几何特性,避免线性插值带来的向量长度缩减问题。

配置示例:

slices:
  - sources:
      - model: OpenPipe/mistral-ft-optimized-1218
        layer_range: [0, 32]
      - model: mlabonne/NeuralHermes-2.5-Mistral-7B
        layer_range: [0, 32]
merge_method: slerp
base_model: OpenPipe/mistral-ft-optimized-1218
parameters:
  t:
    - filter: self_attn
      value: [0, 0.5, 0.3, 0.7, 1]
    - filter: mlp
      value: [1, 0.5, 0.7, 0.3, 0]
    - value: 0.5
dtype: bfloat16
TIES(任务特定模型合并)

TIES-Merging通过消除冗余参数和解决参数符号冲突,将多个任务特定模型合并为一个多任务模型。

配置示例:

models:
  - model: mistralai/Mistral-7B-v0.1
  - model: OpenPipe/mistral-ft-optimized-1218
    parameters:
      density: 0.5
      weight: 0.5
  - model: mlabonne/NeuralHermes-2.5-Mistral-7B
    parameters:
      density: 0.5
      weight: 0.3
merge_method: ties
base_model: mistralai/Mistral-7B-v0.1
parameters:
  normalize: true
dtype: float16
DARE(随机权重重置与重缩放)

DARE通过随机重置微调权重并重缩放权重,将多个模型合并为一个。

配置示例:

models:
  - model: mistralai/Mistral-7B-v0.1
  - model: samir-fama/SamirGPT-v1
    parameters:
      density: 0.53
      weight: 0.4
  - model: abacusai/Slerp-CM-mist-dpo
    parameters:
      density: 0.53
      weight: 0.3
  - model: EmbeddedLLM/Mistral-7B-Merge-14-v0.2
    parameters:
      density: 0.53
      weight: 0.3
merge_method: dare_ties
base_model: mistralai/Mistral-7B-v0.1
parameters:
  int8_mask: true
dtype: bfloat16
Passthrough(层拼接)

Passthrough方法通过拼接不同模型的层,生成参数数量独特的模型。

配置示例:

slices:
  - sources:
    - model: OpenPipe/mistral-ft-optimized-1218
      layer_range: [0, 32]
  - sources:
    - model: mlabonne/NeuralHermes-2.5-Mistral-7B
      layer_range: [24, 32]
merge_method: passthrough
dtype: bfloat16
3. 创建并上传模型

以下是一个完整的示例,展示如何使用SLERP方法合并两个模型,并将结果上传至Hugging Face Hub。

步骤:

  1. 定义合并配置:
import yaml

MODEL_NAME = "Marcoro14-7B-slerp"
yaml_config = """
slices:
  - sources:
      - model: AIDC-ai-business/Marcoroni-7B-v3
        layer_range: [0, 32]
      - model: EmbeddedLLM/Mistral-7B-Merge-14-v0.1
        layer_range: [0, 32]
merge_method: slerp
base_model: AIDC-ai-business/Marcoroni-7B-v3
parameters:
  t:
    - filter: self_attn
      value: [0, 0.5, 0.3, 0.7, 1]
    - filter: mlp
      value: [1, 0.5, 0.7, 0.3, 0]
    - value: 0.5
dtype: bfloat16
"""

# 保存配置为YAML文件
with open('config.yaml', 'w', encoding="utf-8") as f:
    f.write(yaml_config)
  1. 运行合并命令:
!mergekit-yaml config.yaml merge --copy-tokenizer --allow-crimes --out-shard-size 1B --lazy-unpickle
  1. 生成模型说明文件并上传:
!pip install -qU huggingface_hub

from huggingface_hub import ModelCard, ModelCardData
from jinja2 import Template

username = "mlabonne"

template_text = """
---
license: apache-2.0
tags:
- merge
- mergekit
- lazymergekit
{%- for model in models %}
- {{ model }}
{%- endfor %}
---

# {{ model_name }}

{{ model_name }} is a merge of the following models using [mergekit](https://github.com/cg123/mergekit):

{%- for model in models %}
* [{{ model }}](https://huggingface.co/{{ model }})
{%- endfor %}

## 🧩 Configuration

\```yaml
{{- yaml_config -}}
\```
"""

# 创建Jinja模板对象
jinja_template = Template(template_text.strip())

# 从配置中获取模型列表
data = yaml.safe_load(yaml_config)
if "models" in data:
    models = [data["models"][i]["model"] for i in range(len(data["models"])) if "parameters" in data["models"][i]]
elif "parameters" in data:
    models = [data["slices"][0]["sources"][i]["model"] for i in range(len(data["slices"][0]["sources"]))]
elif "slices" in data:
    models = [data["slices"][i]["sources"][0]["model"] for i in range(len(data["slices"]))]
else:
    raise Exception("No models or slices found in yaml config")

# 填充模板
content = jinja_template.render(
    model_name=MODEL_NAME,
    models=models,
    yaml_config=yaml_config,
    username=username,
)

# 保存模型说明文件
card = ModelCard(content)
card.save('merge/README.md')

# 上传至Hugging Face Hub
from google.colab import userdata
from huggingface_hub import HfApi

username = "mlabonne"

# 在Google Colab的Secrets标签中定义
api = HfApi(token=userdata.get("HF_TOKEN"))

api.create_repo(
    repo_id=f"{username}/{MODEL_NAME}",
    repo_type="model"
)
api.upload_folder(
    repo_id=f"{username}/{MODEL_NAME}",
    folder_path="merge",
)
4. 模型测试与评估

合并完成后,可以通过以下代码在T4 GPU上测试模型:

!pip install -qU transformers accelerate

from transformers import AutoTokenizer
import transformers
import torch

model = "mlabonne/Marcoro14-7B-slerp"
messages = [{"role": "user", "content": "What is a large language model?"}]

tokenizer = AutoTokenizer.from_pretrained(model)
prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
pipeline = transformers.pipeline(
    "text-generation",
    model=model,
    torch_dtype=torch.float16,
    device_map="auto",
)

outputs = pipeline(prompt, max_new_tokens=256, do_sample=True, temperature=0.7, top_k=50, top_p=0.95)
print(outputs[0]["generated_text"])
5. 总结

通过本教程,我们学习了如何使用mergekit库合并大型语言模型,并详细介绍了SLERP、TIES、DARE和Passthrough四种方法。最后,我们创建了一个名为Marcoro14-7B-slerp的模型,并将其上传至Hugging Face Hub。希望这篇教程能帮助你更好地理解和应用模型合并技术!


http://www.kler.cn/a/579382.html

相关文章:

  • 使用chroot预安装软件到ubuntu22中
  • 【学习笔记】【DeepSeek AI 医生】2-2 AI家庭医生课程内容介绍
  • vscode的终端无法运行vue或者node等命令解决方案
  • 在uni-app中使用SQLite实现离线下数据同步:从封装到实践
  • 框架基本知识总结 Day15
  • 字母异位词分组 力扣49
  • UI自动化测试Selenium安装教程(1)
  • 解决VScode 连接不上问题
  • Python Flask 使用不同的 HTTP 方法类型处理请求
  • 华为OD机试-数组去重和排序(Java 2024 C卷 100分)
  • React 项目中 SVG 图标的调试和预览方法
  • Go红队开发—格式导出
  • 2025年最值得尝试的 8 个 AI 开源大模型
  • 嵌入式工控机在汽车制造中的卓越表现
  • Taro React组件开发 —— RuiNoticeBar 通知栏
  • 视觉图像处理
  • 读取 Resource 目录下文件内容
  • deepseek 3FS编译
  • TCP协议与包头格式
  • [HTTP协议]应用层协议HTTP从入门到深刻理解并落地部署自己的云服务(1)知识基础