引言

参数高效微调(PEFT)技术让普通开发者也能微调大模型。其中LoRA和QLoRA是最流行的两种方案。2026年,随着模型规模进一步扩大,这两种技术的差异和选择变得更加重要。

一、LoRA原理

LoRA(Low-Rank Adaptation)通过低秩矩阵分解来近似模型权重的更新:

原始: Y = W·X, W ∈ R^(d×k)
LoRA: Y = (W + ΔW)·X, ΔW = A·B, A ∈ R^(d×r), B ∈ R^(r×k), r << d

只训练A和B两个小矩阵,原参数W冻结。

from peft import LoraConfig, get_peft_model

config = LoraConfig(
    r=8,  # 秩
    lora_alpha=16,
    target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)

model = get_peft_model(base_model, config)

优势

  • 训练参数减少99%+
  • 不增加推理延迟(训练后可合并权重)
  • 效果接近全参数微调

劣势

  • 仍需要模型以全精度加载到GPU
  • 大模型仍需要大量GPU内存

二、QLoRA原理

QLoRA在LoRA基础上增加了4位量化:

基础模型: 4-bit量化存储 → 大幅减少内存
LoRA适配器: 全精度训练 → 保持训练精度
梯度: 通过4-bit基础模型反传 → 计算LoRA梯度
from transformers import BitsAndBytesConfig
import torch

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_use_double_quant=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16
)

model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3-70B",
    quantization_config=bnb_config,
    device_map="auto"
)

# 然后应用LoRA
model = get_peft_model(model, lora_config)

优势

  • 70B模型只需18GB GPU内存(LoRA需要140GB)
  • 普通消费级GPU就能微调大模型
  • 效果接近LoRA

劣势

  • 训练速度稍慢(量化/反量化开销)
  • 推理时如果保持量化,精度略有下降

三、2026年对比

3.1 内存对比

模型大小全参微调LoRAQLoRA
7B~56GB~28GB~6GB
13B~104GB~52GB~10GB
70B~560GB~280GB~18GB
175B~1400GB~700GB~40GB

3.2 性能对比

指标LoRAQLoRA差距
训练速度1.0x0.85xQLoRA慢15%
最终精度100%98-99%QLoRA略低
推理速度1.0x1.0x*合并后相同
训练稳定性中高QLoRA偶有梯度异常

*合并权重后推理速度相同;如果不合并,QLoRA推理更慢

3.3 质量对比

在标准基准上,QLoRA的效果与LoRA差距在1-2%以内:

MMLU基准:
- 全参微调: 72.3
- LoRA:     71.8
- QLoRA:    71.5

四、选择指南

选LoRA如果:

  • 有足够的GPU内存
  • 追求最高精度
  • 需要最快训练速度
  • 模型规模<13B

选QLoRA如果:

  • GPU内存有限
  • 需要微调大模型(>13B)
  • 可以接受1-2%精度下降
  • 想要最低成本

五、最佳实践

5.1 LoRA参数调优

# 秩选择
r = 8   # 简单任务
r = 16  # 中等任务
r = 64  # 复杂任务

# target_modules: 覆盖更多模块
target_modules = [
    "q_proj", "k_proj", "v_proj", "o_proj",  # attention
    "gate_proj", "up_proj", "down_proj"       # MLP
]

# alpha通常设为r的2倍
lora_alpha = r * 2

5.2 QLoRA优化

# 使用nf4量化(比fp4更好)
bnb_4bit_quant_type="nf4"

# 双重量化(进一步减少内存)
bnb_4bit_use_double_quant=True

# 计算精度用bfloat16(比float16更稳定)
bnb_4bit_compute_dtype=torch.bfloat16

六、进阶技术

6.1 DoRA

DoRA(Weight-Decomposed LoRA)将权重分解为方向和大小:

from peft import LoraConfig
config = LoraConfig(
    r=8,
    use_dora=True,  # 启用DoRA
    ...
)

效果优于LoRA,内存开销几乎相同。

6.2 LoRA+

LoRA+对A和B使用不同的学习率:

# B的学习率设为A的16倍
optimizer = LoRAPlusOptimizer(
    model, lr_a=1e-4, lr_b=1.6e-3
)

收敛更快,效果更好。

结语

LoRA和QLoRA在2026年仍然是参数高效微调的主流选择。选择的关键不在于"哪个更好",而在于"哪个更适合你的场景"。

对于大多数开发者和中小团队,QLoRA是更实用的选择——它让7B-70B模型的微调变得触手可及。对于有充足资源的团队,LoRA能提供更好的训练速度和精度。

无论选择哪种,关键都在于数据质量、超参数调优和评估方法。好的数据+合适的超参数+正确的PEFT方法,才能得到最好的微调效果。

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。