QLoRA: Efficient Finetuning of Quantized LLMs
- QLoRA: Efficient Finetuning of Quantized LLMs
- arXiv 提交日期:23 May 2023
- 代码:QLoRA bitsandbytes
- 作者:
摘要
我们提出了 QLoRA,这是一种高效的微调方法,能够在保持完整 16 位微调任务性能的同时大幅降低显存占用,从而实现在单张 48GB GPU 上对 650 亿(65B)参数规模的模型进行微调。QLoRA 通过反向传播将梯度穿过一个已被冻结且经过 4 位量化的预训练语言模型,并更新至低秩适配器(LoRA)中。
我们最出色的模型系列命名为 Guanaco,它在 Vicuna 基准测试中超越了此前所有开源的模型,在仅需单卡微调 24 小时的情况下,达到了 ChatGPT 99.3% 的性能水平。QLoRA 引入了一系列创新技术以在不牺牲性能的前提下节省显存:1)4-bit NormalFloat (NF4):一种在信息论上针对正态分布权重达到最优的新数据类型;2) 双重量化(Double Quantization):通过对量化常数再次进行量化,进一步降低平均显存占用;3) 分页优化器(Paged Optimizers):用于有效管理训练过程中的显存峰值。
我们使用 QLoRA 微调了 1,000 多个模型,涵盖 8 个指令数据集、多种模型架构(LLaMA、T5)以及以往常规微调无法运行的大规模模型(如 33B 和 65B 参数模型),并对其指令遵循与对话能力进行了深入分析。实验结果表明,在小型高质量数据集上进行 QLoRA 微调即可取得当前最优(SOTA)性能,甚至在使用比以往 SOTA 更小的模型时依然成立。
我们结合人工评估与 GPT-4 自动评估对对话模型性能进行了详细分析,证实 GPT-4 评估是人工评估的一种低成本且合理的替代方案。此外,我们发现当前的对话模型基准测试尚不足以完全精准可信地评估模型的真实能力水平。通过“挑劣分析(Lemon-picked analysis)”,我们展现了 Guanaco 相比 ChatGPT 依然存在缺陷的具体失败案例。
我们已开源所有的模型与代码,包括用于 4 位训练的 CUDA 内核。
1. Introduction
- 背景:
- 已有量化方法主要为推理设计,无法用于训练/微调。
- QLoRA:通过冻结的 4-bit
量化预训练模型反向传播梯度,并更新低秩适配器(LoRA)参数。
- 4-bit NormalFloat:一种在信息论上针对零均值正态分布权重达到最优的新数据类型,实测表现显著优于传统的 4-bit 整型(Int4)和 4-bit 浮点型(Float4)。
- Double Quantization:一种对量化常数再次进行 8-bit 量化的方法,平均每个参数可节省约 0.37 bit 显存(对于 65B 模型可节省约 3 GB 显存)。
- Paged Optimizers:利用 NVIDIA 统一内存(Unified Memory)特性,在处理长序列 Mini-batch 产生梯度检查点显存峰值时,自动在 CPU RAM 与 GPU 显存间进行内存分页传输,避免 OOM。
- 效果:
- 显存大幅压减:将 65B 模型的微调显存开销从 >780 GB 降低至 <48 GB(单张 48GB 专业级 GPU 即可微调 65B 模型;单张 24GB 消费级 GPU 可微调 33B 模型),且运行速度与任务指标均未下降。
- 完全匹配 16-bit 性能:在各种模型规模(从 125M 到 65B)及多项学术基准测试(MMLU、GLUE、Super-NaturalInstructions)中,完全复现了 16-bit 全参数微调和 16-bit LoRA 的表现。
- 开源对话模型 Guanaco:基于 QLoRA 微调的 Guanaco 65B 模型仅需单卡训练 24 小时,在 Vicuna 基准测试中达到了 ChatGPT 99.3% 的性能水平;最小的 Guanaco 7B 仅需 5 GB 显存即可运行,性能超越 26 GB 显存的 Alpaca 13B 达 20 个百分点以上。
2. Background
Block-wise k-bit Quantization
- 朴素 int8 量化:
- 量化:通过输入张量的绝对最大值 \(\text{absmax}(X_{\text{FP32}})\) 进行归一化缩放,将其映射到 INT8 的数值区间 \([-127, 127]\)。公式为 \(X_{\text{Int8}} = \text{round}\left(\frac{127}{\text{absmax}(X_{\text{FP32}})} \cdot X_{\text{FP32}}\right) = \text{round}(c_{\text{FP32}} \cdot X_{\text{FP32}})\),其中 \(c_{\text{FP32}}\) 为量化常数(缩放因子)。
- 反量化:量化的逆操作,将 INT8 还原回浮点精度。公式为 \(\text{dequant}(c_{\text{FP32}}, X_{\text{Int8}}) = \frac{X_{\text{Int8}}}{c_{\text{FP32}}} = X_{\text{FP32}}\)。
- 问题:当输入张量中存在 极端离群值(Outliers,即数值极大的异常点) 时,会拉大整体缩放因子,导致量化桶(Quantization Bins)利用率极低,大部分桶内没有或很少有数值分布,从而产生严重的量化截断误差。
- 分 block 量化:
- 将输入张量 \(X \in \mathbb{R}^{b \times h}\) 展平并切分为 \(n = (b \times h) / B\) 个大小为 \(B\) 的连续块(Block),每个 Block 独立进行绝对最大值量化并拥有各自的量化常数 \(c_i\)。
- 优点:这种分块处理有效地隔离了离群值的影响,防止单个异常点破坏整个张量的量化精度。
Low-rank Adapters
- LoRA
- 冻结预训练基座模型参数,仅训练额外添加的低秩旁路适配器参数。
- 将原始线性投影 \(Y = XW\)(其中 \(X \in \mathbb{R}^{b \times h}, W \in \mathbb{R}^{h \times o}\))扩充为低秩分解的形式:\(Y = XW + s X L_1 L_2\),其中 \(L_1 \in \mathbb{R}^{h \times r}\)、\(L_2 \in \mathbb{R}^{r \times o}\)(低秩维度 \(r \ll \min(h, o)\)),\(s\) 为标量缩放因子。梯度在反向传播时穿过冻结的基座权重,仅对低秩矩阵 \(L_1\) 和 \(L_2\) 进行参数更新。
Memory Requirement of Parameter-Efficient Finetuning
- 使用 LoRA 进行微调时显存占用情况:
- 微调过程中的显存大头来自于激活值梯度(Activation Gradients),而非可训练的 LoRA 参数本身。
- 以 LLaMA 7B 模型(Batch Size=1,序列长度=512)为例:
- 4-bit 基座模型权重占用 5,048 MB 显存。
- LoRA 适配器参数(占原模型 0.2% 参数量)仅占用 26 MB 显存。
- 未使用梯度检查点时,LoRA 输入梯度占用 567 MB 显存。
- 开启梯度检查点(Gradient Checkpointing)后,输入梯度显存大幅压减至平均每序列 18 MB。
- 核心结论:过度缩减 LoRA 参数量对降低总显存收益微乎其微;相反,可以在 Transformer 模型的所有线性层上全面插入 LoRA 适配器,在几乎不增加显存负担的前提下最大程度恢复 16-bit 全参数微调的性能。
3. QLoRA Finetuning
3.1 4-bit NormalFloat Quantization
理论背景
- 理论:
- 分位数量化(Quantile Quantization)是一种在信息论上最优的数据类型,它能确保输入张量的数值均匀分配到每个量化桶(Quantization Bin)中。
- 问题:
- 传统分位数量化依赖于经验累积分布函数对输入张量的分位数进行估计,计算成本高昂;而采用 SRAM 分位数等快速近似算法会引入明显的估计误差,尤其在离群值(Outliers)上会产生较大的量化失真。
- NF4 的构造与优化:
- 正态分布假设:预训练神经网络的权重通常服从均值为 0、标准差为 \(\sigma\) 的正态分布 \(N(0, \sigma^2)\),因此所有权重张量都可以归一化到同一个固定分布中进行精准的分位数估算。
- 分位数映射:通过估计标准正态分布 \(N(0, 1)\) 的 \(2^k + 1\) 个分位数,将其归一化到 \([-1, 1]\) 区间,并通过绝对最大值缩放(Absmax Rescaling)将权重张量映射到同等范围。
- 非对称设计与精确零点:为了解决对称量化缺乏精确 0 表示的问题(0 表示对于 Padding 和掩码补零至关重要),NF4 采用了非对称设计:分别估计负数区域 \(2^{k-1}\) 个分位数和正数区域 \(2^{k-1}+1\) 个分位数,合并点集并消除重复的 0,得到了具有离散零点且每个桶期望数值相等的 4-bit NormalFloat (NF4) 数据类型。
3.2 Double Quantization
- 问题:
- 为保证 4-bit 量化精度,需要使用较小的块大小(Blocksize,如 \(W\) 使用 blocksize = 64),但这会导致 32-bit 量化常数 \(c_1^{\text{FP32}}\) 带来不小的显存开销,平均每个参数需额外占用 \(32 / 64 = 0.5\text{ bits}\) 。
- Motivation:
- 量化常数本身也是一组浮点数张量,可以对其进行二次量化(Quantize the Quantization Constants),从而进一步压缩显存占用空间。
- 量化过程:
- 将第一层量化产生的 32-bit 常数 \(c_1^{\text{FP32}}\) 作为第二次量化的输入。
- 先从 \(c_1^{\text{FP32}}\) 中减去均值 \(\mu_{c1}\)(使正数常数归零中心化,以便使用对称量化)。
- 对减去均值后的常数采用 blocksize = 256 进行 8-bit 浮点(FP8)二次量化,得到压缩后的量化常数 \(c_1^{\text{FP8}}\) 及第二级 32-bit 常数 \(c_2^{\text{FP32}}\) 。
- 显存开销由 \(0.5\text{ bits/param}\) 降低至 \(8/64 + 32/(64 \times 256) = 0.127\text{ bits/param}\),平均每个参数节省 0.373 bits(对于 65B 模型可节省约 3 GB 显存)。
- 反量化过程:
- 公式为 \(\text{doubleDequant}(c_2^{\text{FP32}}, c_1^{\text{FP8}}, W_{\text{4bit}}) = \text{dequant}(\text{dequant}(c_2^{\text{FP32}}, c_1^{\text{FP8}}) + \mu_{c1}, W_{\text{4bit}}) = W_{\text{BF16}}\) 。
3.3 Paged Optimizers
- 运作机制:利用 NVIDIA 统一内存(CUDA Unified Memory)的分页传输功能,为优化器状态分配分页内存(Paged Memory)。当 Mini-batch 序列较长导致梯度检查点触发显存峰值(Memory Spikes)时,系统会自动将暂不使用的优化器状态换出(Evict)至 CPU 内存;在优化器更新步骤需要该状态时,再自动换回(Page-in)至 GPU 显存。
- 解决痛点:解决了单卡微调超大模型(如 33B 和 65B 参数规模)时因序列过长引发显存 Spike 导致的 Out-of-Memory (OOM) 报错崩溃问题。
3.4 QLoRA
- 形式化定义(针对单线性层及单 LoRA 旁路的矩阵乘法):
\[ Y_{\text{BF16}} = X_{\text{BF16}} \text{doubleDequant}(c_2^{\text{FP32}}, c_1^{\text{FP8}}, W_{\text{NF4}}) + X_{\text{BF16}} L_1^{\text{BF16}} L_2^{\text{BF16}} \]
其中 \(\text{doubleDequant}(c_2^{\text{FP32}}, c_1^{\text{FP8}}, W_{\text{4bit}}) = \text{dequant}(\text{dequant}(c_2^{\text{FP32}}, c_1^{\text{FP8}}), W_{\text{4bit}}) = W_{\text{BF16}}\)。
- 存储与计算数据类型分离:
- 存储数据类型(Storage Data Type):使用 4-bit NormalFloat (NF4) 存储冻结的预训练基座权重 \(W\) 。
- 计算数据类型(Computation Data Type):使用 16-bit BrainFloat (BFloat16) 进行矩阵乘法计算。
- 前向与反向传播逻辑:
- 在前向传播和反向传播过程中,实时将存储状态的 \(W_{\text{NF4}}\) 解量化为计算状态的 \(W_{\text{BF16}}\) 。
- 反向传播时,利用 \(W_{\text{BF16}}\) 通过链式法则计算输入梯度 \(\frac{\partial E}{\partial X}\) 以向前一层传递,但仅计算并更新 16-bit BFloat16 格式的 LoRA 权重梯度 \(\frac{\partial E}{\partial L_i}\),完全不更新基座权重 \(W\) 。
4. Conclusion
- QLoRA:Quant + LoRA
- NF4 存储 & BF16 计算
- 主要创新:
- NF4 格式:对符合正态分布的预训练模型权重达到理论最优的量化结果。
- 双重量化:进一步减少每个参数存储占用。
- Paged Optimizers:降低 OOM 风险。