20_大模型微调和训练之-基于LLamaFactory+LoRA微调LLama3后格式合并

1. 什么是 GGUF

GGUF 格式的全名为(GPT-Generated Unified Format),提到 GGUF 就不得不提到它的前身 GGML(GPT-Generated Model Language)。GGML 是专门为了机器学习设计的张量库,最早可 以追溯到 2022/10。其目的是为了有一个单文件共享的格式,并 且易于在不同架构的 GPU 和 CPU 上进行推理。但在后续的开发 中,遇到了灵活性不足、相容性及难以维护的问题。

为什么要转换 GGUF 格式?

在传统的 Deep Learning Model 开发中大多使用 PyTorch 来进行开发,但因为在部署时会面临相依 Lirbrary 太多、版本管理的问题于才有了 GGML、GGMF、GGJT 等格式,而在开源社群不停的迭代后 GGUF 就诞生了。

GGUF 实际上是基于 GGJT 的格式进行优化的,并解决了 GGML 当初面临的问题,包括:

  • 可扩展性:轻松为 GGML 架构下的工具添加新功能,或者向 GGUF 模型添加新 Feature,不会破坏与现有模型的兼容性。
  • 对 mmap(内存映射)的兼容性:该模型可以使用 mmap 进行加载(原理解析可见参考),实现快速载入和存储。(从 GGJT 开 始导入,可参考 GitHub)
  • 易于使用:模型可以使用少量代码轻松加载和存储,无需依赖的 Library,同时对于不同编程语言支持程度也高。
  • 模型信息完整:加载模型所需的所有信息都包含在模型文件中,不需要额外编写设置文件。
  • 有利于模型量化:GGUF 支持模型量化(4 位、8 位、F16),在 GPU 变得越来越昂贵的情况下,节省 vRAM 成本也非常重要。

本地获取GGUF文件

我们使用llamafactory 训练完模型我们这个时候存在一个base模型和训练的权重参数(LoAR秩)需要导出合并模型

将 base model 与训练好的 LoRA Adapter 合并成一个新的模型。注意:不要使用量化后的模型或 参数进行合并。

以下是 merge_llama3_lora_sft.yaml 的内容:

yaml 复制代码
#model(基座模型)
model_name_or_path: /root/autodl-tmp/Llama3-8B/LLM-Research/Meta-Llama-3-8B-Instruct
#lora(自己训练的lora模型部分)
adapter_name_or_path: /root/autodl-tmp/LLaMA-Factory/saves/Llama-3-8B-Instruct/lora/train_2024-11-22-17-18-42
template: llama3
finetuning_type: lora

#export
export_dir: /root/autodl-tmp/Llama3-8B/LLM-Research/Meta-Llama-3-8B-Instruct-merged
export_size: 4
export_device: cuda
export_legacy_format: false

修改好配置文件 运行下面命令进行合并

shell 复制代码
llamafactory-cli export cust/merge_llama3_lora_sft.yaml

使用合并后的模型进行预测时,您不再需要加载 LoRA Adapter。

2. 把合成的模型进行转化 (llama.cpp)

安装llama.cpp

bash 复制代码
git clone https://github.com/ggerganov/llama.cpp.git 
pip install -r llama.cpp/requirements.txt

执行转换

bash 复制代码
# 如果不量化,保留模型的效果
python llama.cpp/convert_hf_to_gguf.py ./Meta-Llama-3-8B-Instruct --outtype f16 --verbose --outfile Meta-Llama-3-8B-Instruct-gguf.gguf

# 如果需要量化(加速并有损效果),直接执行下面脚本就可以
python llama.cpp/convert_hf_to_gguf.py ./Meta-Llama-3-8B-Instruct --outtype q8_0 --verbose --outfile Meta-Llama-3-8B-Instruct-gguf_q8_0.gguf

./Meta-Llama-3-8B-Instruct 导出模型的路径

Meta-Llama-3-8B-Instruct-gguf.gguf 转化之后的路径存放

这里--outtype是输出类型,代表含义:

  • q2_k:特定张量(Tensor)采用较高的精度设置,而其他的则保持基础级别。
  • q3_k_lq3_k_mq3_k_s:这些变体在不同张量上使用不同级别的精度,从而达到性能和效率的平衡。
  • q4_0:这是最初的量化方案,使用4位精度。
  • q4_1q4_k_mq4_k_s:这些提供了不同程度的准确性和推理速度,适合需要平衡资源使用的场景。
  • q5_0q5_1q5_k_mq5_k_s:这些版本在保证更高准确度的同时,会使用更多的资源并且推理速度较慢。
  • q6_kq8_0:这些提供了最高的精度,但是因为高资源消耗和慢速度,可能不适合所有用户。
  • fp16f32:不量化,保留原始精度。

命令解析

base 复制代码
python llama.cpp/convert_hf_to_gguf.py \  # 运行转换脚本
./Meta-Llama-3-8B-Instruct \            # 输入模型路径
--outtype f16 \                         # 输出浮点精度
--verbose \                             # 显示详细日志
--outfile Meta-Llama-3-8B-Instruct-gguf.gguf.gguf  # 输出文件名

