跳到主要内容

QLoRA(把第 03 章的冻结底座压到 4-bit,微调压进一张游戏卡)与 PEFT 全家

这一章讲三件事: 量化怎么把第 03 章账里的「权重 14 GB」砍成 4 GB; LoRA 的三位亲戚各自凭什么存在;以及训练完成后,适配器怎么「烘回」底座。 读完这一章,第 03 章末尾那句「8–12 GB」就兑现了。

1. 这一章讲什么

第 03 章把账算到了「≈14 GB 出头」:适配器省掉了梯度与优化器状态的大头, 但冻结的底座本体还占 14 GB。这一章补上最后一刀——量化(用更少的位数 表示每个数),把底座压到 4-bit;顺带把 LoRA 的三位亲戚请上台, 说清什么时候轮得到它们1

2. 顶层全景

16-bit 底座 14GB ──量化──→ 4-bit 底座 ≈3.5GB
│ │
└────── 冻结,不收梯度 ───┘

适配器(16-bit,正常训练)──→ 前向时:4-bit 反量化回 16-bit → 算 → 再量化回去

训练完成 ──merge──→ W+A·B 烘回一个标准模型(不再需要 PEFT 库)

图说:量化的只有「不动的底座」;正在学习的适配器保持 16-bit。

3. 核心原理

3.1 量化:用 16 个数代表全部权重

先把名词立正:量化就是压缩存储——每个数原来用 16 位存, 现在只用 4 位。4 位只有 16 种可能取值,相当于给全部权重强行规定 「只准用这 16 个数」,再记下每个原数离哪个最近2

代价是精度:被抹平的差异可能携带信息。QLoRA 的聪明处在于 只量化不动的东西:冻结底座压到 4-bit,正在学习的适配器保持 16-bit—— 学习需要的那份精确,一点没少3

账目上的效果:7B 底座从 14 GB 掉到约 3.5 GB;叠加第 03 章的适配器账, 56 GB 的全参训练被压到 8–12 GB,一张 24 GB 游戏卡稳稳放下4。 第 03 章末尾的「后话」到此兑现。

3.2 NF4:刻度怎么划,决定失真多小

同样 4-bit,刻度怎么划有讲究。笨办法是均匀刻度——16 个值等距排开。

神经网络(由大量简单的计算件连成网、靠调权重学任务的机器)的权重 有个统计特点:大部分数挤在零附近,少数离得远。

均匀刻度因此两头不讨好:在数密集的零附近浪费刻度,在数稀疏(零散、少见) 的远端又太粗。

QLoRA 用的格式叫 NF4(NormalFloat 4-bit):把 16 个刻度按正态分布 ——中间密、两头疏的钟形——的疏密来排。同样的 4 个 bit, 量化造成的偏差更小5

前向计算时,冻结的 4-bit 权重会被临时反量化回 16-bit 参与运算, 算完再量化回去——这个「反量化、计算、再量化」的循环由 bitsandbytes 库 自动完成,使用者无感6

3.3 两个附赠发明:双重量化,与分页(显存不够就整块搬出、要用再搬回)式的优化器

QLoRA 论文还顺手省了两笔小钱,每笔都有明确的机制7:

双重量化。量化本身需要存「量化常数」(记着怎么在 4-bit 值和真实数值间换算)。 双重量化把这些常数自己也量化了——平均每个参数的量化开销从 0.5 bit 降到 0.127 bit。

分页(内存不够时整块搬出、要用时再搬回)式的优化器管另一件事:崩溃。 显存偶尔会尖峰(比如来了一条特别长的输入),分页优化器借用 CUDA 统一内存: 显存吃紧时,把优化器状态暂时挪去内存条,缓过来再搬回去—— 防止「训练到 90% 突然爆显存」式的失败。书里给的配置名是 paged_adamw_32bit7

3.4 训练配置里的另外三个旋钮

书里把 LoRA 配置的完整清单补齐了,第 03 章讲过的之外还有三件8:

alpha 的稳健取值。α=2×r 仍是最稳起点;有实践者用 α=r 也行; α 相对秩过高会把支路输出放得过猛,训练不稳。

dropout(训练时随机「掐掉」一部分连接,逼模型别依赖单条通路的防过拟合手法)。 适配器上小数据集用 0.05–0.1,数据多、过拟合(第 02 章的老朋友)风险低时可以设 0。

目标模块的取舍。注意力四块是强默认;LLaMA 系架构要加前馈层时, 名字是 gate/up/down 三块;算力紧张时退回「查询+值」两块的旧打法9

3.5 LoRA 的三位亲戚

PEFT 是一族方法的总称,书里逐一过了一遍。共同点:都只训一小撮新增参数; 不同点在于「新增的是什么」10:

瓶颈适配器:在每个层里插一个「先压缩、再还原」的小模块—— 压到一个窄通道,过一道非线性(不是加权求和那种简单变换,比如「负数一律归零」), 再撑回原宽度11

