开源大模型的使用链路可以概括为:从 Hugging Face 获取模型和数据,使用 Unsloth 等工具完成 LoRA 或 QLoRA 微调,再根据部署环境导出为 Safetensors 或 GGUF。本篇笔记梳理这条链路中最容易混淆的概念,并给出一套可落地的微调流程。

  1. Hugging Face
  2. Unsloth https://unsloth.ai/docs/zh/mo-xing/deepseek-v4?select=gguf-%2B-4%E4%BD%8D,%E6%8C%87%E4%BB%A4%E7%89%88-16%E4%BD%8D#llama.cpp-guide

Hugging Face 是什么

Hugging Face 是开源 AI 社区和模型协作平台。它与 GitHub 类似,但主要管理机器学习相关资源:

  • Models:预训练模型、微调模型和量化模型;
  • Datasets:训练集、验证集和评测集;
  • Spaces:可在线运行的模型演示;
  • Transformers:加载、训练和推理模型的 Python 库;
  • Hub:保存模型版本、配置文件、分词器和模型说明。

Hugging Face Hub 的模型列表

一个模型仓库通常不只有权重文件,还可能包含 config.json、分词器、聊天模板和模型说明。下载模型时,应先确认许可证、基础模型、参数规模、上下文长度以及运行框架是否兼容。

Unsloth 是什么

Unsloth 是一个面向大语言模型训练和推理的开源框架,重点是降低微调所需的显存和训练时间。它支持常见的 Llama、Qwen、Gemma 等模型,并提供 Notebook、Python API 和本地 Studio 界面。

Unsloth 常见用途包括:

  • 使用 LoRA 或 QLoRA 微调指令模型;
  • 进行监督微调(SFT)和部分强化学习训练;
  • 加载 4-bit 模型以降低显存占用;
  • 保存 LoRA Adapter;
  • 合并并导出 Safetensors;
  • 导出 GGUF,供 Ollama、LM Studio 或 llama.cpp 使用。

Unsloth 是训练和转换工具,不是模型仓库,也不是一种模型格式。实际使用时,它通常与 Hugging Face、Transformers、TRL 和 PEFT 配合工作。

GGUF 和 Safetensors 有什么区别

两者都是模型文件格式,但面向的阶段不同:Safetensors 更适合训练和 GPU 推理,GGUF 更适合本地部署。

对比项 GGUF Safetensors
主要用途 本地推理、量化部署 训练、微调和 GPU 推理
常见框架 llama.cpp、Ollama、LM Studio、KoboldCpp Transformers、PyTorch、Unsloth、vLLM
常见精度 Q2、Q4、Q5、Q6、Q8、FP16 FP32、BF16、FP16,也可以保存量化权重
文件内容 权重及较完整的模型、分词器元数据 主要保存张量,配置通常位于其他 JSON 文件中
文件组织 经常一个 .gguf 文件即可运行 可能由多个 .safetensors 分片和配置文件组成
CPU 运行 非常适合 通常不是首选
继续训练 支持有限,通常需使用训练版本的权重 非常适合
安全性 数据文件本身不执行代码 专为安全加载设计,不使用 pickle 反序列化

需要注意,GGUF 不等于量化。GGUF 也能保存 FP16 权重,只是最常见的 GGUF 文件通常采用 Q4、Q5 或 Q8 量化。Safetensors 同样不代表某种固定精度,它只是安全存储张量的格式。

选择方式可以简化为:

  • 还要训练、继续微调或使用 Transformers:保留 Safetensors;
  • 只需要在个人电脑上聊天:导出 GGUF;
  • 显存或内存有限:可从 Q4_K_M GGUF 开始测试;
  • 需要保留高质量母版:保存 BF16 或 FP16 Safetensors,以及 LoRA Adapter。

格式细节可以参考 GGUF 规范Safetensors 文档

模型量化是什么

模型权重通常使用 FP32、FP16 或 BF16 表示。量化会用更少的位数保存或计算权重,例如 INT8 或 4-bit,从而降低存储、显存和内存需求。

量化的主要收益是:

  • 模型文件更小;
  • 加载所需内存更少;
  • 部分硬件上的推理速度更快。

代价是可能产生精度损失。位数越低,压缩越明显,通常也越需要关注输出质量。实际选择不能只看文件大小,还应使用与业务相关的问题进行对比评测。

PTQ 与 QAT

训练后量化(Post-Training Quantization,PTQ)是在模型训练完成后直接压缩权重,不再进行完整训练。它成本低,是本地部署中最常见的方案,大多数 GGUF 量化模型属于这一类。

量化感知训练(Quantization-Aware Training,QAT)则在训练期间模拟低精度计算产生的误差,让模型提前适应量化。QAT 通常能更好地保持低位模型的效果,但训练过程更复杂、成本也更高。

可以简单理解为:PTQ 是“先训练,再压缩”;QAT 是“训练时就为压缩做准备”。

LoRA 与 QLoRA

全量微调会更新模型的大部分或全部参数,硬件成本较高。LoRA(Low-Rank Adaptation)冻结基础模型,在特定线性层旁增加小型低秩矩阵,训练时只更新这些新增参数。

因此 LoRA 具有以下特点:

  • 需要训练的参数更少;
  • 显存占用明显降低;
  • 生成的 Adapter 文件较小;
  • 同一个基础模型可以切换不同任务的 Adapter。

