AI 学习路线 · 深入
Part 16 · PEFT 参数高效微调
重点吃透 **LoRA**:用极少量可训练参数微调大模型(消费级显卡就能跑)。
Section 1 · PEFT 是什么 + 装环境
Subsection 1 · 概念
PEFT(Parameter-Efficient Fine-Tuning,参数高效微调)= 只训练一小部分参数,就能达到接近全参微调的效果好处:显存占用小(1/10 甚至更少)、训练快、成本低Subsection 2 · 装库
cmd:pip install peft
Subsection 3 · 过关自测 能说"PEFT 解决什么问题" = Section 1 完成。
Section 2 · PEFT 三大流派(Adapter / Prompt / Prefix)
Subsection 1 · 记三种思路
① Adapter Tuning 在 Transformer 层之间插入小网络,只训小网络② Prompt Tuning 在输入前加可学习的"软提示"向量,只训这些向量③ Prefix Tuning 在每层前加可学习的"前缀",只训前缀- 共同点:冻结原模型,只训练新增的小参数。
Subsection 2 · 过关自测 能说出三种 PEFT 思路 = Section 2 完成。
Section 3 · LoRA 原理(重点)
Subsection 1 · 记核心思想
LoRA(Low-Rank Adaptation,低秩适配)原理:冻结原权重 W,在旁边加一个低秩矩阵 ΔW = A × B A: (in_dim × r) B: (r × out_dim),r 很小(如 8/16/64) r 越小→可训练参数越少→越省显存效果:参数量降到原模型的 ~0.1%,效果接近全参微调Subsection 2 · 画图 在备忘录画:
输入 │ ▼ W(冻结) ──────┐ ▼ 输出 = W·x + (A·B)·x ▲ A·B(可训练)过关:能对着图讲 LoRA = Section 3 完成。
Section 4 · 用 HF PEFT 跑 LoRA(代码)
Subsection 1 · 跑 LoRA 训练
新建 lora_train.py:
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainerfrom datasets import Datasetfrom peft import LoraConfig, get_peft_modelimport json# 数据rows = [json.loads(l) for l in open("train_data_clean.jsonl", encoding="utf-8")]dataset = Dataset.from_list(rows)model_name = "Qwen/Qwen2.5-0.5B-Instruct"tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)model = AutoModelForCausalLM.from_pretrained(model_name, trust_remote_code=True)# LoRA 配置:只训练注入的低秩矩阵lora = LoraConfig( r=8, # 秩:越小越省 lora_alpha=16, # 缩放系数 target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], # 只改注意力投影 lora_dropout=0.05,)model = get_peft_model(model, lora)model.print_trainable_parameters() # 打印可训练参数占比def fmt(ex): text = tokenizer.apply_chat_template(ex["messages"], tokenize=False) return tokenizer(text, truncation=True, max_length=256, padding="max_length")dataset = dataset.map(fmt)args = TrainingArguments( output_dir="lora_out", num_train_epochs=3, per_device_train_batch_size=1, logging_steps=1, save_strategy="no", report_to=[],)Trainer(model=model, args=args, train_dataset=dataset).train()model.save_pretrained("lora_out") # 只保存 LoRA 权重(很小)print("LoRA 训练完成")- 预期看到:
trainable params只占百分之零点几,训练后lora_out里是几百 KB 的小文件。 - 对比Part 13 全参微调:可训练参数从 100% 降到 ~0.5%,这就是 LoRA 的价值。
过关:LoRA 训练跑通并看到参数量对比 = Section 4 完成。
Section 5 · 加载 LoRA 推理
Subsection 1 · 跑推理
新建 lora_infer.py:
from transformers import AutoModelForCausalLM, AutoTokenizerfrom peft import PeftModelbase = "Qwen/Qwen2.5-0.5B-Instruct"model = AutoModelForCausalLM.from_pretrained(base, trust_remote_code=True)model = PeftModel.from_pretrained(model, "lora_out") # 叠加 LoRAtokenizer = AutoTokenizer.from_pretrained(base, trust_remote_code=True)text = tokenizer.apply_chat_template([{"role": "user", "content": "能开发票吗"}], tokenize=False, add_generation_prompt=True)inputs = tokenizer(text, return_tensors="pt")out = model.generate(**inputs, max_new_tokens=50)print(tokenizer.decode(out[0][len(inputs["input_ids"][0]):], skip_special_tokens=True))- 预期看到:按你数据的风格回答。
过关:LoRA 推理跑通 = Section 5 完成。
Section 6 · LLaMA-Factory 一键 LoRA
Subsection 1 · 跑命令 在 LLaMA-Factory 目录:
python src/train_bash.py \ --model_name_or_path Qwen/Qwen2.5-1.5B-Instruct \ --dataset train_data_clean.jsonl \ --finetuning_type lora \ --template qwen \ --output_dir ./lora_sft \ --num_train_epochs 3 \ --learning_rate 1e-4 \ --lora_rank 8- 预期看到:训练完成,
lora_sft里是 LoRA 权重。 - 对比Part 13 全参命令,只多了
--finetuning_type lora——生产就用这条。
过关:LLaMA-Factory LoRA 跑通 = Section 6 完成。
Section 7 · 评估 LoRA 效果
Subsection 1 · 对比
- 同一组测试问题,分别测:原始模型 / LoRA 微调后。
- 打分对比(沿用Part 13 Section 11 的方法)。
- 写笔记:LoRA 达到了全参微调几成的效果?
过关:有 LoRA 效果数据 = Section 7 完成。
Section 8 · QLoRA 原理(显存再减半)
Subsection 1 · 记原理
QLoRA = 量化(4bit)+ LoRA - 把原模型量化到 4bit(省显存) - 只对 LoRA 参数做反向传播效果:一张 24GB 显卡能微调 70B 级别模型;一张消费级卡能微调 7B~13B- 这就是"消费级显卡微调大模型"的钥匙。
过关:能说 QLoRA = 4bit + LoRA = Section 8 完成。
Section 9 · 用 bitsandbytes 跑 QLoRA
Subsection 1 · 装库
cmd:pip install bitsandbytes
Subsection 2 · 跑 QLoRA
在 lora_train.py 基础上改两处:
from transformers import BitsAndBytesConfig# 4bit 量化配置bnb = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype="float16")model = AutoModelForCausalLM.from_pretrained(model_name, trust_remote_code=True, quantization_config=bnb)# 其余和 Section 4 相同- 预期看到:模型加载时显存占用明显降低,训练跑通。
- 记下显存占用对比(Section 4 全精度 vs 现在 4bit),写进笔记。
过关:QLoRA 跑通 = Section 9 完成。
Section 10 · QLoRA 效果验证
Subsection 1 · 对比测试
- 同一测试集,对比:LoRA(Day4) vs QLoRA(Day9) 的效果与显存。
- 预期看到:QLoRA 效果略降但显存省很多——性价比之王。
过关:能说出 LoRA/QLoRA 取舍 = Section 10 完成。
Section 11 · LoRA 变体认识(AdaLoRA / LongLoRA / SLoRA)
Subsection 1 · 记三个变体
AdaLoRA 自适应:自动决定哪些位置该用更大的秩(效果更好)LongLoRA 长上下文:把 LoRA 用到长文本场景SLoRA SLoRA:服务场景高效多任务适配- 面试被问"LoRA 有哪些改进"→ 报这几个名字 + 一句话。
过关:能报出变体 = Section 11 完成。
Section 12 · P-Tuning V2
Subsection 1 · 记原理
P-Tuning V2 = Prefix Tuning 的改进:在每一层都加可学习前缀(原始 P-Tuning 只在输入层加,效果有限)适合:分类/小型任务,参数极小- 对比 LoRA:P-Tuning 参数更少但上限低;LoRA 是现在的主流默认。
过关:能说 P-Tuning V2 与 LoRA 差异 = Section 12 完成。
Section 13 · 实验:r 值的影响
Subsection 1 · 跑三档 r
- 分别用
--lora_rank 4 / 16 / 64微调三次(同一数据),记录:- 可训练参数数量
- 训练时间
- 测试分数
- 预期看到:r 越大效果略好但参数/时间涨;通常 r=8~16 性价比最高。
过关:有 r 值对比数据 = Section 13 完成。
Section 14 · 实验:不同数据量
Subsection 1 · 跑数据量对比
- 用 50 / 200 / 500 条数据各微调一次,记录分数。
- 预期看到:数据到一定量后收益递减。写出你的"性价比拐点"。
过关:有数据量对比 = Section 14 完成。
Section 15 · 微调项目实战:领域风格助手
Subsection 1 · 选领域 + 造数据
- 选一个你熟悉的领域(结合你简历:合同审阅 / 前端知识 / 电子签名)。
- 造 200 条"领域问答"数据(可用 DeepSeek 帮你批量生成初稿,再人工筛选)。
- 清洗 → 格式化。
过关:领域数据就绪 = Section 15 完成。
Section 16 · 跑领域 LoRA
Subsection 1 · 微调
- 用 LLaMA-Factory 对你的领域数据做 LoRA 微调。
- 预期看到:训练完成。
过关:领域微调跑通 = Section 16 完成。
Section 17 · 领域效果评估 + 迭代
Subsection 1 · 评估
- 出 20 道领域测试题(训练集外)。
- 对比原始 vs 微调后,打分。
- 效果不理想 → 检查:数据质量?r 值?轮数?针对性调整再训一轮。
过关:领域效果有明确提升 = Section 17 完成。
Section 18 · 部署微调模型
Subsection 1 · 服务化
- 把 LoRA 权重 + 基座模型用 vLLM 或 Ollama 部署(Ollama 支持 GGUF;vLLM 用
--lora-modules)。 - 简单验证:通过 API 调用领域模型。
- 预期看到:微调模型能以 API 形式被调用。
过关:微调模型部署跑通 = Section 18 完成。
Section 19 · 面试题
Subsection 1 · 练习作答
- LoRA 的原理?
- QLoRA 怎么省显存?
- PEFT 和全参微调区别?
- 怎么选 r 值?怎么评估微调效果?
- LoRA 有哪些改进变体?
- 什么情况用微调、什么用 RAG?
- 先自己答,再让 DeepSeek 补充标准答案。
过关:6 题能答 = Section 19 完成。
Section 20 · 站 14 验收
勾选
- 能画并讲 LoRA 原理
- HF PEFT LoRA 训练 + 推理跑通(Section 4/5)
- LLaMA-Factory LoRA 一键跑通(Section 6)
- QLoRA 跑通,能说省多少显存(Section 8/9)
- 能报出 LoRA 变体 + P-Tuning V2
- r 值实验 / 数据量实验至少一个完成(Section 13/14)
- 领域微调项目完成并有效果提升(Section 15~17)
- 微调模型部署为 API(Section 18)
- 6 道面试题能答
写 400 字Part 14 总结:LoRA/QLoRA 参数、显存、效果数据,你踩的坑。
全勾选 = Part 16 通过 → 进入下一站 Part 17 · 模型量化,10 天)。