它还有一条残差(把输入原样抄条近路、直接加到输出上)连线保底: 初始时模块形同不存在。瓶颈适配器的独门本领是可组合——多个任务的适配器 可以存储、互换、加权融合(AdapterFusion);但在大模型上, 它已被更省显存、与量化结合更顺的 LoRA 取代11

prefix tuning 与 prompt tuning 同属软提示(不往模型里加模块, 在输入前面拼几段「可学习的虚拟前缀」)一族。prefix tuning 在每层注意力的 键值上都拼;prompt tuning 只在输入嵌入层拼,要学的数极少, 而且效果随模型规模上涨——书里说在超大模型上它逼近全参微调12

IA3:最省的一族。连「新增数表」都不要,只学几条用来缩放的向量 (一串按顺序排好的数),逐元素地放大或缩小注意力键、值与前馈的激活13

书里给的量级:4096 宽、32 层的模型,IA3 的可学参数只有一两百万, 比典型 LoRA 配置再低一到两个数量级。适合极小数据, 和对延迟(用户等回答要等多久)极其敏感的场合; 代价是表达力有限,大行为偏移吃力13

3.6 收尾:把适配器烘回底座

训练完的适配器只有几 MB,部署却带着一个别扭:推理时要同时维护 底座和适配器两套计算。

顺带照录书内的一处口径不一:第 2 章说适配器存档「typically a few megabytes (通常几 MB)」,第 6 章讲复用时又说「a few hundred megabytes(几百 MB)」 ——两处对不上。本拆解统一取第 2 章的「几 MB」口径(与 r=16 配置的实情相符); 百 MB 量级对应的是更大的秩或更多目标模块,不改变「适配器远小于完整模型」 这个承重结论。PEFT 库给的解法是 merge_and_unload()—— 把 A·B 的乘积加回底座权重,烘成一个标准模型: 之后它就是一个普通的微调模型,推理不再需要 PEFT 库,也不再有支路的额外延迟14

烘回还带来一个工程红利:同一个底座可以分别挂多个任务适配器训练, 用时各自 merge,比维护 N 份完整微调模型省一个数量级的存储15

书里把全家摆进一张对比表。全参微调是基线—— 当作比较起点的那个参照,表里其他数字全部是相对它的变化16:

方法可训参数占比(7B)显存相对全参的质量
全参微调100%>56 GB基线
LoRA r=16~0.3%~28 GB95–99%
QLoRA(4-bit)~0.3%8–12 GB93–98%
瓶颈适配器~0.3%~28 GB90–97%
prefix tuning~0.07%~28 GB85–95%
prompt tuning~0.006%~28 GB80–95%(超大模型上有竞争力)
IA3~0.014%~28 GB85–95%

主走查:书里那台 phi-2 的完整配置单

把本章所有旋钮装到书里的实操上。模型是微软的 phi-2(27 亿参数), 训练数据是第 02 章那种 chat 格式的客服样例17:

1. 装载底座 BitsAndBytesConfig:4-bit、NF4、双重量化、bfloat16 计算精度
2. 预处理 prepare_model_for_kbit_training(为量化底座做好训练准备)
3. 挂适配器 LoraConfig:r=16, alpha=32, 打 q/k/v_proj 与 dense,
dropout=0.05 —— print_trainable_parameters() 核对可训参数
4. 训练 优化器 paged_adamw_32bit;学习率 2e-4;批量 2×梯度累积 4;
cosine 调度;3 个轮次
5. 存档 save_pretrained() —— 只存适配器,几 MB
6. 验证 拿两条没见过的客服请求试推理
7. 烘回 merge_and_unload() —— 得到不依赖 PEFT 的标准模型

图说:七步就是 QLoRA 微调的完整生命周期。

三个值得停一步的数:学习率 2e-4——比第 02 章全参微调的 2e-5 高一个数量级, 因为此刻在学的只有适配器,不是底座(与第 02 章「只训头时学习率反而要大」同一条理); 适配器只存几 MB——对照 7B 底座的 14 GB,这是「行为可以当成文件来管理」的物理基础, 第 09 章的适配器多路复用全靠它; 核对可训参数是挂上适配器后的第一件事——书里把它定为固定动作, 防止配置写错还蒙头训练18

4. 作者的判断与证据

**书里当证据给的:**QLoRA 与同秩 LoRA 质量上「基本等价」; 4-bit 推理(注意:推理量化,与本章的训练量化是两回事,见第 09 章) 的精度代价书里估为 1%–3%19

书里当立场给的:「LoRA 已在多数场景取代瓶颈适配器」是作者对现状的裁断, 理由是显存与量化兼容性11;prompt tuning 的价值被明确绑定在超大模型上12

**书里坦白没给的:**NF4 的「更小偏差」没有给偏差数字或分布图; 各方法的「质量百分比」区间(表里那些 85–99%)书里注明是跨任务的粗略综合, 不是单一基准的实测。

