LLM LoRA微调全套基础知识点
一、核心基础概念篇
1. Loss 损失函数
1)定义
Loss = 模型生成文字 和 标准答案文字 的差距得分,分数越高,模型越不准。
大模型微调默认使用交叉熵损失 CrossEntropyLoss。
训练只计算 assistant 回复部分的loss,用户提问、系统提示词不参与损失计算。
2)loss数值分级(1.5B/1.7B轻量模型通用标准)
- 5~7:初始状态,模型完全不懂任务,乱写,刚启动训练必出现
- 3~4:初步学习,能看懂指令,但格律、句式、逻辑经常出错(你当前阶段)
- 1.8~2.5:合格区间,生成内容稳定贴合你的数据集风格
- 1.0~1.7:拟合优秀,专属风格明显,写诗工整
- <1.0:严重过拟合,只会背诵训练集,陌生主题完全写崩
3)两种loss区分
- Train loss 训练损失
在训练数据上计算,代表模型对见过的数据掌握程度,震荡、下降都正常。 - Val loss / Valid loss 验证损失
单独拆分出没参与训练的样本,用来判断泛化能力: - train loss下降 + val loss同步缓慢下降:正常学习
- train loss持续走低,val loss开始反弹:过拟合,立刻停止训练
4)loss震荡原因(你多次遇到)
- 学习率固定、无衰减
- 数据集样本少、风格单一
- batch size太小,单批次数据波动大
2. Learning Rate 学习率 --learning-rate
1)作用
控制每一轮训练更新模型参数的幅度,相当于下山找谷底的步长。
示例 1e-4 = 0.0001,2e-4 = 0.0002。
2)大小利弊
- 学习率过大(≥3e-4):步子太大,loss来回横跳、无法收敛,甚至越训越高
- 学习率过小(≤5e-5):学习速度极慢,上千轮loss下降微弱,浪费时间
- 推荐LoRA区间:1e-4 ~ 2e-4
3)学习率调度 --lr-schedule cosine
固定lr全程步长不变,后期容易震荡;
cosine余弦衰减:前期大步快速学习,训练后半段自动缩小步长,loss更容易平稳走低,解决震荡。
3. LoRA 微调(你全程在用,核心轻量化方案)
1)什么是LoRA
全称 Low-Rank Adaptation,低秩适配微调。
不改动原始大模型权重,只训练两层极小的辅助矩阵,训练完成保存几十MB的适配器文件。
优势:内存占用极低,Mac Air 4bit量化下仅2~4GB内存,不用高端显卡。
2)关键参数 --num-layers(mlx-lm中代表LoRA Rank)
- rank=8:内存占用最低,学习能力弱,适合极小数据集
- rank=16:均衡通用,诗词微调首选,兼顾效果与内存
- rank=32:拟合能力更强,内存占用小幅上升
3)LoRA文件结构(推理报错根源)
训练输出文件夹 adapters 必须包含两个文件才能推理:
adapter_config.json:LoRA超参配置,推理必须读取adapters.safetensors:最新一轮权重快照
每200/500轮保存的000xxx_adapters.safetensors只是单独权重文件,缺少配置,不能直接单独加载推理。
4)两种微调对比
- LoRA微调(你在用):低内存、速度快、适合本地Mac,仅训练少量参数
- 全参数微调 Full Fine-tune:修改模型全部权重,1.7B模型需要20GB+内存,Mac Air完全跑不动,不推荐
4. 量化 -q 4bit量化
1)作用
把模型权重从高精度浮点压缩到4bit存储,内存直接减少70%左右。
你本地转换命令 mlx_lm.convert -q 就是开启4bit量化。
2)优缺点
- 优点:Mac Air可跑1.7B模型,峰值内存仅2~3GB,速度流畅
- 缺点:模型基础能力轻微下降,微调后可弥补差距
3)权重类型区分
- 原生HF FP16:完整精度,体积巨大,本地转换前原始文件
- MLX 4bit量化:M芯片专用,mlx-lm训练/推理最优
- GGUF:llama.cpp/Ollama专用,不适合MLX微调
二、训练命令通用参数基础(mlx-lm)
1. 训练相关参数(mlx_lm.lora)
--iters:总迭代轮数,一轮代表一个batch数据
小诗词数据集推荐600~1000,超过1200极易过拟合--batch-size:单次同时输入多少条样本
Mac 16GB推荐2,8GB只能设1--grad-accumulation-steps梯度累积
内存不足时使用,batch-size=2 + grad-accumulation-steps=2等效batch=4,不增加内存占用--save-every:每多少轮保存一次快照权重--steps-per-eval:每多少轮计算一次val loss,监控过拟合
2. 推理生成参数(mlx_lm.generate)
--temp温度,控制生成随机性- 0.1~0.5:文风严谨、格律规整,写诗首选
- 0.6~1.0:创意更强,容易出现不合律句子
--top-p核采样,默认0.9即可,不用改动--max-tokens:最大输出字数,诗词200~300足够--use-default-chat-template
强制使用Qwen官方对话模板,和训练数据集格式对齐,不加这条生成会严重跑偏
3. 工具参数区分(高频踩坑点)
--resume-adapter-file:仅训练lora命令可用,generate推理不支持- 推理加载历史快照权重方案:复制快照权重覆盖文件夹内
adapters.safetensors
三、数据集基础(poetry_dataset)
1. 标准格式 Qwen messages 模板
微调必须统一对话格式,否则loss居高不下、训练无效
{
"messages": [
{"role": "system", "content": "你是专业古典诗词创作助手,严守词牌格律"},
{"role": "user", "content": "请写一首秋思主题七言绝句"},
{"role": "assistant", "content": "完整诗词正文"}
]
}2. 训练集/验证集划分
- train.jsonl:用来更新模型权重,占90%数据
valid.jsonl:仅用来计算val loss,不参与权重更新,判断过拟合
3. 数据集大小影响
样本过少:loss持续震荡,泛化差;
样本充足:loss平稳下降,陌生指令也能正常生成诗词。
四、训练硬件与内存相关
- Peak mem 峰值内存:训练全程占用最大内存,你稳定2GB左右,M系列统一内存无压力
- Tokens/sec:每秒处理文字token数量,数值越高速度越快,300左右属于Mac Air正常水平
- 梯度检查点
--grad-checkpoint:牺牲少量速度,大幅降低内存占用,8GB内存必加
五、训练正常/异常现象判断
正常训练表现
- 初始val loss 5~7,持续缓慢下降
- train loss整体下行,小幅震荡
- val loss同步下行,无持续反弹
异常情况&解决方案
- loss全程居高不下、不下降
原因:数据集格式错误、学习率不合适、对话模板不匹配 - loss暴跌后突然飙升
原因:学习率过大,模型发散,降低lr并开启cosine衰减 - train loss很低,val loss持续走高
原因:过拟合,减少iters、扩充数据集、降低LoRA rank - 内存溢出OOM
开启4bit量化、减小batch、开启梯度检查点、梯度累积
六、完整学习流程闭环(你的项目链路)
- 数据源:shi-ci.cn 获取干净完整结构化诗词原始文本
- 数据集制作:poetry_dataset 生成标准messages格式jsonl训练文件
- 模型准备:转换HF权重为MLX 4bit量化模型
- LoRA本地微调:M系列Mac Air使用mlx-lm训练,监控train/val loss
- 推理测试:加载LoRA适配器,输入诗词指令生成专属作品
版权声明:本文为原创文章,版权归 戴老师的博客 所有,转载请联系博主获得授权。
本文地址:https://www.tushu.info/archives/llm-lora-training-basics.html
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。