问题:全量微调有多贵?
在 从 GPT 到 ChatGPT 里我们看到,SFT 就是把 base model 在对话数据上继续训练——loss 不变,优化器不变,变的只是数据。
听起来很简单,但全量微调 7B 模型需要多少显存?
| 组件 | 占用(FP16) |
|---|---|
| 模型权重 | 14 GB |
| 梯度 | 14 GB |
| Adam 动量 + 方差 (FP32) | 28 GB + 28 GB |
| 总计 | ~84 GB |
一块 H100 (80GB) 才刚好够,一块 1080 Ti (11GB) 差了将近 8 倍。
但这还不是最荒诞的部分:花了 84GB 显存和几天时间,你得到的不过是一个”和 SFT 之前差不多”的模型。7B 参数的基座已经是很好的语言引擎了,微调只是在它上面加一层薄薄的”任务适配”——就像在一幅快要完成的画上做最后几笔润色。为了这几笔而搬动整幅画的每一块颜料,实在太浪费了。
这就是 LoRA 要解决的问题。
核心洞察:ΔW 天生是低秩的
微调的数学定义很简单:给定预训练权重 ,微调就是学习一个更新量 ,使得:
全量微调直接学习 的每一个元素——一个 的稠密矩阵。对于 Llama 7B 的一个 attention 投影层(), 的大小是 参数,光这一层的梯度就 32MB。
LoRA 的核心假设: 虽然维度高,但它的信息量并不高——它存在于一个低维子空间里。也就是说, 可以用两个瘦矩阵的乘积来近似:
其中:
- ,通常
算一下参数量变化:
| 全量 | LoRA () | 压缩比 | |
|---|---|---|---|
| 参数量 | 128× | ||
| 梯度显存 | 33.6 MB | 0.26 MB | 128× |
| Adam 状态 | 134.4 MB | 1.0 MB | 128× |
低秩是合理的吗?
是的。大量实验发现,预训练语言模型在适配下游任务时,权重变化矩阵 确实具有很低的”内在维度”(intrinsic dimension)[1]。换句话说,模型有几十亿个参数,但”学会一个新任务”实际上只需要动几百个自由度就够了。LoRA 把这个观察变成了可训练的结构。
怎么训练:前向传播和前向后向的完整流程
对于一个 attention 层的原始权重 (冻结,不更新):
前向传播:
原始路径 照常计算。LoRA 路径 是额外加上的——先投影到 维再投影回来。因为 很小,这一路的计算量几乎是零。
反向传播:梯度只流经 和 ,不碰 。 不需要梯度,不需要 Adam 状态——这就是 84GB 变成 15GB 的根本原因。
初始化: 用随机高斯初始化, 初始化为全零。这保证了训练开始时 ,LoRA 不会干扰基座模型的输出。
推理: 直接加在一起,没有额外延迟。
LoRA 的三个设计决策
1. 在哪里插 LoRA?
原始论文[2] 只在 attention 的 和 投影上加了 LoRA。后来的实践发现, 四个投影全加效果更好,而且参数量依然很小。
也可以在 MLP 层加,但收益递减——attention 层才是任务适配的关键瓶颈。
2. rank r 选多大?
| r | 每层可训参数 | 效果 | 适用场景 |
|---|---|---|---|
| 4 | ~33K | 够用 | 简单指令微调 |
| 8 | ~66K | 好 | 通用微调 |
| 16 | ~131K | 更好 | 垂域适配 |
| 64+ | ~524K | 边际递减 | 几乎用不到 |
r=4 已经常常够用了——这反过来验证了”ΔW 确实低秩”的假设。如果你需要 r=64 才能追平全量微调,说明这个任务可能不适合 LoRA。
3. 缩放因子 α
LoRA 在前向里给更新量乘了一个缩放:
控制 LoRA 更新对原始输出的”音量”:
- → 缩放为 1,纯叠加
- → 放大 LoRA 的贡献
- → 抑制 LoRA 的贡献
实践中 常取 的 2-8 倍。这个因子让调 rank 和调学习率之间多了一个自由度——改变 的时候调整 可以保持更新幅度不变。
效果的实证
以 Llama 2 7B 为例,r=16,只给 Q 和 V 加 LoRA [2]:
| 可训参数 | 显存 | 训练时间 | |
|---|---|---|---|
| 全量微调 | 7B | ~84 GB | 基准 |
| LoRA () | 4.2M | ~14 GB | 约快 30%(少算梯度) |
| QLoRA (, 4-bit) | 4.2M | ~6 GB | 略慢于 LoRA(解量化的开销) |
而效果上,LoRA 在绝大多数任务上达到甚至超过全量微调的水平。
从 LoRA 到 QLoRA
LoRA 的最大瓶颈是:基座模型仍然需要 FP16 存着——7B × 2 bytes = 14GB,已经超了 1080 Ti 的 11GB。
QLoRA [3] 在 LoRA 的基础上做了一件事:把冻结的基座模型量化到 4-bit。基座 14GB → 3.5GB,加上 LoRA 适配器 ~几百 MB,再加上一些开销,总共 ~5-7GB。1080 Ti 终于能跑了。
具体实现:
- NF4 (NormalFloat 4-bit):因为预训练权重通常是正态分布,标准均匀量化会浪费信息。NF4 专门为正态分布设计码表,信息损失远小于标准 4-bit
- 双重量化:连量化用的缩放常数也再做一次量化,又省出 ~0.4GB
- 分页优化器:训练中如果 GPU 显存不够,自动把 optimizer states offload 到 CPU
训练效果上,QLoRA 和 LoRA 几乎没有差距——4-bit 的精度损失在低秩适配这个场景下不是瓶颈。
和其他方法的关系
| 方法 | 做法 | 可训参数 | 效果 |
|---|---|---|---|
| 全量微调 | 训练全部 | 100% | 上限最高,显存爆炸 |
| 逐层冻结 | 只训最后 层 | 10-30% | 不稳定,依赖人工选层 |
| Adapter [4] | 在 transformer 里插入小 MLP | 2-5% | 推理慢(多了串行计算) |
| Prefix Tuning [5] | 在输入前面拼接可学习 token | <1% | 占用 context 空间 |
| LoRA | 低秩适配器加在 attention 外 | <1% | 推理零开销,显存友好 |
LoRA 相比 Adapter 的核心优势: 和 可以并行计算然后相加——推理时没有任何额外延迟。Adapter 是一层小 MLP 插在 transformer block 中间,必须串行等待,每个 layer 都多等几毫秒,累积起来就是显著的延迟。
小结
LoRA = 假设 低秩 + 只训练 和 + 推理时合并为零开销。
三条记住就够:
- 或 几乎永远是正确选择——不需要调,除非极端场景
- 只加 attention 层的 Q/K/V/O——MLP 的收益不值得多倍的参数量
- QLoRA 是 1080 Ti 的唯一解——4-bit 基座 + LoRA,7B 模型在 ~6GB 里跑通
Reference
[1] Aghajanyan, A., Zettlemoyer, L., Gupta, S. (2021). Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning. ACL 2021.
[2] Hu, E. J., Shen, Y., Wallis, P., et al. (2021). LoRA: Low-Rank Adaptation of Large Language Models. ICLR 2022.
[3] Dettmers, T., Pagnoni, A., Holtzman, A., et al. (2023). QLoRA: Efficient Finetuning of Quantized Language Models. NeurIPS 2023.
[4] Houlsby, N., Giurgiu, A., Jastrzebski, S., et al. (2019). Parameter-Efficient Transfer Learning for NLP. ICML 2019.
[5] Li, X. L., Liang, P. (2021). Prefix-Tuning: Optimizing Continuous Prompts for Generation. ACL 2021.