如何用Unsloth保存和导出微调后的模型(含GGUF)
1. 引言
在大语言模型(LLM)的微调实践中,如何高效地保存、合并并导出训练成果是工程落地的关键环节。Unsloth 作为一个专注于提升 LLM 微调效率的开源框架,不仅支持 2 倍加速训练与 70% 显存降低,还提供了丰富的模型导出能力,包括 FP16/4bit 合并权重、LoRA 适配器保存以及 GGUF 格式转换。
本文将系统性讲解如何使用 Unsloth 完整保存和导出微调后的模型,涵盖:
- LoRA 模型的完整保存流程
- 权重合并与量化存储(FP16 / 4bit)
- 导出为 GGUF 格式以支持 Ollama 等 CPU 推理框架
- 仅保存 LoRA 适配器用于后续增量训练
通过本指南,你将掌握从训练结束到模型部署前的所有关键步骤,确保模型可复现、可迁移、可部署。
2. 环境准备与验证
2.1 检查环境配置
在进行模型保存之前,请确认已正确激活unsloth_env并安装相关依赖:
conda env list conda activate unsloth_env python -m unsloth若输出类似以下信息,则表示环境正常:
==((====))== Unsloth 2025.6.8: Fast Qwen2 patching...2.2 加载已完成微调的模型
假设已完成 LoRA 微调,需先加载原始基座模型和 tokenizer,并注入 LoRA 配置:
from unsloth import FastLanguageModel model, tokenizer = FastLanguageModel.from_pretrained( "your_base_model_path", # 如:Qwen/Qwen-1.5B load_in_4bit=True, device_map="auto", )然后加载训练过程中生成的 LoRA 权重:
model = FastLanguageModel.get_peft_model( model, r=16, target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], lora_alpha=16, lora_dropout=0, bias="none", use_gradient_checkpointing="unsloth", )最后加载训练好的适配器权重:
model.load_adapter("lora_model") # 假设保存路径为 lora_model/3. 模型保存策略详解
Unsloth 提供了多种模型保存方式,适用于不同场景需求。以下是四种主流保存模式及其适用场景。
3.1 保存完整合并模型(FP16 精度)
这是最常用的生产级保存方式,适合 GPU 部署或进一步推理优化。
model.save_pretrained_merged( save_directory="DeepSeekR1-1.5B-finetuned-fp16", tokenizer=tokenizer, save_method="merged_16bit" )✅ 优势:
- 保留全部微调效果
- 使用 FP16 精度,精度损失极小
- 可直接用于 Hugging Face 生态加载
⚠️ 注意事项:
- 文件体积较大(通常为原模型大小)
- 不支持跨设备低资源部署
3.2 保存量化合并模型(4-bit 精度)
当目标部署环境显存有限时,推荐使用 4-bit 量化版本,在保持较高性能的同时大幅压缩体积。
model.save_pretrained_merged( save_directory="DeepSeekR1-1.5B-finetuned-4bit", tokenizer=tokenizer, save_method="merged_4bit" )✅ 优势:
- 存储空间减少约 75%
- 支持低显存 GPU 或消费级设备运行
- 推理速度更快(得益于 GPTQ/NF4 优化)
⚠️ 注意事项:
- 存在轻微精度下降(一般 <5%)
- 不建议用于高精度任务(如医学诊断)
3.3 导出为 GGUF 格式(支持 Ollama / llama.cpp)
GGUF 是 llama.cpp 引擎使用的通用格式,支持纯 CPU 推理,非常适合边缘设备或无 GPU 环境。
(1)默认导出(Q8_0 量化)
平衡精度与性能的最佳选择:
model.save_pretrained_gguf("DeepSeekR1-1.5B-Q8_0", tokenizer)(2)自定义量化等级(更精细控制)
支持多种量化方法,常见选项如下:
| 量化类型 | 特点 | 适用场景 |
|---|---|---|
q4_k_m | 中等质量,良好性能 | 通用部署 |
q5_k_m | 高质量,稍慢 | 精度优先 |
q2_k | 极小体积,低质 | 资源极度受限 |
示例代码:
model.save_pretrained_gguf( "DeepSeekR1-1.5B-q4_k_m", tokenizer, quantization_method="q4_k_m" )✅ 优势:
- 支持 Windows/Linux/macOS CPU 推理
- 兼容 Ollama、llama.cpp、text-generation-webui
- 内存占用低,启动快
🧪 使用 Ollama 加载示例:
ollama run DeepSeekR1-1.5B-q4_k_m创建 Modelfile:
FROM ./DeepSeekR1-1.5B-q4_k_m.gguf TEMPLATE """{{ if .System }}<|system|> {{ .System }}<|end|> {{ end }}<|user|> {{ .Prompt }}<|end|> <|assistant|> """ PARAMETER temperature 0.7 PARAMETER top_p 0.9构建并运行:
ollama create mymodel -f Modelfile ollama run mymodel3.4 仅保存 LoRA 适配器(轻量级增量训练)
如果你计划继续对同一基座模型进行多轮微调,或希望节省存储空间,可以选择只保存 LoRA 参数。
# 保存 LoRA 权重 model.save_pretrained("lora_model") # 保存分词器 tokenizer.save_pretrained("lora_model")✅ 优势:
- 文件体积极小(通常 <100MB)
- 支持热更新、快速切换任务
- 易于版本管理与共享
🔁 后续加载方式:
model, tokenizer = FastLanguageModel.from_pretrained("base_model_path") model = FastLanguageModel.get_peft_model(model, r=16, target_modules=[...]) model.load_adapter("lora_model")4. 实践建议与避坑指南
4.1 不同保存方式对比表
| 保存方式 | 精度 | 大小 | 推理平台 | 是否需基座模型 | 适用场景 |
|---|---|---|---|---|---|
merged_16bit | FP16 | 大 | GPU | 否 | 高精度服务部署 |
merged_4bit | NF4/GPTQ | 中 | GPU | 否 | 低显存推理 |
GGUF (q4_k_m) | Int4 | 小 | CPU/GPU | 否 | 边缘设备、Ollama |
| LoRA Adapter | - | 极小 | GPU | 是 | 增量训练、A/B测试 |
4.2 关键实践建议
✅ 建议 1:优先使用save_pretrained_merged
除非有明确的轻量化需求,否则应优先导出合并模型,避免推理时动态合并带来的延迟和不确定性。
✅ 建议 2:GGUF 导出前务必测试生成质量
不同量化级别会影响输出稳定性,建议在导出后做简单问答测试:
pipe = pipeline("text-generation", model="path/to/gguf/model") print(pipe("解方程 (x + 2)^2 = 0.")[0]["generated_text"])✅ 建议 3:命名规范清晰区分版本
推荐采用如下命名规则:
{模型名}-{任务}-{精度}-{日期}.gguf # 示例: DeepSeekR1-1.5B-motor_selection-q4_k_m-20250708.gguf便于后期管理和部署。
❌ 避免错误:不要混合不同 LoRA 配置
加载 LoRA 时必须保证r,target_modules等参数与训练时一致,否则会报错或导致性能下降。
4.3 性能与资源消耗参考
以 Qwen-1.5B 模型为例,在 RTX 3060 Laptop GPU 上的表现:
| 操作 | 显存峰值 | 时间消耗 | 输出大小 |
|---|---|---|---|
save_pretrained_merged(fp16) | ~4.8 GB | ~90s | ~3.0 GB |
save_pretrained_merged(4bit) | ~4.5 GB | ~110s | ~1.1 GB |
save_pretrained_gguf(q4_k_m) | ~4.6 GB | ~150s | ~900 MB |
save_pretrained(lora) | ~3.6 GB | ~30s | ~80 MB |
💡 提示:GGUF 导出耗时较长,因其需遍历所有层进行量化编码。
5. 总结
本文系统介绍了如何利用 Unsloth 框架完成微调后模型的保存与导出全流程,覆盖了从常规合并到 GGUF 转换的多种方案。
核心要点回顾:
- FP16 合并模型:适用于高精度 GPU 推理场景,推荐作为主干模型发布格式。
- 4-bit 合并模型:在精度与资源间取得良好平衡,适合大多数生产环境。
- GGUF 格式导出:打通 CPU 推理链路,支持 Ollama 等流行工具,极大扩展部署灵活性。
- LoRA 适配器保存:适用于持续迭代训练,节省存储成本,便于多任务切换。
最佳实践路径建议:
graph TD A[完成微调] --> B{是否需要继续训练?} B -- 是 --> C[仅保存 LoRA 适配器] B -- 否 --> D{部署环境是否有 GPU?} D -- 有 --> E[导出 merged_16bit 或 merged_4bit] D -- 无 --> F[导出 GGUF 格式] E --> G[部署至 API 服务] F --> H[部署至 Ollama / llama.cpp]掌握这些模型导出技巧,你就能真正实现“一次训练,多端部署”的高效 AI 工程闭环。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。