使用 LLaMA-Factory 进行开源大模型 LoRA 微调
前言
前面那篇微调入门讲了概念和决策框架。这篇是纯操作——用 LLaMA-Factory 这个工具,不用写多少代码,就能完成 LoRA 微调。
选 LLaMA-Factory 的原因是它把模型加载、数据预处理、训练配置、评估、导出这些步骤全封装好了,支持 Web UI 操作,对新手友好。
一、端到端微调工程流
flowchart LR
subgraph Prep["1. 数据准备与注册"]
D["业务指令数据 (my_data.json)"] --> Reg["注册至 dataset_info.json"]
Base["基座模型 (ModelScope / HF)"] --> Reg
end
subgraph Train["2. LLaMA-Factory SFT"]
Reg --> Engine["LoRA / QLoRA 训练引擎<br/>(Web UI / CLI)"]
Engine --> Monitor["实时 Loss 与验证集指标监控"]
Monitor --> LoRAOut["产出 LoRA Adapter 权重 (几 MB~几十 MB)"]
end
subgraph Deploy["3. 验证、合并与部署"]
LoRAOut --> Eval["动态挂载 PEFT 效果对比"]
Eval --> Export["llamafactory-cli export<br/>(LoRA 与基座融合成完整模型)"]
Export --> GGUF["导出 GGUF 量化文件 → Ollama 本地运行"]
Export --> HF["导出 Safetensors 精度 → vLLM 高并发服务"]
end
二、安装与国内镜像配置
1. 基础环境搭建
1 | # 推荐使用 Conda 隔离 Python 3.10 / 3.11 环境 |
2. 国内开发者网络避坑(重要)
在国内直接从 Hugging Face 下载模型或数据集极易发生超时失败(ConnectionResetError)。LLaMA-Factory 内置原生支持阿里云 ModelScope(魔搭社区),只需在终端设置环境变量即可自动切换为国内高速源:
1 | # 设置优先从魔搭社区拉取模型权重与数据集 |
三、准备数据
数据格式(Alpaca 格式)
在 data/ 目录下创建 my_data.json:
1 | [ |
然后在 data/dataset_info.json 中注册:
1 | { |
数据量建议
- 最少 100 条才能看到风格与格式的初步收敛
- 300-1000 条能获得非常稳定的特定任务专业表现
- 1000-3000 条适合复杂规则与深度领域任务
四、开始微调(Web UI 方式)
1 | llamafactory-cli webui |
浏览器打开 http://localhost:7860。
关键配置步骤:
- 模型选择 → 选你要微调的基座模型,如
Qwen2.5-7B-Instruct - 微调方法 → 选
lora,量化等级选none(显存不足 20G 选 4-bit QLoRA) - 数据集 → 选择上一步注册的
my_linux_data - 超参数设置:
- 学习率:
5e-5(7B 模型的推荐标准值) - 训练轮数(epochs):
3(先试 3 轮观察收敛趋势) - 批大小(batch_size):
4(显存受限可调为 2 或 1) - 梯度累积(gradient_accumulation):
4(等效 batch = 4×4 = 16) - 最大长度(max_length):
1024
- 学习率:
- LoRA 参数:
- rank (r):
8或16(能力与显存平衡点) - alpha:
16或32(通常设为 rank 的 2 倍) - target:
all(覆盖 q, k, v, o, gate, up, down 全线性投影层)
- rank (r):
- 点击”开始训练”,页面下方将实时绘制 Loss 下降曲线图。
五、命令行方式微调(CLI 无头生产模式)
适合在云端无 GUI 算力服务器上挂后台执行:
1 | llamafactory-cli train \ |
训练完成后,./output/linux-expert 下会生成仅几十 MB 的轻量 LoRA 权重。
六、测试微调后的模型(严谨验证)
微调后先不要直接合并原模型,通过 PEFT 动态挂载进行即时测试对比:
1 | import torch |
七、合并并导出模型(服务化上线)
测试满意后,可将 LoRA 增量矩阵参数直接融入原模型底座,彻底消除旁路计算开销,便于后续用 vLLM 或 Ollama 部署:
1. 导出完整 Safetensors 模型(供给 vLLM / HuggingFace)
1 | llamafactory-cli export \ |
导出的 ./output/linux-expert-merged 是一个标准独立的 Safetensors 精度模型,无需再附带 PEFT 依赖,可直接由 vLLM 或 TGI 加载。
2. 导出 GGUF 格式并接入 Ollama
针对 Mac、笔记本或纯 CPU/边缘服务器,LLaMA-Factory 支持直接量化导出为 GGUF 格式:
1 | # 合并 LoRA 并直接量化导出为 GGUF 文件 (4-bit Medium 量化) |
导出成功后,在 ./output/linux-expert-gguf 文件夹下会生成 .gguf 量化权重文件。通过 Modelfile 即可一键拉起服务:
1 | # 1. 创建 Modelfile 指向 GGUF |
八、常见问题与工业级排错指南
1. 训练过程中 Loss 不下降或震荡:
- 学习率设置不合理:7B 推荐从
5e-5开始微调;若 Loss 剧烈跳跃,降至2e-5; - 数据质量异常:检查是否出现指令(instruction)与目标回答(output)错位、标签全空或存在大量乱码;
- 检查 warmup_ratio:建议设置
0.05 ~ 0.1,避免初始步数过冲导致梯度爆炸。
2. 训练时报 CUDA Out of Memory (OOM):
- 开启 4-bit 量化(QLoRA),基座模型显存占用立即降至 4GB 左右;
- 开启
--gradient_checkpointing(梯度检查点),以轻微计算重算为代价换取大量显存节约; - 将
per_device_train_batch_size设为 1 或 2,同时成倍提高gradient_accumulation_steps(保持总等效 Batch 不变); - 裁剪
max_length至 1024 或 512。
3. 评测过拟合(训练 Loss 极低,但业务提问回答生硬或死板):
- 减少训练轮数(垂直小数据集 2~3 个 Epochs 即可);
- 在 LoRA 模块中增加 Dropout 参数(如
--lora_dropout 0.05); - 扩展数据样本的多样性,改写相似表达。
4. 灾难性遗忘(微调后原有日常对话或推理能力丢失):
- 在当前运维数据集中,按 5%~10% 的比例混入高质量通用中英文开源问答集(如 Alpaca-CoT 数据);
- 避免全量微调,坚持使用低秩 LoRA(Rank 建议 8~16)。