全量微调时,每个参数大约要占 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 倍多:

所以,如果只训练很少一部分参数,梯度和优化器状态就只需要为这一小部分准备。
二、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 16B × A 的每一格,等于 B 里同一行的数乘上 A 里同一列的数。比如第 2 行第 3 列:2 × 3 = 6。