78-LLaMA-Factory微调实战-零代码训练-LoRA参数配置-训练曲线解读
【78.Python+AI】用LLaMA-Factory一条命令开始微调:零代码也能做模型训练
📖 文章简介: 本文手把手教你用LLaMA-Factory完成第一次模型微调——这是目前最流行的零代码微调框架,支持100+开源模型,自带WebUI。文章覆盖完整链路:环境搭建(conda+CUDA避坑)、数据集放置与注册(dataset_info.json的正确写法)、LoRA关键参数配置(学习率/rank/epoch的推荐起点)、WebUI可视化训练操作,以及训练曲线解读(什么样的loss曲线算健康、什么情况说明过拟合)。配以Mermaid流程图展示从数据到模型的完整训练链路,适合刚准备好数据集、想用最短路径跑通第一次微调的开发者。

🎬 个人主页: 源码骑士
❄ 专栏传送门: 《Android开发基础》《python基础课程》
⭐️热衷从源码视角拆解技术底层原理,将复杂架构讲得通俗易懂
🎬 源码骑士的简介:
5年Android Framework系统开发经验,曾主导多项系统级性能优化专项
技术栈覆盖Android系统全链路(Binder/Handler/AMS/WMS/启动流程)及Java后端全家桶(Spring + MyBatis + Redis + Oracle)
累计产出原创技术文章100+篇,文章以流程图为特色,被读者评价为"看一篇胜过啃一周源码"
导入语
数据集洗好了,LoRA原理也懂了——但你打开transformers文档想手写训练脚本,迎面就是TrainingArguments、DataCollator、gradient_checkpointing一堆概念。
其实不用。LLaMA-Factory 把这一切封装成了一个WebUI:填几个参数、点一下开始,训练就跑起来了。这篇文章就带你走通从安装到出模型的全流程,顺便教会你看懂那条loss曲线到底在说什么。
1 ~> 训练链路总览
2 ~> 环境搭建
2.1 安装(conda隔离,避免污染主环境)
# 创建独立环境
conda create -n llama python=3.10 -y
conda activate llama
# 安装PyTorch(按你的CUDA版本去官网选)
pip install torch --index-url https://download.pytorch.org/whl/cu121
# 安装LLaMA-Factory
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
# 验证安装
llamafactory-cli version
2.2 常见安装坑
| 坑 | 现象 | 解决 |
|---|---|---|
| CUDA版本不匹配 | torch.cuda.is_available() 返回False |
重装对应CUDA版本的torch |
| flash-attn编译失败 | 卡在setup.py半天 | 可先不装,框架会自动用普通attention |
| 网络拉不动模型 | from_pretrained超时 | 设置 HF_ENDPOINT=https://hf-mirror.com |
3 ~> 数据集注册
3.1 放置文件
LLaMA-Factory/
└─ data/
├─ dataset_info.json # 数据集注册表
└─ my_service_data.json # 你的数据集文件
3.2 在 dataset_info.json 中注册
Alpaca格式:
"my_service_data": {
"file_name": "my_service_data.json",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output"
}
}
ShareGPT格式:
"my_service_data": {
"file_name": "my_service_data.json",
"formatting": "sharegpt",
"columns": {
"messages": "conversations"
},
"tags": {
"role_tag": "from",
"content_tag": "value",
"user_tag": "human",
"assistant_tag": "gpt"
}
}
90%的"数据集加载失败"都是这里的字段名映射写错了——注册表的作用是告诉框架"你的JSON里哪个字段对应指令、哪个对应回答"。
4 ~> 启动训练
4.1 方式一:WebUI(推荐新手)
llamafactory-cli webui
浏览器打开 http://localhost:7860,依次配置:
模型名称: Qwen2-7B-Instruct
微调方法: lora
数据集: my_service_data
学习率: 1e-4
训练轮数: 3
LoRA秩: 16
量化等级(QLoRA): 4 ← 显存小于24G时选上
点击"开始",下方会实时显示loss曲线和训练日志。
4.2 方式二:命令行(适合远程服务器)
llamafactory-cli train \
--stage sft \
--model_name_or_path Qwen/Qwen2-7B-Instruct \
--dataset my_service_data \
--finetuning_type lora \
--lora_rank 16 \
--lora_target all \
--learning_rate 1e-4 \
--num_train_epochs 3.0 \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 4 \
--quantization_bit 4 \
--output_dir saves/qwen2-7b/lora/sft \
--fp16
4.3 参数推荐起点与调整逻辑
| 参数 | 推荐起点 | 什么时候调 |
|---|---|---|
learning_rate |
1e-4 | loss不降→调大到2e-4;loss震荡→调小到5e-5 |
num_train_epochs |
3 | 数据<500条→3~5;数据>5000条→2 |
lora_rank |
16 | 效果不足→32;显存不够→8 |
batch_size × grad_accum |
4×4=16 | 有效批量保持16~32,显存不够就调小batch、加大accum |
5 ~> 训练曲线解读
5.1 三种典型的loss曲线
健康曲线:
loss
2.0 ┤╮
1.5 ┤╰╮
1.0 ┤ ╰╮
0.5 ┤ ╰╮╭─
0.0 ┼────────────→ step
快速下降后趋于平稳,最终稳定在一个非零值
问题曲线一:loss不降
2.0 ┤──────────
一条平线 → 学习率太小 / 数据没加载对(先检查这个!)
问题曲线二:loss降到接近0
0.0 ┤____
→ 过拟合预警:模型在背答案,泛化能力差
→ 减少epoch、增大数据量、或加大dropout
5.2 除了loss还要盯什么
| 指标 | 健康表现 | 异常信号 |
|---|---|---|
| 显存占用 | 稳定在峰值以下 | 持续增长→可能OOM前兆 |
| 训练速度(it/s) | 稳定 | 突然变慢→检查是否触发了swap |
| 学习率曲线 | 按scheduler平滑衰减 | 一直恒定→scheduler没配置 |
5.3 训练中试一把
不要等到训练结束——每保存一个checkpoint就试一次:
llamafactory-cli chat \
--model_name_or_path Qwen/Qwen2-7B-Instruct \
--adapter_name_or_path saves/qwen2-7b/lora/sft/checkpoint-500
人工测试的黄金问题集: 从训练集抽5条(检验是否学会)+ 从业务中想5条没训过的(检验是否泛化)。训过的好、没训过的差→过拟合;两者都好→可以继续;两者都差→数据或参数有问题。
6 ~> 训练完成后的产出
saves/qwen2-7b/lora/sft/
├─ adapter_model.safetensors # LoRA权重(几十MB,这才是核心产物)
├─ adapter_config.json # LoRA配置
└─ checkpoint-*/ # 中间检查点
# 后续两条路:
# 1. 直接挂载适配器推理(灵活,可换适配器)
# 2. 合并进基座模型再导出(部署方便,见第83篇)
思考 && 总结
- LLaMA-Factory把微调的门槛降到了"会填表单": 但前提是数据集已经准备好——框架解决的是"怎么训",解决不了"用什么训"。
- dataset_info.json是新手第一大坑: 字段映射写错,loss就是一条平线——排查永远先查数据加载。
- 参数用推荐起点跑通,再基于loss曲线调: 不要训练前纠结参数,曲线的反馈比任何教程都准。
- loss降到接近0不是好事: 那是模型在背题。微调追求的是"学会模式",不是"记住答案"。
- 中间checkpoint就要测: 训练3小时才发现方向错了,和30分钟就发现,是完全不同的成本。
第一次微调的目标不是"训出完美模型",而是"跑通数据→训练→验证的完整闭环"。闭环通了,后面都是迭代优化的事。
结尾
各位小伙伴,本文的内容到这里就全部结束了,源码骑士在这里再次感谢您的阅读!
源码骑士 — Android Framework & 全栈开发
👀 关注:跟博主一起从源码视角深耕底层原理,见证每一次成长
❤️ 点赞:让优质内容被更多人看见,让知识传递更有力量
⭐ 收藏:把核心知识点存好,在需要时随时查、随时用
💬 评论:分享你的经验或疑问,评论区一起交流避坑
🔄 一键四连:不要忘记给博主"一键四连"哦!
🗡️ 寄语:技术之路难免有困惑,但同行的人会让前进更有方向
结语:恭喜,到这里你已经完成了从数据到模型的第一次微调闭环。下一篇深入QLoRA原理——搞清楚4-bit量化为什么能省75%显存而效果几乎无损。不要忘记给博主"一键四连"哦!
更多推荐



所有评论(0)