大模型原理--参数高效微调(QLoRA篇)

举报
剑指南天 发表于 2026/05/02 18:29:57 2026/05/02
【摘要】 QLoRA 的核心思想是:先对预训练模型权重和优化器状态的显存占用进行压缩,再在其上应用 LoRA 进行参数高效微调。

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基础上,继续降低了模型参数和优化器状态对显存的占用。所以总体实现了仅更新少量参数或引入少量可训练模块,在显著降低资源消耗的同时,高效适配目标任务。


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。