Long-form

LLM 微调 2026:从 LoRA 到 QLoRA 到 DoRA 的技术演进与选型指南

6 min read ·

微调的本质问题

预训练的 LLM 是通用的——它什么都能聊,但什么都不够专精。当你需要:

Prompt Engineering 和 RAG 能覆盖一部分,但总有一些场景只有微调能解决。问题是:怎么微调一个几百亿参数的模型,而不需要几百张 GPU?

这正是 LoRA 家族要解决的问题。

第一代:LoRA — 低秩适配

核心思想

Edward Hu 等人在 2021 年提出了一个关键洞察:预训练模型在微调时的权重变化是低秩的

什么意思?假设模型的某一层权重矩阵 W 是 4096×4096 的(约 1600 万参数),微调后变成 W’ = W + ΔW。LoRA 的发现是 ΔW 的有效秩(effective rank)通常只有 4-64,远小于 4096。

因此,ΔW 可以分解为两个小矩阵的乘积:

ΔW = B × A

其中 A 是 r×4096,B 是 4096×r,r(rank)通常取 4-64。

参数效率

方法可训练参数(7B 模型)占比
全量微调7B100%
LoRA (r=16)约 20M0.28%
LoRA (r=4)约 5M0.07%

只训练 0.1-0.3% 的参数,精度能达到全量微调的 95-99%。

工程优势

LoRA 的一个被低估的优势是推理零开销

# 微调完成后,合并权重
W_merged = W_base + B @ A

# 合并后的模型和原模型架构完全相同
# 推理速度、推理延迟和原模型一模一样

不需要额外的推理框架支持,合并后的权重可以直接用 vLLM、TGI 等标准推理引擎部署。

LoRA 的不足

  1. 精度天花板:rank 太低会丢失信息,但 rank 太高又失去了参数效率的优势
  2. 显存瓶颈仍在基底模型:LoRA 只减少了可训练参数,但基底模型仍需要以 FP16/BF16 加载到显存中。7B 模型 ≈ 14 GB,70B 模型 ≈ 140 GB
  3. 方向和幅度耦合:LoRA 用同一组低秩矩阵同时修改权重的方向和幅度,缺乏精细控制

第二代:QLoRA — 量化 + 低秩适配

核心创新

Tim Dettmers 等人在 2023 年提出的 QLoRA 解决了 LoRA 的显存瓶颈——把基底模型量化到 4-bit,只在 LoRA 适配器上保持高精度

三个关键技术:

1. NormalFloat4 (NF4) 数据类型

传统的 INT4 量化对均匀分布的数据效果好,但模型权重通常服从正态分布。NF4 把 4-bit 的 16 个量化级别按正态分布的分位数分配,使得量化误差最小。

INT4 量化级别:  均匀分布在 [-8, 7]
NF4 量化级别:  按 N(0,1) 的分位数分布,中心更密集

2. 双重量化

量化需要对每个 block(通常 64 个权重)存储一个缩放因子(scaling constant)。这些缩放因子本身也占内存。双重量化对缩放因子再做一次量化,从 FP32(4 bytes)压缩到约 0.5 bytes,节省了约 3 GB/65B。

3. 分页优化器

训练时偶尔会出现 mini-batch 导致的显存尖峰。分页优化器利用 NVIDIA 统一内存(Unified Memory),在显存不足时自动把优化器状态卸载到 CPU 内存,显存恢复后再加载回来。

显存对比

方法70B 模型显存需求最低 GPU 配置
全量微调~560 GB8×A100 80G
LoRA (FP16 基底)~140 GB2×A100 80G
QLoRA (NF4 基底)~40 GB1×A6000 48G

QLoRA 让 70B 模型微调从”公司级”变成了”个人级”。

QLoRA 的精度

论文在 MMLU 上的实验:

方法Llama-2 7BLlama-2 13BLlama-2 70B
全量微调63.268.573.1
LoRA r=6462.868.172.6
QLoRA r=6462.567.972.4

QLoRA 相比全量微调的精度损失不到 1%。在大多数生产场景中,这点差距远小于数据质量的影响。

第三代:DoRA — 权重分解适配

动机

LoRA 用一对低秩矩阵同时修改权重的方向和幅度,但这两者的学习动态不同:

将两者用同一个低秩更新来修改,相当于让一个工具同时完成两个不同的任务。

核心方法

DoRA 把预训练权重 W 分解为:

W = m × (W / ||W||)
    ↑      ↑
  幅度    方向

微调时:

为什么更好

论文对全量微调的权重变化做了分析,发现:

  1. 全量微调中,幅度和方向的变化模式有明显差异
  2. LoRA 的低秩约束让它难以同时捕捉两种模式
  3. DoRA 通过分离两者,让方向部分的 LoRA 可以更专注于方向调整

实验数据(commonsense reasoning 平均分):

方法Llama-2 7BLlama-3 8B
LoRA r=3280.183.4
DoRA r=3281.885.0
全量微调82.485.7

DoRA 在相同 rank 下比 LoRA 高 1-2 个百分点,更接近全量微调。

DoRA 的额外开销

DoRA 相比 LoRA 多了一个幅度向量 m(维度 = 输出维度),以及每次前向传播中的归一化计算。在 7B 模型上:

