全参数微调一个 7B 模型需要 ~56GB 显存,这对大多数人来说不现实。LoRA 和 QLoRA 让你用一张消费级显卡就能微调大模型。
LoRA 原理
LoRA(Low-Rank Adaptation)的核心思想:冻结原模型参数,只训练一组低秩分解矩阵。
对于原始权重矩阵 W,LoRA 添加一个低秩更新:
W' = W + α × (B × A)
# W: 原始权重 (d × d)
# A: 降维矩阵 (d × r),r << d
# B: 升维矩阵 (r × d)
# α: 缩放因子
当 rank r = 16 时,可训练参数只有原来的 0.1% 左右。
QLoRA:更进一步
QLoRA 在 LoRA 基础上增加了:
- 4-bit 量化:将基础模型量化到 4-bit NormalFloat
- 双重量化:对量化常数进行二次量化
- 分页优化器:自动管理 GPU 内存
这使得在单张 24GB GPU 上微调 70B 模型成为可能。
实战代码
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model
# 4-bit 量化配置
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype="float16",
)
# 加载模型
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen2.5-7B",
quantization_config=bnb_config,
device_map="auto"
)
# LoRA 配置
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# trainable params: 6.5M || all params: 7.6B || 0.086%
总结
LoRA / QLoRA 极大降低了微调大模型的门槛。选好数据集、设好超参、跑起来,你的专属模型就诞生了。