跳转至

八:模型微调:QLoRA与 PEFT 方法对比

来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247483839&idx=1&sn=a9497acc7721bcb48a7ee6c26bec5d7d&chksm=f01eb2c6c7693bd0aa52fac7da6597c5ad1ed4d49b483ee1302eda13545a454f1a7568ccd813#rd

1. 学习定位

第七天学习了 LoRA。第八天继续模型微调,重点是 QLoRA,以及 Prompt Tuning、P-Tuning、Prefix Tuning、Adapter 等常见参数高效微调方法。 QLoRA 的核心是:把 base model 量化到 4-bit 以节省显存,同时在量化模型上训练 LoRA adapter。它让单卡或较低显存环境微调大模型变得更可行。 本日知识链路:

LoRA 减少可训练参数
-> 但 base model 权重仍占显存
-> QLoRA 将 base model 4-bit 量化
-> 冻结量化 base model
-> 训练 LoRA adapter
-> 用 NF4、double quantization、paged optimizer 降低显存
-> 与 Prompt/Prefix/Adapter 等 PEFT 方法对比选型
面试中 QLoRA 常被问到: - QLoRA 和 LoRA 的区别。

  • QLoRA 为什么能显著省显存。

  • 4-bit quantization、NF4、double quantization 是什么。

  • 量化权重能不能直接训练。

  • LoRA 参数为什么通常保持 fp16/bf16。

  • paged optimizer 解决什么问题。

  • QLoRA 训练和推理有哪些 dtype/显存坑。

  • Prompt Tuning、P-Tuning、Prefix Tuning、Adapter 与 LoRA/QLoRA 如何对比。

2. LoRA 的剩余显存问题

LoRA 只训练低秩 adapter,减少了梯度和优化器状态,但 base model 仍需加载到 GPU。 例如 65B 模型即使不训练全量参数,仅加载 bf16 权重也需要约:

65B * 2 bytes = 130 GB
这远超普通单卡显存。LoRA 的训练参数少,但 base weight 的存储仍然是瓶颈。 QLoRA 的思路是进一步量化 base model,把冻结权重压缩到 4-bit,从而显著降低显存。

3. QLoRA 的核心思想

QLoRA 是 Quantized LoRA。它通常包含三点:

1. 将预训练 base model 权重量化到 4-bit。
2. 冻结量化 base model。
3. 在量化 base model 上训练 LoRA adapter。
训练时:

quantized W is frozen
LoRA A/B are trainable
forward uses dequantized W for compute
backward updates LoRA parameters only
QLoRA 的目标不是让 4-bit 权重本身高精度更新,而是在低显存加载 base model 的基础上,通过 LoRA 学习任务增量。

4. QLoRA 与 LoRA 对比

LoRA:

base model 通常以 fp16/bf16 加载
冻结 base model
训练 LoRA adapter
QLoRA:

base model 以 4-bit 量化加载
冻结 base model
训练 LoRA adapter
区别主要在 base model 存储精度和显存占用。QLoRA 更省显存,但引入量化误差和量化计算实现复杂性。 QLoRA 不是替代 LoRA,而是 LoRA + 量化加载 base model 的组合方案。

5. 量化基础

量化是用低精度数值表示高精度权重。例如把 fp16/bf16 权重压缩成 int8、int4 或 4-bit code。 基本形式:

real_value ≈ scale * quantized_value + zero_point
LLM 中常见量化维度包括: - 权重量化:压缩模型权重。

  • 激活量化:压缩中间激活。

  • KV cache 量化:压缩推理缓存。

  • 训练时量化:降低微调显存。

QLoRA 主要关注 4-bit 权重量化的训练场景。

6. 4-bit Quantization

4-bit 表示每个量化值占 4 个 bit,理论上一个字节可以存两个权重值。相比 fp16:

fp16: 16 bit
4-bit: 4 bit
理论存储压缩约 4 倍。但实际还要保存 scale、zero point、量化 metadata,因此不是精确 4 倍。 4-bit 量化的挑战是表示范围和精度有限。普通均匀 int4 不一定适合神经网络权重分布。QLoRA 提出 NF4 来更好地匹配正态分布权重。

7. NF4

NF4 是 NormalFloat 4-bit。它是 QLoRA 论文提出的一种 4-bit 数据类型,设计目标是更好地表示近似正态分布的神经网络权重。 直觉:

普通 int4: 均匀量化区间
NF4: 针对正态分布设计非均匀量化 codebook
神经网络预训练权重常近似零均值、类正态分布。NF4 用更适合这种分布的 4-bit codebook,减少量化误差。 面试中可以这样说:

NF4 是适配正态分布权重的 4-bit 量化格式,比普通均匀 int4 更适合 QLoRA 中的冻结权重量化。

img

图是NF4 CodeBook(码本),想要详细了解如何构建这个映射表并进行量化映射,可以找原QLORA论文读一读。

8. Double Quantization

