一文拿下_LoRA_QLoRA_微调_从_0_到可上线
一、一文拿下 LoRA/QLoRA 微调:从 0 到可上线(送成套脚本与发布包)
这篇不是概念科普,而是能直接跑通、可复用的 SOP。我把在实际项目里踩过的坑和最省钱的做法全写进来:数据怎么做、参数怎么配、怎么评估、怎么上线,外加可下载的脚本与排版模板。照着走一遍,你就能把通用模型变成你的专属"内训生"。
1. 目录
- 为什么选 LoRA / QLoRA
- 成本与硬件怎么估
- 10 分钟快速跑通(可下载发布包)
- 数据篇:模板、质检清单与反例
- 训练篇:参数表 + 一键脚本
- 评估篇:从"好不好用"到"可上线"
- 部署篇:加载适配器 / 合并权重 / 服务化
- 进阶:多适配器与持续学习
- 常见坑与排查清单(15 条)
- 合规与上线 Checklist
- 附录:项目结构、Dockerfile、命令合集
2. 为什么选 LoRA / QLoRA
LoRA的思路很简单:不改动大模型的主体参数,只在注意力/前馈等关键位置挂上小的"适配器",只训练这些小模块。好处:便宜、快、迭代灵活。
QLoRA在此基础上把基座用4-bit量化加载,显存压力再降一截,单卡也能玩 7B/8B。实际落地里,我更常用 QLoRA 起步,小预算把效果打到 80–90 分,再按需加码。
适合的场景:垂直问答、客服话术、结构化摘要、风格改写、代码助手、标准化表述输出等。
小经验:别指望一次"神调参"逆天。把数据模板、风格规范固定住,做稳定的增量,效果更稳。
3. 成本与硬件怎么估
| 规模 | 路线 | 典型显存 | 训练集 | 单轮训练时长(估) |
|---|---|---|---|---|
| 7B/8B | LoRA | ≥24GB | 5k–20k | 1–6 小时 |
| 7B/8B | QLoRA | 12–24GB | 5k–20k | 1.5–8 小时 |
| 13B | QLoRA | 24–48GB | 10k–50k | 4–16 小时 |
4. 10 分钟快速跑通(含发布包)
- 下载示例发布包(脚本 + 数据模板 + 文章 HTML):见文末"下载发布包"。
- 创建环境并安装依赖:
conda create -n lora python=3.10 -y && conda activate lora
pip install -U torch transformers datasets peft accelerate trl bitsandbytes sentencepiece evaluate scikit-learn numpy
- 把你的样本写成 data/train.jsonl(见下一节模板)。
- 一键训练(默认走 QLoRA 省显存):
bash run_lora.sh
- 推理验证:
python infer_merge.py --prompt "请用要点解释 NDA 中的保密义务"
如果你更偏向"所见即所得",发布包里还附了Dockerfile与FastAPI示例。
5. 数据篇:模板、质检清单与反例
5.1 统一到指令微调格式(JSONL,每行一条)
{"instruction":"把下面病历要点提成三条 bullet","input":"主诉:咳嗽三周...","output":"- 持续咳嗽...\n- 夜间加重...\n- 听诊..."}
{"instruction":"把用户的问题改写成检索查询","input":"怎么缓解鼻塞?","output":"鼻塞 缓解 方法 成人 注意事项"}
{"instruction":"用中文解释下面的Python报错","input":"KeyError: 'user_id'","output":"这是在访问字典中不存在的键..."}
5.2 质检要点
- 统一风格:是否固定用词、标点、换行格式(比如统一用 - 作为要点)
- 去重与脱敏:手机号、姓名、公司信息一律处理
- 可评估性:每条样本能否判断对错或好坏
- 反例样本:加入"不会就说不知道""超范围礼貌拒答"的示例
- 长度覆盖:短问短答 + 长文任务都要覆盖,以免训练后只会一种节奏
实战建议:先做**2–5k 条"黄金样本"**打底,效果稳定后再扩大。
6. 训练篇:参数表 + 一键脚本
推荐起步超参(Llama/Mistral 系)
- LoRA:r=64,lora_alpha=16,lora_dropout=0.05
- 目标层:[“q_proj”,“k_proj”,“v_proj”,“o_proj”,“gate_proj”,“up_proj”,“down_proj”]
- 学习率:2e-4;调度:cosine;warmup_ratio=0.03;bf16=True
- QLoRA:nf4 + double quant,开启 gradient_checkpointing
7. 评估篇:从"好不好用"到"可上线"
主观评测(最有效):准备 30–100 条看家问题,对比微调前后,三档打分;重点看风格一致性、事实性、格式合规。
离线指标:ROUGE-L、BLEU、BERTScore(有参考答案时),以及困惑度。
上线门槛:命中率、错误可控、输出可解析(JSON/Markdown 格式稳定)。
8. 部署篇:加载适配器 / 合并权重 / 服务化
发布包包含:infer_merge.py、merge_lora.py、serve_fastapi.py。
9. 进阶:多适配器与持续学习
- 多业务并存:一套基座 + 多个 LoRA 适配器,热插拔;A/B 快速对比
- 持续学习:收集"失败样本"再训 1–2k 条也能显著提升
- RAG:事实性要求高的场景,拒答样本 + RAG 一起上
10. 常见坑与排查清单(15 条)
- CUDA OOM:调 max_seq_len/grad_accum;确认 4-bit
- Loss 不降:数据脏、风格混乱、答案不唯一;先做小集合控样
- 中文乱码:use_fast=True;pad_token=eos_token
- 幻觉严重:加入"不会就说不知道"样本;上线配 RAG
- 多轮乱套:对话模板不一致;推理时加 system 身份
- target_modules 不匹配:确认模型卡片
- 学习率过高:出现发散立刻降到 5e-5
- 评估集泄漏:训练/评估严格隔离
- 合并后精度损失:合并前后做 sanity check
- 日志不足:合理 logging_steps
- 数据过短:只会短答,长文任务学不会
- 训练过久:过拟合,考虑早停
- 格式不稳:在样本里写清"输出格式"
- 基座/分词器不一致:同源
- 合规:license 与数据授权
11. 合规与上线 Checklist
- 数据脱敏与授权
- 拒答样本与违规过滤
- 可校验输出(JSON/Markdown)
- 监控:命中率、长度、拒答率、满意度
- A/B 比对不同适配器
尾声:把流程跑通,比任何单一"玄学调参"更重要。优先修数据与模板,其次再谈参数。