返回学习路线

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:

python
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:

python
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 基础上改两处:

python
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 · 练习作答

  1. LoRA 的原理?
  2. QLoRA 怎么省显存?
  3. PEFT 和全参微调区别?
  4. 怎么选 r 值?怎么评估微调效果?
  5. LoRA 有哪些改进变体?
  6. 什么情况用微调、什么用 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 天)。