LoRA 与 QLoRA

3,157 字 · 预计阅读 9 分钟

全量微调时,每个参数大约要占 18 字节显存。Qwen3.5-0.8B 连视觉编码器在内约有 8.7 亿参数,全量微调要将近 16GB,一张 8GB 显存的显卡装不下。

但用 LoRA 微调,它只要 2GB 左右,再加上训练时的中间结果。这中间差了 8 倍多的显存,是怎么省下来的?

模型越大,这个差距越要命:80 亿参数的模型,全量微调要 140 多 GB,一张卡根本装不下。

这一节讲清楚 LoRA 和 QLoRA 的原理,再用一段程序,按 Qwen3.5-0.8B 每一层的真实形状,算出 LoRA 要训练多少参数、占多少显存。

学完你能做到:看懂微调配置里 lora_rank、lora_alpha、lora_target 这些参数的含义,并且为自己的显卡选出合适的方案。


一、全量微调为什么那么贵

全量微调要更新模型的每一个参数。每个参数在显存里不止存一份:

要存的东西 每个参数占多少
16 位的权重本身 2 字节
16 位的梯度 2 字节
优化器 AdamW 的两份状态,32 位 8 字节
32 位的权重副本,用来精确累加更新 4 字节
其他开销 约 2 字节

表里的两份优化器状态,前面预训练时讲过:AdamW 会给每个权重记两个数,记住它最近是怎么调的。

32 位的副本也讲过:16 位的刻度太稀,每一步的小改动要记在 32 位的数上,才不会被抹掉。

加起来大约 18 字节,这就是全量微调显存估算的来源。显存的大头不在权重本身,而在训练要用的梯度和优化器状态。

拿 Qwen3.5-0.8B 算一下:8.7 亿个参数,每个 18 字节,8.7 亿 × 18 ≈ 157 亿字节,约 15.7GB,这就是开头说的"将近 16GB"。

用 LoRA 时,底座只存 16 位的权重本身,约 1.7GB;要训练的那一小部分参数,梯度和优化器状态加起来不到 0.2GB。两样合计约 1.9GB,15.7 ÷ 1.9 ≈ 8.2,差了 8 倍多:

全量微调每个参数要 18 字节,合计约 15.7GB;LoRA 只多出一小条训练状态,合计约 1.9GB

所以,如果只训练很少一部分参数,梯度和优化器状态就只需要为这一小部分准备。


二、LoRA:不改原书,只贴便利贴

把预训练好的模型想象成一本印刷好的教材。全量微调,相当于把整本书重新排版印刷。

LoRA 的做法是:原书一个字都不动,只在需要的地方贴上便利贴,写上补充说明。训练的只是这些便利贴。

落到数学上,模型里的每个线性层都是一个大矩阵 W。微调要学的,其实是一个变化量 ΔW,新的权重就是 W + ΔW。

LoRA 的关键假设是:这个变化量不需要那么多自由度,可以用两个很"窄"的矩阵相乘来近似:

ΔW ≈ B × A

W:d_out × d_in    原来的大矩阵,冻结,不训练
A:r × d_in        新加的小矩阵,训练
B:d_out × r       新加的小矩阵,训练

Δ 是希腊字母,读作"德尔塔",数学里常用它表示"变化量"。ΔW 就是 W 要变多少。

r 叫秩(rank),一般取 8 到 64,远小于 d_in 和 d_out。

两个窄矩阵,怎么就能"近似"一个大矩阵?看一个 4 × 4 的小例子:B 是 4 行 1 列,A 是 1 行 4 列,r = 1。看懂就行,不用敲:

B        A                    B × A
1    ×   1  2  3  4     =     1  2  3  4
2                             2  4  6  8
3                             3  6  9  12
4                             4  8  12 16

B × A 的每一格,等于 B 里同一行的数乘上 A 里同一列的数。比如第 2 行第 3 列:2 × 3 = 6。

本文是会员内容

全文 3,157 字,已试读约 29%。开通专业版可阅读全文,并解锁全部官方课程与后续更新。

开通专业版

支持 7 天无理由退款 · 早鸟价 99 元/年(售完恢复365/年)

课程中涉及的第三方项目,其著作权与商标归各自权利人所有;引用处的署名与许可见《开源与来源说明》。