🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。
基本信息
标题 : QLoRA: Efficient Finetuning of Quantized LLMs
作者 : Tim Dettmers, Artidoro Pagnoni, Ari Holtzman, Luke Zettlemoyer
发表 : NeurIPS 2023
arXiv : https://arxiv.org/abs/2305.14314
摘要
我们提出了QLoRA,一种高效的微调方法,能够将内存使用量降低到足以在单个48GB GPU上微调一个65B参数模型,同时保持完整的16位微调任务性能。
QLoRA通过冻结的、4位量化预训练语言模型将梯度反向传播到低秩适配器(LoRA)。
我们最好的模型系列,命名为Guanaco,在Vicuna基准测试中优于所有之前公开发布的模型,达到ChatGPT性能的99.3%,而只需在单个GPU上微调24小时。
QLoRA引入了多项创新以节省内存而不牺牲性能:
- 4-bit NormalFloat,一种信息论上对正态分布权重最优的新数据类型;
- Double Quantization,通过量化量化常数来减少平均内存占用;
- Paged Optimizers来管理内存峰值。
我们使用QLoRA微调了超过1000个模型,对8个指令数据集、多种模型类型(LLaMA、T5)和模型规模(例如33B和65B参数模型)的指令遵循和聊天机器人性能进行了详细分析,这些规模使用常规微调是不可行的。
我们的结果表明,在小型高质量数据集上进行的QLoRA微调可以达到最先进的结果,即使使用比之前SoTA更小的模型。
我们根据人类和GPT-4评估对聊天机器人性能进行了详细分析,表明GPT-4评估是廉价且合理的替代品。此外,我们发现当前的聊天机器人基准测试无法准确评估聊天机器人的性能水平。
柠檬采摘分析展示了Guanaco与ChatGPT相比失败的地方。
我们发布了所有模型和代码,包括4位训练的CUDA内核。
简介
不同的微调方法和它们的内存需求。QLoRA通过将Transformer模型量化到4位精度并使用分页优化器来处理内存峰值,在LoRA的基础上进行了改进。
背景
Block-wise k-bit Quantization
量化是将输入从一个包含更多信息的表示转换为包含较少信息的表示的过程。它通常意味着将具有更多位的数据类型转换为更少位,例如从32位浮点数转换为8位整数。为了确保低比特数据类型的整个范围被使用,输入数据类型通常通过归一化到输入元素绝对最大值来重新缩放到目标数据类型范围,这些输入元素通常以张量的形式结构化。例如,将32位浮点(FP32)张量量化为范围 [ − 127 , 127 ] [-127, 127] [−127,127] 的Int8张量:
X Int8 = round ( 127 absmax ( X FP32 ) X FP32 ) = round ( c FP32 ⋅ X FP32 ) \mathbf{X}^{\text{Int8}} = \text{round}\left(\frac{127}{\text{absmax}(\mathbf{X}^{\text{FP32}})} \mathbf{X}^{\text{FP32}}\right) = \text{round}(c^{\text{FP32}} \cdot \mathbf{X}^{\text{FP32}}) XInt8=round(absmax(XFP32)127XFP32)=round(cFP32⋅XFP32)
其中 c c c 是量化常数或量化尺度。反量化是其逆过程:
dequant ( c FP32 , X Int8 ) = X Int8 c FP32 = X FP32 \text{dequant}(c^{\text{FP32}}, \mathbf{X}^{\text{Int8}}) = \frac{\mathbf{X}^{\text{Int8}}}{c^{\text{FP32}}} = \mathbf{X}^{\text{FP32}} dequant(cFP32,XInt8)=cFP32XInt8=XFP32
这种方法的问题是,如果在输入张量中出现大数值(即异常值),则量化箱------某些位组合------没有得到充分利用,有些箱几乎没有或没有数字被量化。
为防止异常值问题,一种常见的方法是将输入张量分割成独立量化的块,每个块都有自己的量化常数 c c c。这可以形式化如下:我们将输入张量 X ∈ R b × h \mathbf{X} \in \mathbb{R}^{b \times h} X∈Rb×h 分割成 n n n 个连续的块,每个块大小为 B B B,通过展平输入张量并将线性段切分为 n = ( b × h ) / B n = (b \times h)/B n=(b×h)/B 块。我们独立地量化这些块,使用方程1创建量化张量和 n n n 个量化常数 c i c_i ci。
Low-rank Adapters
低秩适配器(LoRA)微调是一种通过使用一组可训练参数(通常称为适配器)减少内存需求的方法,同时不更新保持固定的完整模型参数。在随机梯度下降期间,梯度通过固定预训练模型权重传递给适配器,该适配器被更新以优化损失函数。LoRA 通过额外的因子投影增强线性投影。给定一个投影 X W = Y \mathbf{XW} = \mathbf{Y} XW=Y 其中 X ∈ R b × h \mathbf{X} \in \mathbb{R}^{b \times h} X∈Rb×h, W ∈ R h × o \mathbf{W} \in \mathbb{R}^{h \times o} W∈Rh×o,LoRA 计算:
Y = X W + s X L 1 L 2 \mathbf{Y} = \mathbf{XW} + s \mathbf{XL}_1 \mathbf{L}_2 Y=XW+sXL1L2
其中 L 1 ∈ R h × r \mathbf{L}_1 \in \mathbb{R}^{h \times r} L1∈Rh×r 和 L 2 ∈ R r × o \mathbf{L}_2 \in \mathbb{R}^{r \times o} L2∈Rr×o,且 s s s 是标量。
QLoRA Finetuning
QLoRA通过我们提出的两种技术实现了高保真4位微调------4位NormalFloat(NF4)量化和双重量化。此外,我们引入了分页优化器,以防止梯度检查点期间的内存峰值导致传统上使大型模型在单机上微调困难的内存不足错误。
QLoRA有一个低精度存储数据类型,在我们的案例中通常是4位,还有一个通常是BFloat16的计算数据类型。在实践中,这意味着每当使用QLoRA权重张量时,我们将张量反量化为BFloat16,然后进行16位矩阵乘法。
现在我们讨论QLORA的组件,然后给出QLoRA的正式定义。
4-bit NormalFloat Quantization
NormalFloat(NF)数据类型建立在分位数量化之上,这是一种信息论上最优的数据类型,确保每个量化区间从输入张量中分配相同数量的值。分位数量化通过经验累积分布函数估计输入张量的分位数。
分位数量化的主要局限性在于分位数估计过程成本高昂。因此,使用快速分位数近似算法,如SRAM分位数,来估计它们。由于这些分位数估计算法的近似性质,该数据类型对于异常值具有较大的量化误差,而异常值通常是最重要的值。
当输入张量来自一个固定到量化常数的分布时,可以避免昂贵的分位数估计和近似误差。在这种情况下,输入张量具有相同的分位数,使得精确的分位数估计在计算上是可行的。
由于预训练神经网络权重通常具有均值为零、标准差为 σ \sigma σ 的正态分布,我们可以通过缩放 σ \sigma σ 将所有权重转换为单一固定分布,使得该分布正好适合我们的数据类型范围。对于我们的数据类型,我们设定了任意范围 [ − 1 , 1 ] [-1, 1] [−1,1]。因此,数据类型和神经网络权重的分位数都需要归一化到这个范围内。
理论上最优的数据类型适用于均值为零、标准差为 σ \sigma σ 的正态分布,且 σ \sigma σ 在 [ − 1 , 1 ] [-1, 1] [−1,1] 范围内,计算方法如下:
- 估计理论 N ( 0 , 1 ) N(0, 1) N(0,1) 分布的 2 k + 1 2^k + 1 2k+1 个分位数,以获得 k k k 位量化数据类型用于正态分布;
- 取此数据类型并将其值归一化到 [ − 1 , 1 ] [-1, 1] [−1,1] 范围内;
- 通过绝对最大值重新缩放,将输入权重张量量化到 [ − 1 , 1 ] [-1, 1] [−1,1] 范围内。
一旦权重范围和数据类型范围匹配,我们可以像往常一样进行量化。步骤3等价于重新缩放权重张量的标准差,使其与 k k k 位数据类型的标准差相匹配。更正式地,我们估计数据类型的 2 k 2^k 2k 个值 q i q_i qi 如下:
q i = 1 2 ( Q X ( i 2 k + 1 ) + Q X ( i + 1 2 k + 1 ) ) q_i = \frac{1}{2} \left( Q_X \left( \frac{i}{2^k + 1} \right) + Q_X \left( \frac{i + 1}{2^k + 1} \right) \right) qi=21(QX(2k+1i)+QX(2k+1i+1))
其中 Q X ( ⋅ ) Q_X(\cdot) QX(⋅) 是标准正态分布 N ( 0 , 1 ) N(0, 1) N(0,1) 的分位数函数。对称 k k k 位量化的一个问题是,这种方法没有精确表示零,这对于量化填充和其他零值元素时无误差是一个重要属性。为了确保离散零点为 0 0 0,并使用所有 2 k 2^k 2k 位作为 k k k 位数据类型,我们创建了一个不对称的数据类型,通过估计两个范围 q i q_i qi 的分位数: 2 k − 1 2^{k-1} 2k−1 用于负部分, 2 k − 1 + 1 2^{k-1} + 1 2k−1+1 用于正部分,然后统一这两组 q i q_i qi 并去除两组中出现的其中一个零。我们将每个量化箱具有相同期望值数量的数据类型称为 k k k 位 NormalFloat (NFk),因为该数据类型信息理论上最适合均值为中心的正态分布数据。
Double Quantization
我们引入了Double Quantization(DQ),即对量化常数进行量化以节省额外的内存。虽然 4 4 4 位量化需要较小的块大小以实现精确量化,但它也具有相当大的内存开销。例如,使用 32 32 32 位常数和 64 64 64 的块大小 W \mathbf{W} W,量化常数平均为每个参数增加 32 / 64 = 0.5 32/64 = 0.5 32/64=0.5 位。双重量化有助于减少量化常数的内存占用。
更具体地说,双重量化将第一次量化的量化常数 c 2 FP32 c_2^{\text{FP32}} c2FP32 作为输入进行第二次量化。这第二步产生了量化后的量化常数 c 2 FP8 c_2^{\text{FP8}} c2FP8 和第二级量化常数 c 1 FP32 c_1^{\text{FP32}} c1FP32。我们使用 8 8 8 位浮点数和 256 256 256 的块大小进行第二次量化,因为对于 8 8 8 位量化没有观察到性能下降。由于 c 2 FP32 c_2^{\text{FP32}} c2FP32 是正数,我们在量化之前从 c 2 c_2 c2 中减去均值,使值集中在零附近,并利用对称量化。
平均而言,对于 64 64 64 的块大小,这种量化将每个参数的内存占用从 32 / 64 = 0.5 32/64 = 0.5 32/64=0.5 位减少到 8 / 64 + 32 / ( 64 ∗ 256 ) = 0.127 8/64 + 32/(64 * 256) = 0.127 8/64+32/(64∗256)=0.127 位,每个参数减少了 0.373 0.373 0.373 位。
Paged Optimizers
使用 NVIDIA 统一内存特性,该特性在 CPU 和 GPU 之间自动进行页面到页面的传输,以确保在 GPU 偶尔出现内存不足的情况下进行无错误的 GPU 处理。该功能类似于 CPU RAM 和磁盘之间的常规内存分页。我们使用此功能为优化器状态分配分页内存,当 GPU 内存不足时,这些内存自动被移至 CPU RAM,在优化器更新步骤需要内存时,这些内存又会自动回传到 GPU 内存中。
QLoRA
使用上述组件,我们为单线性层中的量化基础模型与单个 LoRA 适配器定义了 QLoRA,如下所示:
Y BF16 = X BF16 ⋅ doubleDequant ( c 1 FP32 , c 2 k -bit , W NF4 ) + X BF16 L 1 BF16 L 2 BF16 Y^{\text{BF16}} = X^{\text{BF16}} \cdot \text{doubleDequant}(c_1^{\text{FP32}}, c_2^{k\text{-bit}}, W^{\text{NF4}}) + X^{\text{BF16}} L_1^{\text{BF16}} L_2^{\text{BF16}} YBF16=XBF16⋅doubleDequant(c1FP32,c2k-bit,WNF4)+XBF16L1BF16L2BF16
doubleDequant ( c 1 FP32 , c 2 k -bit , W k -bit ) = dequant ( dequant ( c 1 FP32 , c 2 k -bit ) , W 4 bit ) = W BF16 \text{doubleDequant}(c_1^{\text{FP32}}, c_2^{k\text{-bit}}, W^{k\text{-bit}}) = \text{dequant}(\text{dequant}(c_1^{\text{FP32}}, c_2^{k\text{-bit}}), W^{4\text{bit}}) = W^{\text{BF16}} doubleDequant(c1FP32,c2k-bit,Wk-bit)=dequant(dequant(c1FP32,c2k-bit),W4bit)=WBF16
我们对 W W W 使用 NF4,对 c 2 c_2 c2 使用 FP8。为了提高量化精度,我们对 W W W 使用 64 的块大小,对 c 2 c_2 c2 使用 256 的块大小以节省内存。
在参数更新时,仅需要计算适配器权重 ∂ E ∂ L i \frac{\partial E}{\partial L_i} ∂Li∂E 相对于误差的梯度,而不需要计算 4-bit 权重 ∂ E ∂ W \frac{\partial E}{\partial W} ∂W∂E。然而, ∂ E ∂ L i \frac{\partial E}{\partial L_i} ∂Li∂E 的计算涉及到通过 Y BF16 Y^{\text{BF16}} YBF16 从存储形式 W NF4 W^{\text{NF4}} WNF4 解量化到计算数据类型 W BF16 W^{\text{BF16}} WBF16,以计算梯度 ∂ X ∂ W \frac{\partial X}{\partial W} ∂W∂X,并在 BFloat16 精度下完成。
总结来说,QLoRA 使用一种存储数据类型(通常为 4-bit NormalFloat)和一种计算数据类型(16-bit BrainFloat)。我们将存储数据类型解量化为计算数据类型以执行前向和后向传递,但仅为使用 16-bit BrainFloat 的 LoRA 参数计算权重梯度。
实验
QLoRA vs. Standard Finetuning
Pushing the Chatbot State-of-the-art with QLoRA
Limitations and Discussion
我们已经证明了我们的方法QLoRA,使用4位基模型和低秩适配器,可以复制16位全微调的性能。然而,由于资源成本巨大,我们没有在33B和65B规模上证明QLoRA可以匹配16位微调性能。
另一个限制是对指令微调模型的评估。虽然我们在MMLU、Vicuna/OA基准上提供了评估,但我们没有在BigBench、RAFT和HELM上评估,也不能保证我们的评估可以推广到这些基准。另一方面,我们在MMLU上进行了非常广泛的研究,并开发了评估聊天机器人新方法。
从所提供证据来看,这些基准的性能可能取决于微调数据与基准数据集的相似程度。例如,FLAN v2与MMLU相似,但与Vicuna基准不相似,反之亦然对于Chip2数据集。这表明,不仅需要更好的基准和评估,而且需要谨慎考虑最初要评估的内容。我们是要创建在教室高中和同事知识上表现良好的模型,还是要创建在聊天机器人对话能力上表现良好的模型?也许还有其他?因为与创建新的基准相比,评估现有的基准总是更容易,某些基准可能会引导社区走向某个方向。作为社区,我们应该确保基准衡量的是我们所关心的。
另一个限制是我们没有评估不同的位精度或不同的适配器方法。除了LoRA之外,还有许多参数高效微调(PEFT)方法已被证明效果良好。然而,不清楚这些方法是否可以扩展到大型模型。我们使用LoRA,因为许多结果已经证明了其鲁棒性,但其他适配器可能产生更好的性能。由于量化后的微调似乎可以恢复量化过程中丢失的大部分信息,这可能使得量化更加激进。例如,3位GPTQ量化在微调后也可能产生16位全微调的性能。
Broader Impacts
我们的QLoRA微调方法首次实现了在单个消费级GPU上对33B参数模型进行微调,以及在单个专业GPU上对65B参数模型进行微调,同时不会降低与完整微调基线相比的性能。我们已经证明,我们在Open Assistant数据集上训练的最佳33B模型在Vicuna基准测试中可以与ChatGPT相媲美。由于指令微调是将原始预训练LLM转换为类似ChatGPT的聊天机器人的重要工具,我们相信我们的方法将使微调变得普遍且常见,特别是对于资源最少的科研人员来说------这是对最先进NLP技术可及性的重大胜利。QLoRA可以被视为一种平衡因素,有助于缩小大型企业和拥有消费级GPU的小团队之间的资源差距。
另一个潜在的影响来源是将QLoRA部署到手机和其他低资源设备上。虽然之前已经证明7B模型可以在手机上运行,但QLoRA是第一个能够对这类模型进行微调的方法。我们估计,使用iPhone 12 Plus,QLoRA可以在手机充电时每晚微调300万个标记。QLoRA可以帮助实现LLM的隐私保护使用,用户可以拥有和管理自己的数据和模型,同时使LLM更容易部署。
此外,由于4位模型推理效率的提高,如果部署QLoRA模型,它们可以减少LLM在个人使用时产生的环境影响。我们估计,如果50%的部署是个人使用,50%是公司部署,QLoRA部署可以将总体碳足迹减少72%。
然而,微调是一种双刃剑技术,可能会被滥用造成伤害。LLM的广泛使用存在已知的危险,但我们相信,平等获取一种迅速普及的技术将允许进行更好的独立分析,而不是将LLM的权力掌握在那些不发布模型或源代码以供审计的大型企业手中。
总的来说,我们相信QLoRA将产生广泛积极的影响,使高质量LLM的微调变得更加广泛和容易获取。