量化时需要保存 scale 或 quantization constants。对于大模型,这些 constants 本身也会占显存。 Double quantization 的思想是:

不仅量化权重,也进一步量化量化常数。
这样可以进一步减少 metadata 显存开销。 QLoRA 论文中 double quantization 是重要显存优化之一。它不改变 LoRA 训练目标,而是降低量化模型存储成本。

9. Paged Optimizer

训练长序列或大 batch 时,显存可能出现峰值,尤其是优化器状态和激活导致瞬时显存压力。 Paged optimizer 利用统一内存机制,在显存压力大时把部分优化器状态分页到 CPU 内存,缓解 GPU 显存峰值。 它的目标不是提升计算速度,而是避免显存峰值导致 OOM。 面试表达:

Paged optimizer 解决的是训练时显存峰值问题,尤其适合 QLoRA 这种低显存微调大模型的场景。

10. QLoRA 的前向与反向

QLoRA 中,base model 权重以 4-bit 存储,但计算时通常会反量化到计算 dtype,例如 bf16。 线性层可以理解为:

y = dequant(W_4bit) x + LoRA(x)
反向传播时: - 量化 base weight 冻结,不更新。

  • LoRA A/B 有梯度并更新。

  • 激活仍需要保存或重算。

  • optimizer 状态只对应 LoRA 参数。

因此 QLoRA 省显存主要来自 base weight 4-bit 存储和只训练 LoRA 参数。

11. QLoRA 配置要点

常见配置包括:

load_in_4bit=True
bnb_4bit_quant_type="nf4"
bnb_4bit_use_double_quant=True
bnb_4bit_compute_dtype=torch.bfloat16
LoRA rank r
LoRA alpha
target modules
LoRA dropout
compute_dtype 很重要。4-bit 是存储格式,矩阵计算通常在 bf16/fp16 中进行。bf16 常比 fp16 更稳定,前提是硬件支持。

12. QLoRA 的优势

QLoRA 的主要优势: - 显著降低 base model 显存。

  • 可以在更小 GPU 上微调更大模型。

  • 保留 LoRA 的参数高效和多任务 adapter 管理优势。

  • 适合 SFT、领域微调、格式遵循等场景。

  • 训练后只保存 adapter,部署灵活。

QLoRA 的代表性意义是让研究者和工程团队在有限硬件上微调大模型成为可能。

13. QLoRA 的局限

QLoRA 的局限包括: - 量化引入误差,效果可能略受影响。

  • 训练速度可能受量化/反量化 kernel 影响。

  • 对 bitsandbytes、CUDA、GPU 架构和 dtype 支持有依赖。

  • 不是所有层或模型结构都稳定支持 4-bit 训练。

  • 激活显存仍然存在,长序列训练仍可能 OOM。

  • 如果任务需要大幅改变模型能力,QLoRA/LoRA 容量可能不足。

QLoRA 省的是 base weight 和优化器状态的大头,不是让训练显存变成 0。

14. QLoRA 与全量量化微调

QLoRA 不是直接训练 4-bit 权重。它通常冻结量化 base model,只训练 LoRA adapter。 直接训练量化权重会更困难,因为低 bit 权重的梯度更新、量化误差和优化稳定性都复杂。 QLoRA 的设计选择是:

base model low-bit storage
adapter high-precision training
这在显存、稳定性和效果之间取得折中。

15. Prompt Tuning

Prompt Tuning 学习一组连续向量作为 soft prompt,拼接到输入 embedding 前面。 形式:

[soft prompt embeddings] + [input token embeddings]
原模型参数冻结,只训练 soft prompt 向量。 优点: - 参数量极少。

  • 多任务存储成本低。

  • 不改模型主体。

缺点: - 表达能力有限。

  • 小模型上效果可能较差。

  • 对 prompt 长度和初始化敏感。

16. P-Tuning

P-Tuning 也是学习连续提示,但通常通过更复杂的 prompt encoder 生成 soft prompt。P-Tuning v2 进一步把连续提示扩展到深层,增强表达能力。 直觉上:

Prompt Tuning: 直接学习 prompt embeddings
P-Tuning: 用可训练网络生成或增强 prompt representations
P-Tuning 在中文 NLP 和早期大模型适配中常被讨论。与 LoRA 相比,它主要改输入提示表示,而不是改线性层权重。

17. Prefix Tuning

Prefix Tuning 学习每层 attention 的 prefix key/value。 在每一层 attention 中,真实 token 的 K/V 前面拼接一段可训练 prefix K/V:

K = [K_prefix; K_input]
V = [V_prefix; V_input]
这样模型在每层都能 attend 到一组任务相关的虚拟上下文。 优点: - 参数量小。

  • 不改原模型权重。

  • 对生成任务常有效。

缺点: - 会增加有效上下文长度或 attention 计算。

  • 推理时每层需要 prefix cache。

  • 表达方式和 LoRA 不同,部署复杂度可能更高。