几乎可以免费获得的精度提升。

生产级微调 Checklist

1. 数据准备(最重要)

数据质量 >> 数据数量 >> 微调方法

2. 超参数选择

# 推荐起始配置(QLoRA)
lora_rank: 16          # 简单任务用 8,复杂任务用 32-64
lora_alpha: 32         # 通常设为 rank 的 2 倍
lora_dropout: 0.05     # 小数据集适当加大到 0.1
target_modules:        # 至少包含 attention 的 Q/V 投影
  - q_proj
  - v_proj
  - k_proj             # 可选,通常能小幅提升
  - o_proj             # 可选
learning_rate: 2e-4    # QLoRA 用较高学习率
batch_size: 4          # 配合 gradient_accumulation
gradient_accumulation: 8
epochs: 3              # 小数据集容易过拟合,2-3 轮通常够了
warmup_ratio: 0.03
lr_scheduler: cosine

3. 训练框架选择

框架优势适用场景
Unsloth速度最快(2x),内存最省单 GPU 快速迭代
Axolotl配置灵活,社区活跃多种微调方法切换
LLaMA-Factory一站式 GUI,支持 100+ 模型团队协作和实验管理
torchtunePyTorch 官方,代码清晰需要深度定制

4. 评估和部署

# 微调后的评估三步法

# Step 1: 自动评估(基线对比)
# 在你的验证集上跑一遍,对比微调前后的指标

# Step 2: 人工评估(关键)
# 随机抽 50 条,人工判断输出质量

# Step 3: A/B 测试(生产验证)
# 线上小流量对比微调模型和基础模型

部署时记得合并 LoRA 权重:

python merge_lora.py \
  --base_model meta-llama/Llama-3-8B \
  --lora_model ./output/checkpoint-best \
  --output_dir ./merged-model

5. 常见踩坑

问题症状解决方案
过拟合验证 loss 上升,训练 loss 继续下降减少 epochs、增加 dropout、增加数据
灾难性遗忘微调任务好了但通用能力崩了减小 rank、降低学习率、混入通用数据
格式不稳定输出时有时没有目标格式增加格式相关的训练样本、使用 Structured Output
量化误差QLoRA 在某些层的输出异常关键层(embedding、lm_head)保持 FP16

2026 年的选型建议

先考虑是否真的需要微调
    ↓ (是)
数据量 < 500 条?
    ↓ (是)           → 使用 few-shot prompt 或 RAG
    ↓ (否)
预算 < 1 张 48GB GPU?
    ↓ (是)           → QLoRA,rank=16-32
    ↓ (否)
追求极致精度?
    ↓ (是)           → DoRA rank=32-64 或全量微调
    ↓ (否)           → LoRA rank=16,性价比最高

微调技术在快速演进,但有一个常量不变:数据质量决定了微调效果的上限,方法选择只决定了你能多接近这个上限

在方法选择上投入 20% 的精力,在数据质量上投入 80% 的精力——这是我在过去一年的微调实践中最大的教训。

Frequently asked questions

LoRA 的核心原理是什么?
LoRA(Low-Rank Adaptation)的核心假设是:微调时的权重变化矩阵 ΔW 是低秩的。因此可以用两个小矩阵 A(d×r)和 B(r×d)的乘积来近似 ΔW,其中 r 远小于 d。这样需要训练的参数量从 d² 降到 2dr,通常只有原模型参数量的 0.1-1%。
QLoRA 相比 LoRA 的关键改进是什么?
QLoRA 有三个关键创新:1) NormalFloat4(NF4)数据类型,比传统 INT4 更适合正态分布的模型权重;2) 双重量化,对量化常数本身再做一次量化以进一步节省内存;3) 分页优化器,利用 CPU 内存处理显存溢出的梯度。这些改进让 65B 模型可以在单张 48GB GPU 上微调。
DoRA 和 LoRA 的核心区别在哪里?
DoRA(Weight-Decomposed Low-Rank Adaptation)把预训练权重分解为'方向'(direction)和'幅度'(magnitude)两个分量。微调时,幅度用一个可学习的向量 m 来调整,方向用 LoRA 的低秩矩阵来修改。这种分解让模型能更精细地调整每个维度的贡献,论文实验表明 DoRA 在 commonsense reasoning 上比 LoRA 平均高 1-3 个百分点。
微调 vs Prompt Engineering vs RAG,怎么选?
三者解决不同层次的问题:Prompt Engineering 是零成本、零延迟的第一选择;RAG 适合需要外部知识但不改变模型行为的场景;微调适合需要改变模型'性格'(输出风格、领域术语、格式遵循)的场景。先试 Prompt,不够用加 RAG,还不够再微调。微调不是银弹——数据质量比方法选择更重要。
2026 年微调的显存需求大概是多少?
以 Llama-3 70B 为例:全量微调约 560 GB(需 8×A100 80G);LoRA rank=16 约 80 GB(需 1×A100 80G 或 2×A6000 48G);QLoRA rank=16 约 40 GB(单张 A6000 48G 即可);DoRA 约 48 GB(略高于 QLoRA 因为多了幅度向量)。QLoRA 是个人开发者和小团队的最佳入口。