Skip to content

LoRA/PEFT 微调

调整维度和秩,观察 LoRA 如何大幅减少可训练参数量。

🔧 LoRA 可视化

原始权重 W
W
512 × 512
=
冻结 ❄️
W₀
不更新
+
LoRA ΔW = B × A
B
512×8
×
A
8×512
全量微调
0.26M
512 × 512 = 262,144 参数
LoRA (r=8)
0.0082M
8×512 + 512×8 = 8,192 参数
参数减少
96.9%
压缩比
32.0x
秩 / 维度
1.6%
📖 LoRA 原理
W' = W₀ + B × A
  • W₀: 预训练权重 (冻结,不更新)
  • A: 下投影矩阵,将 k 维映射到 r 维
  • B: 上投影矩阵,将 r 维映射回 d 维
  • r: 秩 (rank),通常 4-64,控制表达能力
💡 典型应用:
  • 7B 模型全量微调需 ~28GB 显存,LoRA 只需 ~8GB
  • 可以为不同任务训练多个 LoRA 适配器,快速切换
  • 常用于 Query/Key/Value 投影层和 FFN 层
  • QLoRA: LoRA + 4-bit 量化,进一步减少显存

💡 推荐: r=8~32, α=2r (缩放因子)


一句话定义:LoRA (Low-Rank Adaptation) 是一种参数高效微调技术,通过训练低秩矩阵来适配大模型,只需更新 0.1%-1% 的参数即可达到全量微调的效果。

  • PEFT: Parameter-Efficient Fine-Tuning,参数高效微调的统称
  • LoRA: 最流行的 PEFT 方法,冻结原模型,只训练低秩适配器
  • QLoRA: LoRA + 4bit 量化,进一步降低显存需求

全量微调LoRA 微调
重新制作一把新吉他在原吉他上加个变调夹
改变整个吉他的音色只调整需要的音高
成本高,耗时长便宜、快速、可拆卸
每首歌一把吉他一把吉他 + 多个变调夹

LoRA 就是给大模型加”变调夹”,轻量级地改变它的行为。


模型参数量全量微调显存LoRA 微调显存
7B70亿56 GB (FP16)8 GB
13B130亿104 GB12 GB
70B700亿560 GB48 GB
优势说明
显存降低 80%+
存储原模型 14GB + LoRA 几十 MB
多任务一个基座模型 + 多个 LoRA 适配器
效果接近全量微调

预训练权重 W0W_0 固定,添加可训练的低秩矩阵:

LoRA 权重更新
W=W0+ΔW=W0+BAW = W_0 + \Delta W = W_0 + BA
  • W0Rd×kW_0 \in \mathbb{R}^{d \times k}: 冻结的预训练权重
  • BRd×rB \in \mathbb{R}^{d \times r}: 可训练,初始化为 0
  • ARr×kA \in \mathbb{R}^{r \times k}: 可训练,随机初始化
  • rmin(d,k)r \ll \min(d, k): 秩,通常 8-64
原始参数LoRA 参数 (r=8)压缩比
4096 × 409616.7M65K256x
4096 × 1100845M120K375x
LoRA 前向传播
h=W0x+αrBAxh = W_0 x + \frac{\alpha}{r} BAx
  • xx: 输入
  • α\alpha: 缩放因子(控制 LoRA 影响强度)
  • rr: 秩
  • 推理时可合并: W=W0+αrBAW = W_0 + \frac{\alpha}{r}BA

通常应用于 Transformer 的 Attention 层:

┌─────────────────────────────────────────┐
│ Attention Layer │
├─────────────────────────────────────────┤
│ Q = W_q · x + B_q · A_q · x ← LoRA │
│ K = W_k · x + B_k · A_k · x ← LoRA │
│ V = W_v · x + B_v · A_v · x ← LoRA │
│ O = W_o · attn + B_o · A_o ← LoRA │
└─────────────────────────────────────────┘

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType
# 1. 加载基座模型
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
torch_dtype=torch.float16,
device_map="auto"
)
# 2. 配置 LoRA
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
r=8, # 秩
lora_alpha=32, # 缩放因子
lora_dropout=0.1, # Dropout
target_modules=[ # 应用 LoRA 的层
"q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"
],
)
# 3. 创建 PEFT 模型
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# trainable params: 4,194,304 || all params: 6,742,609,920
# trainable%: 0.0622%
# 4. 正常训练
from transformers import Trainer, TrainingArguments
trainer = Trainer(
model=model,
args=TrainingArguments(
output_dir="./lora-llama2",
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
num_train_epochs=3,
learning_rate=2e-4,
fp16=True,
),
train_dataset=dataset,
)
trainer.train()
# 5. 保存 LoRA 权重 (仅几十 MB)
model.save_pretrained("./lora-llama2")
# 6. 加载使用
from peft import PeftModel
base_model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
model = PeftModel.from_pretrained(base_model, "./lora-llama2")
# 7. 合并权重 (可选,用于部署)
merged_model = model.merge_and_unload()

方法特点适用场景
LoRA基础版,添加低秩矩阵通用微调
QLoRALoRA + 4bit 量化显存受限
DoRA分解权重为方向和大小更接近全量微调
AdaLoRA自适应调整秩自动化调参
LoRA+不同学习率 for A 和 B更快收敛



LoRA 论文

Low-Rank Adaptation of LLMs

阅读

QLoRA 论文

Efficient Finetuning of Quantized LLMs

阅读

PEFT 库

Hugging Face 官方实现

GitHub