QLoRA 会进一步以 4-bit 加载冻结的基础模型,同时训练 LoRA 参数。与 16-bit LoRA 相比,它更适合消费级显卡,但可能略慢,并存在轻微的精度取舍。

方法 基础模型精度 显存需求 适合场景
全量微调 通常为 BF16 或 FP16 很高 资源充足、需要深度改变模型能力
LoRA 通常为 BF16 或 FP16 中等 重视训练质量且显存充足
QLoRA 通常以 4-bit 加载 较低 消费级显卡、低成本实验

一次完整的微调流程

从加载模型到评估的微调迭代流程

1. 明确目标并建立基线

先确定微调要改变什么,例如回答格式、术语使用、客服话术或特定任务能力。微调前使用固定问题测试基础模型,保存回答和指标,作为后续对比基线。

不要把所有问题都交给微调解决。需要实时更新的事实更适合使用 RAG;需要严格执行的结构可以先尝试提示词、工具调用或输出校验。

2. 准备数据

聊天微调可使用 messages 格式,每条样本包含 system、user 和 assistant 消息:

{
  "messages": [
    {"role": "system", "content": "你是一名专业客服助手。"},
    {"role": "user", "content": "退款多久到账?"},
    {"role": "assistant", "content": "审核通过后,通常会在 1 至 5 个工作日内原路退回。"}
  ]
}

使用 JSONL 时,每条完整 JSON 记录占一行。数据整理时应注意:

  • 答案正确,表达风格一致;
  • 去除重复、乱码和互相矛盾的样本;
  • 训练数据应覆盖真实输入的不同说法;
  • 留出约 5%~10% 作为验证集;
  • 先用少量高质量数据验证流程,再逐步扩大规模。

3. 选择基础模型

优先选择已经具备目标语言和基础任务能力的 Instruct 模型。模型越大不一定越合适,还要考虑许可证、显存、推理速度和最终部署环境。

训练一般从 Hugging Face/Safetensors 模型开始,而不是直接拿量化 GGUF 继续微调。模型与数据必须使用匹配的聊天模板,否则可能出现角色标签泄漏、重复生成或停止符失效。

4. 设置 LoRA 参数

一套适合初次实验的起始参数如下:

参数 建议起点 说明
load_in_4bit true 启用 QLoRA,降低显存占用
r 16 LoRA Rank;复杂任务可尝试 32
lora_alpha 1632 控制 LoRA 更新强度
lora_dropout 0 Unsloth 优化配置;过拟合时可调整
max_seq_length 2048 应结合训练样本长度和显存设置
learning_rate 2e-4 普通 LoRA/QLoRA 的常见起点
num_train_epochs 1~3 训练过多容易记忆数据

LoRA 通常应用到注意力和 MLP 的主要线性层:

target_modules = [
    "q_proj", "k_proj", "v_proj", "o_proj",
    "gate_proj", "up_proj", "down_proj",
]

具体参数应通过验证结果调整,不能只观察训练损失。Unsloth 的 LoRA 参数指南提供了更详细的解释。

5. 训练、评估并迭代

训练结束后,使用微调前相同的测试集进行比较,同时增加训练集中未出现过的表达方式。重点观察:

  • 目标任务的正确率是否提高;
  • 通用能力是否明显下降;
  • 是否出现固定套话、过度拒答或重复输出;
  • 输出格式和风格是否稳定;
  • 验证集损失是否开始上升。

如果效果不足,可以检查数据覆盖范围、聊天模板、学习率、Rank 和训练轮数;如果模型只是复述训练样本,则应减少轮数、补充数据或增加正则化。调参后重新与基线比较,直到满足目标。

保存与部署

训练完成后通常保留三种产物:

  1. LoRA Adapter:体积最小,但推理时需要原始基础模型;
  2. 合并后的 Safetensors:适合 Transformers、vLLM 或后续继续处理;
  3. 量化 GGUF:适合 Ollama、LM Studio 和 llama.cpp 本地部署。

如果只保存 GGUF,后续继续训练会比较困难。因此建议至少保留 LoRA Adapter、tokenizer、训练配置、基础模型名称和数据版本;有足够存储空间时,再保留合并后的高精度 Safetensors。

常见误区

微调等于给模型添加知识

微调更擅长改变行为、格式和表达方式。对于频繁更新、必须可追溯的事实,RAG 通常更合适。

训练损失越低越好

损失持续下降不代表泛化能力持续提高。模型可能只是在记忆训练集,因此必须保留独立验证数据,并进行人工测试。

直接使用 GGUF 训练

GGUF 主要面向推理。常规 Unsloth LoRA 流程应使用其支持的 Hugging Face 模型或 Safetensors 权重,训练后再导出 GGUF。

忽略聊天模板

不同模型使用不同的角色标记、停止符和特殊 Token。训练和推理模板不一致,会直接影响模型输出。

总结

Hugging Face 负责模型与数据的发现和分发,Unsloth 提供低成本的训练与导出能力;Safetensors 更接近训练和 GPU 推理生态,GGUF 更接近本地量化部署。显存有限时,可以从 4-bit QLoRA、Rank 16、1~3 个 Epoch 开始,但最终效果主要取决于数据质量、聊天模板和评估方法。

完整实践可以从 Unsloth 官方教程开始,并优先保存可继续训练的 Adapter 或 Safetensors,再按部署需要生成 GGUF。