一文拿下_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 分钟快速跑通(含发布包)

  1. 下载示例发布包(脚本 + 数据模板 + 文章 HTML):见文末"下载发布包"。
  2. 创建环境并安装依赖:
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
  1. 把你的样本写成 data/train.jsonl(见下一节模板)。
  2. 一键训练(默认走 QLoRA 省显存):
bash run_lora.sh
  1. 推理验证:
python infer_merge.py --prompt "请用要点解释 NDA 中的保密义务"

如果你更偏向"所见即所得",发布包里还附了DockerfileFastAPI示例。

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.pymerge_lora.pyserve_fastapi.py

9. 进阶:多适配器与持续学习

  • 多业务并存:一套基座 + 多个 LoRA 适配器,热插拔;A/B 快速对比
  • 持续学习:收集"失败样本"再训 1–2k 条也能显著提升
  • RAG:事实性要求高的场景,拒答样本 + RAG 一起上

10. 常见坑与排查清单(15 条)

  1. CUDA OOM:调 max_seq_len/grad_accum;确认 4-bit
  2. Loss 不降:数据脏、风格混乱、答案不唯一;先做小集合控样
  3. 中文乱码:use_fast=True;pad_token=eos_token
  4. 幻觉严重:加入"不会就说不知道"样本;上线配 RAG
  5. 多轮乱套:对话模板不一致;推理时加 system 身份
  6. target_modules 不匹配:确认模型卡片
  7. 学习率过高:出现发散立刻降到 5e-5
  8. 评估集泄漏:训练/评估严格隔离
  9. 合并后精度损失:合并前后做 sanity check
  10. 日志不足:合理 logging_steps
  11. 数据过短:只会短答,长文任务学不会
  12. 训练过久:过拟合,考虑早停
  13. 格式不稳:在样本里写清"输出格式"
  14. 基座/分词器不一致:同源
  15. 合规:license 与数据授权

11. 合规与上线 Checklist

  • 数据脱敏与授权
  • 拒答样本与违规过滤
  • 可校验输出(JSON/Markdown)
  • 监控:命中率、长度、拒答率、满意度
  • A/B 比对不同适配器

尾声:把流程跑通,比任何单一"玄学调参"更重要。优先修数据与模板,其次再谈参数。