5. 边界与局限

  • 4-bit 量化不是免费的:对偏出正态的权重分布(某些层、某些任务), NF4 的优势会缩水;书里没有讨论反例;
  • merge 之后的模型无法再「卸下」适配:烘回是单向的, 想保留多任务切换就该留着适配器别烘——书里讲了两个选项, 没给决策规则(本章可带走第 7 条是我们的补充判断);
  • dropout、alpha 的取值区间都是经验值,书里没有附对照实验;
  • IA3 的「低延迟」优势以质量上限为代价,书里建议的适用面 (小数据、延迟敏感)是定性判断。

6. 可带走的

  1. 量化只压「不动的底座」,学习中的适配器保持 16-bit——这是 QLoRA 两全的原因;
  2. NF4 按正态分布排刻度:同样 4-bit,失真比均匀刻度小;
  3. 双重量化省的是「量化的量化」,分页优化器防的是显存尖峰崩溃;
  4. 适配器只有几 MB——行为第一次变成了「一个文件」;
  5. dropout 0.05–0.1 是小数据的默认;数据多可以设 0;
  6. 学习率 2e-4 起步:适配器的学习率比全参高一个数量级;
  7. 要多任务切换就留着适配器,要最大推理性能就 merge——先想清楚部署形态再烘 (这条是我们的补充判断。如果错,会错在: 若推理引擎的适配器热挂载已经 快到无感、且精度无损,「留适配器」就没有额外代价,取舍消失,怎么选都不会错);
  8. 三位亲戚的分工:要组合找瓶颈适配器,超大模型可试 prompt tuning,极小数据试 IA3。

7. 原文地图

主题原书章原文位置
量化的定义与 4-bit 的含义Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:71(搜「fewer bits」)
只量化冻结底座、适配器 16-bitParameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:79(搜「full 16-bit precision」)
14GB→3.5GB、56GB→12GBParameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:73(搜「3.5 gigabytes」)
NF4 按正态分布排刻度Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:77(搜「Normal Float 4-bit」)
反量化-计算-再量化循环Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:79(搜「Dequantization」)
双重量化 0.5→0.127 bitParameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:83(搜「0.127 bits」)
分页优化器Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:85(搜「paged optimizers」)
alpha 惯例与不稳风险Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:93(搜「twice the rank」)
dropout 取值Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:101(搜「0.05 to 0.1」)
目标模块取舍Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:97(搜「q_proj」)
瓶颈适配器与 AdapterFusionParameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:105(搜「bottleneck」) · :109(搜「AdapterFusion」)
prefix/prompt tuning 与规模效应Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:113(搜「continuous prefix vectors」) · :117(搜「scales dramatically with model size」)
IA3 缩放向量与参数量Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:121(搜「scalar vectors」) · :123(搜「1 to 2 million」)
方法对比表Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:129(搜「sets the baseline」) · :481(搜「Trainable」)
merge_and_unloadParameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:145(搜「W plus AB」) · :147(搜「merge_and_unload」)
适配器堆叠Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:149(搜「stacking」)
phi-2 实操配置Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:75(搜「nf4」) · :283(搜「r=16」) · :357(搜「2e-4」)
学习率 2e-4 与 print_trainable_parametersParameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:357(搜「learning_rate=2e-4」) · :137(搜「print_trainable_parameters」)

Footnotes

  1. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 67 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:67,搜「Quantized LoRA」)。

  2. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 71 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:71,搜「16 possible values」)。「给全部权重规定只准用 16 个数」是对量化机制的复述。

  3. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 79 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:79,搜「are maintained at full 16-bit precision」)。

  4. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 23、73 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:23,搜「8 to 12 gigabytes」;:73,搜「3.5 gigabytes」)。

  5. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 77 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:77,搜「equally spaced quantization levels」)。

  6. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 79 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:79,搜「bitsandbytes」)。

  7. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 83、85 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:83,搜「double quantization」;:85,搜「unified memory」)。 2

  8. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 93 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:93,搜「twice the rank」)。

  9. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 97 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:97,搜「gate_proj」)。

  10. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 103–125 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:103,搜「Adapter Layers」)。

  11. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 109 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:109,搜「largely replaced」)。 2 3

  12. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 117 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:117,搜「scales dramatically with model size」)。 2

  13. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 121–125 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:121,搜「scalar vectors」;:125,搜「few-shot and low-data regimes」)。 2

  14. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 145–147 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:145,搜「W plus AB」;:147,搜「merge_and_unload」)。

  15. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 149 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:149,搜「adapter stacking」)。

  16. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 479–505 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:489,搜「Quality vs Full FT」)。表中「显存」列的 ~28 GB 为 LoRA 系方法口径,来自第 487 段。

  17. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 235–247 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:235,搜「microsoft/phi-2」;:237,搜「nf4」)。

  18. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 137 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:137,搜「print_trainable_parameters」)。书里称它是建完 PEFT 模型后「should make 的第一个调用」。

  19. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 131、143 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:131,搜「essentially equivalent」;:143,搜「1 to 3 percent」)。