🧠 图解记忆:不碰原始权重,只加一个小插件——这就是PEFT的核心思想。
为什么要PEFT?
全量微调(Full Fine-Tuning)一个7B参数的模型需要:
- ~14GB 显存存放权重 + 优化器状态 + 梯度 ≈ 56GB+ 显存(FP16)
- 大量GPU和时间成本
PEFT的目标:冻结大部分预训练权重,只训练极少量参数就能适配新任务。
三大主流方案对比
| 方法 | 可训练参数占比 | 显存需求 | 效果 | 特点 |
|---|---|---|---|---|
| Full FT | 100% | 极高 | 最佳 | 需要多卡/A100集群 |
| LoRA | 0.1~1% | 低(可单卡) | 接近全量 | 最流行、工业界首选 |
| P-Tuning v2 | 0.01~0.1% | 极低 | 中等 | 只需优化embedding层前缀 |
| Prefix-Tuning | <0.1% | 极低 | 中等 | 在每层前加可学习prefix |
| Adapter | 1~5% | 较低 | 中等偏上 | 在网络层间插入小型模块 |
| QLoRA | 同LoRA | 更低(量化后) | 接近LoRA | 4bit量化+LoRA,消费级显卡可用 |
LoRA核心原理
标准Transformer层的权重变换:h = Wx
LoRA的做法:h = Wx + ΔWx = Wx + BAx
其中:
- W: 预训练权重(冻结,不更新)
- B × A: 低秩分解矩阵,A是(r×d),B是(d×r),r远小于d(通常r=8~64)
- 训练中只更新B和A,W不变为什么叫"低秩"? 假设权重矩阵的变化方向在一个低维子空间内——我们不需要改整个矩阵,只需要在这个子空间里找最优偏移。
QLoRA:LoRA的进阶版
python
# QLoRA流程
# 1. 将模型量化为4-bit(使用NF4量化)
# 2. 加入双量化机制(Double Quantization)减少额外开销
# 3. 在量化后的模型上加载LoRA适配器
# 结果:在单张RTX 3090(24GB)上也能微调7B模型!量化带来的好处:
- 7B模型从14GB降到约3.5GB(INT4)
- LoRA适配器在此基础上训练,总显存占用约12-16GB
选择指南
| 场景 | 推荐方案 |
|---|---|
| 资源充足(多卡A100) | Full FT 或 LoRA |
| 单卡消费级GPU | QLoRA(4bit量化+LoRA) |
| 快速实验/原型 | P-Tuning v2 |
| 生产环境需要兼容旧系统 | LoRA(适配器可合并回原权重) |
面试话术
"PEFT的关键洞察是:预训练模型已经学会了通用语言能力,适配新任务只需要微调一小部分参数。LoRA通过低秩分解实现这个目标——冻结原始权重,只训练两个小矩阵的乘积。在实际项目中,我用QLoRA在单卡3090上调出了媲美全量微调的效果,显存从14GB压到12GB以下。关键参数rank选8就够用了,再大边际效益递减。"