LLaMA-Factory 微调学习文档
目标读者:第一次接触大模型微调的人。 实践环境参考:阿里云 PAI-DSW(A10 24GB / MI300X 192GB)+ LLaMA-Factory + Qwen 系列。 读完后你应该能:看懂训练参数在干什么、跑一次 LoRA 微调、判断训练结果好不好。
一、先搞清楚:微调到底在干什么
大模型(如 Qwen)预训练时学到的是"通用知识",但它不一定懂你的私有场景(比如扮演某个角色、回答你们公司的业务问题)。
微调 = 在预训练模型的基础上,用你自己的小数据集再训练一会儿,让它学会你想要的风格或知识。
常见三种方式(按成本从低到高):
| 方式 | 原理 | 显存需求 | 适合场景 |
|---|---|---|---|
| LoRA(推荐新手) | 冻结原模型,只训练少量插入的"小矩阵" | 很低,24GB 可调 9B 模型 | 绝大多数场景 |
| QLoRA | 把原模型量化到 4bit 再做 LoRA | 更低 | 显存严重不足时 |
| 全参微调 | 整个模型所有参数都训练 | 极高,需要多卡大显存 | 有充足算力、改动很大时 |
新手直接用 LoRA 就对了,效果和全参差距不大,成本低得多。
二、数据集准备(比参数更重要)
数据质量决定微调上限,参数只决定下限。
2.1 两种常见格式
Alpaca 格式(指令 → 回答):
[
{
"instruction": "你叫什么名字?",
"input": "",
"output": "我叫沐雪呀~"
}
]ShareGPT 格式(多轮对话,支持 system prompt):
[
{
"conversations": [
{"from": "system", "value": "你是沐雪,一个可爱的AI助手"},
{"from": "human", "value": "今天天气怎么样?"},
{"from": "gpt", "value": "我不太清楚你那边的天气呢,不过心情好最重要啦!"}
]
}
]2.2 注册数据集
把 JSON 文件放到 LLaMA-Factory 的 data/ 目录,然后在 data/dataset_info.json 里登记:
{
"my_dataset": {
"file_name": "my_data.json",
"formatting": "alpaca",
"columns": {"prompt": "instruction", "query": "input", "response": "output"}
}
}之后训练时 dataset: my_dataset 就能用了。
2.3 数据量建议
- 几百条高质量数据就能改变模型的"风格"
- 几千条可以教它一个领域的知识
- 与其堆量,不如保证每一条都正确、风格一致
三、核心训练参数详解
LLaMA-Factory 支持三种用法:WebUI(llamafactory-cli webui)、命令行、YAML 配置文件。参数都一样,下面按"必懂 → 进阶"分组讲。
3.1 模型与数据相关(必须理解)
model_name_or_path: Qwen/Qwen3.5-9B # 模型路径(本地目录或 HuggingFace/ModelScope 名称)
trust_remote_code: true # Qwen 等模型需要
template: qwen3_8 # ⚠️ 对话模板,必须和模型匹配!选错了模型输出会乱
dataset: my_dataset # 训练用数据集(在 dataset_info.json 里登记的名字)
cutoff_len: 2048 # 每条样本最大长度(token 数),越长越慢越吃显存template 是新手第一大坑
template 决定"提示词怎么拼"。如果 template 和模型不匹配,模型会答非所问。Qwen3.5 用 qwen3_8 模板(实测),其他模型去 LLaMA-Factory 源码 src/llamafactory/data/template.py 里找。
cutoff_len 建议
先看一眼你数据最长一条大概多少字,设成"最长样本 + 一点余量"即可。设太大浪费显存,设太小会截断数据。
3.2 训练量相关(决定训练多久)
per_device_train_batch_size: 2 # 每张卡一次同时算几条样本。越大越快但越吃显存
gradient_accumulation_steps: 8 # 梯度累积:攒 8 次再更新一次参数
num_train_epochs: 3.0 # 全部数据过几遍。小数据集 3~10,大数据集 1~3实际"批次大小"的计算
实际"批次大小" = batch_size × 累积步数 = 2 × 8 = 16。 显存不够时:优先减 batch_size,加累积步数,效果基本不变。
3.3 学习率相关(决定训练稳不稳)
learning_rate: 5.0e-5 # LoRA 常用 5e-5 ~ 1e-4;全参微调要小得多(1e-5 左右)
lr_scheduler_type: cosine # 学习率从高慢慢"余弦"降下来
warmup_ratio: 0.03 # 前 3% 步数用很小的学习率"热身",防止一开始就把模型带偏学习率是最重要的超参数
太大 → loss 震荡/模型变傻;太小 → 训练不动。LoRA 用 1e-4 或 5e-5 起步,基本不用改。
3.4 LoRA 专属参数
finetuning_type: lora # 微调方式
lora_rank: 8 # 秩:插入矩阵的"容量"。8 够用,16/32 效果更强但更吃显存
lora_alpha: 16 # 缩放系数,经验上设为 rank 的 2 倍
lora_dropout: 0.1 # 随机丢弃,防过拟合
lora_target: all # 对哪些层做 LoRA,"all" 即全层(推荐)rank 的取舍
rank 越大"学到的改动"越多,但也越容易过拟合。教风格:rank 8;教大量知识:可以到 32/64。
3.5 显存优化相关
bf16: true # 用半精度训练,省一半显存,现代显卡(A10/MI300X)都支持
gradient_checkpointing: true # 用时间换显存,省 30%+ 显存,训练稍慢显存不够(OOM)时的减负顺序
- 减
per_device_train_batch_size(最小减到 1) - 减
cutoff_len - 开
gradient_checkpointing - 还不够 → 换 QLoRA(加
quantization_bit: 4)
3.6 保存与日志
output_dir: saves/qwen3.5-lora-v1 # 输出目录
logging_steps: 10 # 每 10 步打印一次 loss
save_steps: 500 # 每 500 步存一次 checkpoint
save_total_limit: 2 # 最多保留 2 个 checkpoint,防止硬盘爆
plot_loss: true # 训练完自动画 loss 曲线图(强烈建议开着)
eval_strategy: steps # 按步数做验证
eval_steps: 500 # 每 500 步在验证集上算一次 eval_loss
val_size: 0.05 # 从训练数据里划 5% 出来做验证集3.7 一份完整可跑的 LoRA 配置(YAML)
保存为 train_lora.yaml,运行 llamafactory-cli train train_lora.yaml:
### 模型
model_name_or_path: Qwen/Qwen3.5-9B
trust_remote_code: true
template: qwen3_8
### 方法
stage: sft
do_train: true
finetuning_type: lora
lora_rank: 8
lora_alpha: 16
lora_dropout: 0.1
lora_target: all
### 数据
dataset: my_dataset
cutoff_len: 2048
val_size: 0.05
### 训练
per_device_train_batch_size: 2
gradient_accumulation_steps: 8
num_train_epochs: 3.0
learning_rate: 5.0e-5
lr_scheduler_type: cosine
warmup_ratio: 0.03
bf16: true
gradient_checkpointing: true
### 验证与保存
eval_strategy: steps
eval_steps: 500
output_dir: saves/qwen3.5-lora-v1
logging_steps: 10
save_steps: 500
save_total_limit: 2
plot_loss: true四、训练结果评估说明
训练跑完 ≠ 训练成功。评估分三个层次:看 loss 曲线 → 算量化指标 → 人工试用。
4.1 第一层:看 loss 曲线(最直观)
训练日志和 output_dir/training_loss.png 里可以看到:
| 现象 | 诊断 | 处理 |
|---|---|---|
| 训练 loss 和验证 loss 都持续下降后趋平 | ✅ 理想状态 | 可以收工 |
| 训练 loss 还在降,验证 loss 开始回升 | ❌ 过拟合(把数据背下来了) | 减 epoch、减 rank、加数据、加 dropout |
| 训练 loss 降得很慢或不降 | 欠拟合 / 学习率太小 | 加 epoch、调大学习率、加大 rank |
| loss 剧烈震荡 | 学习率太大或 batch 太小 | 调小学习率、加大梯度累积 |
| loss 一路降到接近 0 | ⚠️ 可能在背答案 | 检查数据是否重复、验证集是否泄漏进训练集 |
关键原则
决定好坏的是验证集(eval_loss),不是训练集(train_loss)。训练集上的好成绩没有说服力。
4.2 第二层:量化指标
① perplexity(困惑度)
模型对文本的"迷惑程度",越低越好。eval_loss 和 perplexity 的关系:
perplexity = e^(eval_loss)例如 eval_loss = 2.0 → perplexity ≈ 7.4。它适合对比:微调后的困惑度比微调前低,说明模型确实更适应你的数据了。但没有绝对好坏标准,只能自己和自己比。
② 用 LLaMA-Factory 内置评测跑公开基准
适合衡量模型通用能力有没有被"微调伤害":
### eval.yaml
model_name_or_path: Qwen/Qwen3.5-9B
adapter_name_or_path: saves/qwen3.5-lora-v1 # 指向你的 LoRA 权重
template: qwen3_8
task: mmlu_test # 可选:mmlu_test / ceval_test / cmmlu_test 等
few_shots: 5
batch_size: 4llamafactory-cli eval eval.yaml这些基准测的是通用能力
知识、推理类的公开基准测不出"你的模型有没有学会你的风格"。角色扮演类的微调主要还是靠人工测试。
③ 生成质量指标(ROUGE / BLEU)
适合"摘要、翻译"这类有标准答案的任务,衡量生成文本和参考答案的重合度。对话/角色类任务参考答案不唯一,这类指标意义不大。
4.3 第三层:人工试用(最终标准)
微调的目标最终是"人觉得好用",所以一定要亲自和模型对话测试:
- 导出合并模型(LoRA 权重要合并回原模型才能方便部署):
### export.yaml
model_name_or_path: Qwen/Qwen3.5-9B
adapter_name_or_path: saves/qwen3.5-lora-v1
template: qwen3_8
export_dir: models/qwen3.5-muice
export_size: 5 # 单个分片最大 5GB
export_device: cpu
export_legacy_format: falsellamafactory-cli export export.yaml- 起对话测试(最快方式,不用先部署 vllm):
llamafactory-cli chat --model_name_or_path models/qwen3.5-muice --template qwen3_8测试用例要覆盖三类:
- ✅ 该会的:训练数据里同类问题,确认学会了
- ✅ 不该变的:通用问题(写代码、常识问答),确认没把原模型"调傻"
- ✅ 不该会的:问训练数据之外的事情,确认它没有"死记硬背",还能正常拒答或泛化
也可以部署成 API 用 curl/脚本批量测试(如用 vLLM 起服务后批量请求),注意请求要带上和训练时一致的 system prompt。
4.4 评估 Checklist(照着勾)
五、新手常见坑(血泪经验)
- template 选错 → 模型输出混乱、重复、答非所问。Qwen3.5 实测用
qwen3_8。 - 版本兼容坑:新模型对依赖版本敏感。实测:
transformers 5.8、datasets 4.0、trl 0.24是一组能跑通 Qwen3.5 的组合;qwen3_5模型架构还需要额外安装fla(flash-linear-attention)包。装环境时优先参考 LLaMA-Factory 仓库的requirements.txt。 - 数据里混入了脏数据(空回答、乱码、格式错)→ loss 异常或效果差。训练前先抽查几条。
- 忘了带 system prompt 测试 → 如果训练数据带 system prompt,推理时不带,效果会差很多。
- checkpoint 磁盘爆了 → 设
save_total_limit。 - DSW 1 小时无操作自动关停 → 长时间训练注意浏览器保活,或用脚本保持会话活跃。
六、推荐学习路径
第 1 步:跑通 WebUI(llamafactory-cli webui),用默认参数对一个小模型做 LoRA
第 2 步:读懂训练日志里的 loss / learning_rate / grad_norm
第 3 步:换成自己的 50~100 条数据,观察效果差异
第 4 步:学写 YAML 配置,脱离 WebUI 用命令行训练
第 5 步:导出模型 → vllm 部署 → 脚本批量测试
第 6 步:进阶——调节 rank/lr 做 2~3 组对比实验,体会超参数的影响官方资源
- 官方文档:https://llamafactory.readthedocs.io/zh-cn/latest/
- 官方仓库:https://github.com/hiyouga/LLaMA-Factory(
examples/目录有大量现成配置)
相关文章
- 大模型微调完全指南 —— 微调原理、场景决策、显存估算、数据工程与效果验证的系统讲解
- vLLM 大模型部署指南:原理、显存与选型 —— 微调产物的推理部署引擎怎么选、怎么调参
- Qwen3.8-27B-FP8 部署实录:AMD MI300X 上跑通 vLLM —— 推理服务部署实测记录