大模型原理--参数高效微调(QLoRA篇)
1.概述
QLoRA(Quantized Low-Rank Adaptation)在 LoRA 的基础上引入 4-bit 量化技术,在几乎不损失性能的前提下,将大语言模型微调的所需的显存大幅降低。
2.原理
QLoRA 的核心思想是:先对预训练模型权重和优化器状态的显存占用进行压缩,再在其上应用 LoRA 进行参数高效微调。整个流程包含三个关键技术组件:
(1)4-bit NormalFloat(NF4)量化
量化(Quantization) 是一种通过降低数值精度(例如从 16-bit 降至 4-bit)来压缩模型、节省显存的技术。传统 4-bit 量化通常采用如下流程:
①使用权重的最大绝对值(absmax)将权重归一化到区间;
②将该区间均匀划分为16(4bit二进制表示的最大值)个等距格点;
③每个权重被映射到最近的格点,并以对应的 4-bit 索引存储。

这种方法只需要存储4-bit的索引和absmax,然后经过算法就能原值近似还原。一般absmax使用32bit保存,如果有n个数,则需要显存是(32+4n)bit。而原始的数字则需要16n bit。当n比较大的时候,几乎省四分之三的显存。
实际观察到大语言模型的权重是近似服从标准正态分布(均值为 0,方差为 1)。所以QLoRA 使用4-bit NormalFloat(NF4)量化,将标准正态分布按累积概率均分为 16 个等概率区间;每个区间选取其中位数作为该区间的量化代表值。这样得到的量化格点在 0 附近更密集,在两端更稀疏,与权重的实际分布高度匹配,从而显著降低量化误差。参考上图中的过程,将NF4的16个等距点替换掉均匀分布的等距点,就可以进行NF4量化和反量化。
NF4的16个等距点
| Index | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| NF4 | 1 | 0.6962 | 0.5251 | 0.3949 | 0.2844 | 0.1848 | 0.0911 | 0 | -0.0911 | -0.1848 | -0.2844 | -0.3949 | -0.5251 | -0.6962 | -1 | / |
(2) 双重量化(Double Quantization)
为了保证精度,通常的做法是让每 64 个权重共享一个 32-bit 的缩放因子(Absmax)。虽然这种方法能有效控制量化误差,但这些大量的缩放因子自身也会带来显著的存储开销。QLoRA 使用“双重量化”:不仅对模型权重量化,更对这些高精度的缩放因子进行二次量化。其实现方式是,将缩放因子以 256 个为一组,使用 8-bit 数据类型进行二次量化,缩放因子所需的存储空间也得以大幅减少。
(3) 分页优化器(Paged Optimizers)
在微调过程中,优化器状态(如 Adam 的一阶矩、二阶矩)往往比模型权重本身更占显存。QLoRA 使用了 分页优化器(Paged Optimizer) 技术,使优化器状态能够按需加载、按需卸载,从而更加高效地利用显存。
其核心思路是:
① 将优化器状态拆分为多个小块(pages);
② 仅在需要更新某层时,临时把对应 page 载入到显存;
③ 更新完成后立即将该 page 写回内存,并从显存中释放;
3. 代码实践
from transformers import BitsAndBytesConfig, AutoModelForCausalLM
import torch
# 定义 NF4 量化配置
nf4_config = BitsAndBytesConfig(
load_in_4bit=True, # 开启 4-bit 加载
bnb_4bit_quant_type="nf4", # 量化类型指定为 NF4
bnb_4bit_use_double_quant=True, # 建议开启双重量化
bnb_4bit_compute_dtype=torch.bfloat16 # 反量化后的计算精度
)
# 使用配置加载模型(代码自动完成 NF4 量化)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf", # 替换为你的模型
quantization_config=nf4_config,
device_map="auto"
)
4. 总结:LoRA相对于全参微调主要降低了优化器状态,梯度和激活值对显存的占用。QLoRA在LoRA基础上,继续降低了模型参数和优化器状态对显存的占用。所以总体实现了仅更新少量参数或引入少量可训练模块,在显著降低资源消耗的同时,高效适配目标任务。

- 点赞
- 收藏
- 关注作者
评论(0)