关键参数说明

  • llama.cpp/convert_hf_to_gguf.py‌

作用‌:llama.cpp 官方提供的转换脚本,用于将 Hugging Face 格式模型 → GGUF 格式。

路径要求‌:需确保 llama.cpp 仓库已克隆到当前目录,且脚本路径正确。

  • ./Meta-Llama-3-8B-Instruct‌

    这个一般是自己训练好的模型

    输入模型路径‌:指向 Hugging Face 格式模型的目录,需包含:

    pytorch_model.bin(模型权重)

    config.json(模型配置)

    tokenizer.model 或 tokenizer.json(分词器)

  • --outtype f16‌

浮点精度‌:指定输出权重的数值类型:

f16:半精度浮点数(默认,平衡精度与速度)

f32:全精度浮点数(更高精度,但文件更大)

q8_0:8 位量化(缩小文件体积,轻微精度损失)

  • --verbose‌

日志模式‌:显示转换过程的详细信息(如层名称、进度条),便于调试。

  • --outfile‌

输出文件名‌:指定生成的 GGUF 文件路径。

建议路径部分是 绝对路径

典型使用场景

目标‌:将 Hugging Face 模型转换为可在 llama.cpp 中运行的格式。

适用场景‌:

在 CPU 或低显存 GPU 设备上运行大模型(GGUF 支持内存映射)。

需要量化模型以减小体积(如 4-bit/8-bit 量化)。

3. 合成后的可以使用ollama直接运行

安装ollama 不在详细介绍

安装

bash 复制代码
curl -fsSL https://ollama.com/install.sh  | sh
shell 复制代码
启动 ollama
ollam start
ollama serve
ollam run LLamas 具体的大模型名称

3.2 创建ModelFile

复制模型路径,创建名为"ModelFile"的meta文件,内容如下

bash 复制代码
#GGUF文件路径
FROM /root/autodl-tmp/Llama3-8B/LLM-Research/Meta-Llama-3-8B-Instruct-gguf8.gguf

3.3 创建自定义模型

使用ollama create命令创建自定义模型

bash 复制代码
ollama create llama-3-8B-Instruct --file ./ModeFile

llama-3-8B-Instruct 这个名字是自己创建的

2.5 运行模型:

bash 复制代码
ollama ls
ollama run llama-3-8B-Instruct

4. ???llama_factory 不进行合并就不可以运行了吗 ?

答案可以的

使用命令行对话框

bash 复制代码
llamafactory-cli chat examples/inference/llama3_lora_sft.yaml

使用浏览器对话框

bash 复制代码
llamafactory-cli webchat examples/inference/llama3_lora_sft.yaml

启动 OpenAI 风格 API

bash 复制代码
llamafactory-cli api examples/inference/llama3_lora_sft.yaml

examples/inference/llama3_lora_sft.yaml内容如下:

yaml 复制代码
model_name_or_path: /mnt/workspace/deepseeck/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B
adapter_name_or_path: /mnt/workspace/LLaMA-Factory/saves/DeepSeek-R1-7B-Distill/lora/train_2025-04-28-20-42-03/adapter_config.json
template: deepseek3
infer_backend: huggingface  # choices: [huggingface, vllm]
trust_remote_code: true
相关推荐
京国问道3 分钟前
MCP的基础知识
人工智能·function call·mcp
mailangduoduo30 分钟前
基于UNet算法的农业遥感图像语义分割——补充版
人工智能·深度学习·机器学习·计算机视觉·语义分割
Sui_Network1 小时前
Walrus 与 Pudgy Penguins 达成合作,为 Web3 头部 IP 引入去中心化存储
大数据·人工智能·游戏·web3·去中心化·区块链
禺垣1 小时前
Bagging、Boosting、Stacking的原理
人工智能·机器学习·数据分析·集成学习·boosting·bagging·stacking
hunteritself1 小时前
OpenAI 上新:轻量版 Deep Research、GPT-4o 升级、o3 限额翻倍、生图 API 发布!| AI Weekly 4.21-4.27
前端·人工智能·科技·深度学习·chatgpt
AI让世界更懂你1 小时前
【ACL系列论文写作指北08-图表设计规范】-让数据与结构一目了然
人工智能·设计规范
HUIBUR科技1 小时前
AI与无人零售:如何通过智能化技术提升消费者体验和运营效率?
人工智能·ai
老艾的AI世界1 小时前
最强AI数字人,口型、表情、动作全同步!Kairos下载介绍
图像处理·人工智能·深度学习·神经网络·目标检测·机器学习·ai·数字人·虚拟数字人·ai虚拟数字人
kaamelai1 小时前
Kaamel白皮书:OpenAI 在安全方向的实践
大数据·人工智能·安全
尼罗河女娲1 小时前
【Token系列】14|Prompt不是文本,是token结构工程
人工智能·深度学习·机器学习·语言模型·自然语言处理