想给模型做 LoRA 微调的人,卡住的地方通常不是代码,而是数据格式对不上、显存报错不知道调哪个参数、训完不知道怎么接回推理。这篇按「准备数据 → 起训 → 验证 → 推理上线」的顺序给一条能走的路径,并标出每一步什么情况下要换做法。
很多人以为 LoRA 微调的难点在代码,其实真正卡人的是三件事:数据格式对不上、显存报错不知道怎么调、训完不知道怎么接回推理。这篇按「准备数据 → 起训 → 验证 → 推理上线」的顺序走一遍,每步都标出什么情况下要换做法。
先明确一点:LoRA 不是万能药。如果你的目标只是让模型按固定格式输出,提示词和 RAG 往往就够用;只有当你要固定一种说话风格、或者让模型记住某个领域的判断逻辑时,微调才划算。筛选本身也值得花时间,具体算力开销和方案选择可以到 /tools/speed-test 对着当时的工具目录做判断。
第一步:把数据整理成训练器认的格式
格式这件事,必须先定任务形态再定字段结构。训练器读不到你想要的字段,报错通常发生在加载阶段,而不是训练中途,所以第一次跑之前先拿几条样本过一遍加载流程。
| 任务形态 | 典型字段 | 常见坑 |
|---|---|---|
| 单轮指令 | instruction / input / output | input 为空时字段缺失,部分框架要求补空串 |
| 多轮对话 | messages 数组,带角色标识 | 角色名写错、最后一条不是助手回复 |
| 纯文本续写 | 单条 text 字段 | 把问题和答案拼在一行没加分隔符,模型学不到边界 |
- 输入和输出必须成对,出现只有输入没有输出的样本要单独挑出来处理
- 标签字段名和配置里的名称逐字对照,大小写和复数都算不同
- 单条样本长度不要超过你实际会用的上下文上限,超长的先截断或拆开
- 清洗顺序建议:去重 → 删掉空输出和明显截断的样本 → 统一全半角和标点 → 再考虑加量
- 先留一份几十条的肉眼可读小样本集,专门用来跑通流程,全量数据等参数定型后再上
第二步:起训,先把流程跑通再谈效果
第一次跑的目标不是效果好,而是看到 loss 正常下降、并成功存出适配器文件。用最小配置:小参数量、小批量、很少的步数。跑通了再放大,能省掉大量反复调试的时间。
- 先跑通最小配置小模型或小参数量、小批量、步数少,确认能存出适配器文件,再去改参数。
- 报显存不足时按顺序调先降批量 → 再开梯度累积把等效批量补回来 → 然后缩短序列长度 → 最后才考虑量化或换卡。顺序反了会白折腾。
- 只动少数几个参数学习率、训练轮数、可训练的低秩维度、哪些层参与训练。其余默认值先别碰,一次只改一个。
- 每存一次检查点就记配置否则后面比效果时你分不清哪个权重对应哪套参数,这个记录习惯比调参本身更值钱。
什么时候停?看验证集损失是否还在降,以及在预留的评测样本上是否真的变好,不要只看训练损失有多低。训练损失一直降但验证损失回升,就是过拟合的信号。
第三步:验证,别只信训练日志
训练日志只告诉你模型在拟合数据,不告诉你它变好了没有。验证要准备三类样本,并且必须保留一份基座模型做对照,同一批问题分别问原模型和微调后的模型。
| 测试类型 | 看什么 | 出问题说明什么 |
|---|---|---|
| 训练集内样本 | 有没有记住 | 没记住,先查数据格式和轮数 |
| 同分布新样本 | 有没有泛化 | 记不住新样本,多半是数据太单一 |
| 分布外样本 | 有没有把原有能力训坏 | 通用能力下降,轮数或学习率过头 |
- 输出格式很稳但内容变差:数据里的答案质量问题,不是训练参数问题
- 对没见过的问法直接崩:数据多样性不够,或者样本里混进了固定模板
- 通用能力明显下降:训练轮数或学习率过头,先把轮数砍回来重跑
- 基座对照结果和微调结果差不多:先确认提示词和 RAG 是不是已经够用,再决定要不要继续训
第四步:接回推理,两条路各管一段
训完的适配器怎么用,取决于你在哪个阶段。验证阶段和上线阶段的需求不一样,硬套同一条路会很难受。
- 路线 A:直接加载适配器
- 训练框架加载适配器做推理,适合验证阶段,省事但吞吐一般
- 路线 B:合并权重
- 把适配器和基座权重合并成完整权重,再用常规推理框架起服务,适合上线,代价是多占磁盘和一次合并时间
- 版本对齐
- 合并前确认基座版本和训练时一致,版本错位是最常见的「训完效果全没了」原因
- 回退开关
- 上线后留一份不加载适配器的回退开关,出问题能秒切回原模型
- 多任务拆分
- 按场景分开训、按请求切换,比把多个任务塞进一个适配器更好维护
常见问题
没有 GPU 能不能跑 LoRA 训练?
能,但要看模型大小和数据量。小模型在消费级显卡上可以跑,显存不够时靠梯度累积、缩短序列长度、量化基座这些手段往下压。如果连一张能用的卡都没有,先考虑租卡或先用托管微调服务跑通流程,别一上来就买设备。
LoRA 训完,效果不好一般先查哪里?
按这个顺序查:数据格式和标签是否对齐、训练集里同类问题的答案是否自相矛盾、验证集损失是还在降还是已经反弹、以及基座版本是否和合并时一致。多数「没效果」其实出在数据和格式,而不是参数没调好。
LoRA 和全量微调该怎么选?
数据量小、算力有限、只想让模型学一种说话方式或输出格式,优先 LoRA。需要模型系统性地掌握一个新领域的知识,且数据和算力都够,再考虑更大范围的微调。拿不准就先把 LoRA 跑通,用它的结果判断问题是不是出在训练方式上。