18. Adapter Tuning

Adapter 在 Transformer 层中插入小型瓶颈模块:

h -> down projection -> activation -> up projection -> h + adapter(h)
原模型冻结,只训练 Adapter 参数。 优点: - 模块化,任务切换方便。

  • 表达能力较 prompt 类方法强。

  • 参数量远小于全量微调。

缺点: - 推理时增加额外模块,可能增加延迟。

  • 无法像 LoRA 一样简单 merge 到原线性层。

19. LoRA、QLoRA、Prompt、Prefix、Adapter 对比

简化对比:

LoRA:
  训练低秩权重增量,效果强,能 merge。

QLoRA:
  4-bit base + LoRA,显存更省。

Prompt Tuning:
  学 soft prompt,参数极少,能力较弱。

P-Tuning:
  用 prompt encoder 或深层 prompt 增强提示能力。

Prefix Tuning:
  学每层 attention prefix K/V,生成任务常用。

Adapter:
  插入瓶颈模块,模块化强,但推理增加额外计算。
方法选择取决于资源、任务难度、部署方式、效果要求和工程栈。

20. 训练数据与 Loss Mask

QLoRA 和其他 PEFT 方法只是训练技术,效果仍依赖数据。 SFT 中要注意: - chat template 正确。

  • 只让 assistant answer token 参与 loss。

  • padding token 不参与 loss。

  • 训练和推理模板一致。

  • 数据去重,避免评测泄漏。

如果 loss mask 错误,模型可能学习复述 prompt、输出特殊 token、格式混乱或验证指标虚高。

21. 评测与消融

微调实验应至少比较:

base model
LoRA
QLoRA
不同 rank
不同 target modules
不同数据规模
不同 decoding 设置
指标应覆盖: - 任务指标。

  • 格式遵循率。

  • 人工 badcase。

  • 训练显存。

  • 训练耗时。

  • adapter 大小。

  • 推理延迟。

QLoRA 的评测还要关注量化是否带来质量损失。

22. 常见工程问题

QLoRA 常见问题: - bitsandbytes/CUDA 版本不匹配。

  • GPU 不支持 bf16 或 4-bit kernel。

  • compute dtype 设置不当导致 NaN。

  • 没有正确 prepare model for k-bit training。

  • target modules 写错。

  • gradient checkpointing 与 cache 设置冲突。

  • tokenizer/chat template 不匹配。

  • 训练后只保存 adapter,推理时忘记加载 base model。

  • 量化模型 merge LoRA 后保存流程不清楚。

  • 长序列激活显存仍然 OOM。

排查顺序:

环境版本
模型加载 dtype
可训练参数
样本 decode
loss mask
显存日志
base vs adapter 输出对比

23. 面试中的核心表达

第八天内容可以压缩为:

QLoRA 是在 4-bit 量化 base model 上训练 LoRA adapter 的方法。
LoRA 省可训练参数和优化器状态,但 base model 仍占显存;QLoRA 进一步把 base 权重压到 4-bit。
QLoRA 的关键技术包括 NF4、double quantization 和 paged optimizer。
NF4 是适合正态分布权重的 4-bit 格式;double quantization 进一步量化 scale 等常数;paged optimizer 缓解显存峰值。
QLoRA 通常冻结量化权重,只训练高精度 LoRA 参数。
Prompt/Prefix/Adapter 也是 PEFT 方法,分别通过软提示、每层前缀 K/V、插入瓶颈模块适配任务。
方法选择要看显存、效果、部署、推理延迟和任务复杂度。

24. 参考资料

  • QLoRA: Efficient Finetuning of Quantized LLMs: https://arxiv.org/abs/2305.14314

  • LoRA: Low-Rank Adaptation of Large Language Models: https://arxiv.org/abs/2106.09685

  • Hugging Face PEFT LoRA Documentation: https://huggingface.co/docs/peft/main/en/package_reference/lora

  • Hugging Face PEFT Quantization Guide: https://huggingface.co/docs/peft/main/en/developer_guides/quantization

  • Hugging Face bitsandbytes Quantization Guide: https://huggingface.co/docs/transformers/main/en/quantization/bitsandbytes

  • Prefix-Tuning: Optimizing Continuous Prompts for Generation: https://arxiv.org/abs/2101.00190

  • The Power of Scale for Parameter-Efficient Prompt Tuning: https://arxiv.org/abs/2104.08691

  • GPT Understands, Too / P-Tuning: https://arxiv.org/abs/2103.10385

  • Parameter-Efficient Transfer Learning for NLP / Adapter: https://arxiv.org/abs/1902.00751

  • QLoRA 详解:https://zhuanlan.zhihu.com/p/666234324

  • QLoRA 原论文:https://arxiv.org/pdf/2305.14314

  • LoRA、Prompt Tuning、P-Tuning、Adapter、Prefix 对比:https://zhuanlan.zhihu.com/p/675231376

            预览时标签不可点
    

    <div class="