QLora论文阅读
摘要
QLora是一种非常有效的微调办法,可以对具有大规模模型参数的模型进行微调。例如它可以用来微调一个具有 650 亿个参数的大型模型,更重要的是,QLORA 能让这个巨大的模型在单个 48GB 的 GPU 上完成微调,还能保持与 16 位全精度微调相同的性能。
最好的模型被命名为Guanaco,可以在单个GPU上用很短的时间完成训练,同时表现非常好。
QLora的创新之处
4比特量化 【4-bit NormalFloat (NF4)】
是一个新的数据类型,它针对通常分布的权重进行了优化。NF4 可以更有效地表示那些遵循正态分布的权重参数,从而在保持精度的情况下,用更少的比特位数来存储这些参数。
双重量化
双重量化技术旨在通过进一步量化量化常数来减少内存占用。在常规的量化过程中,量化常数(如量化因子、偏移量等)通常保持较高的精度(如32位浮点数),这也会占用一定的内存空间。双重量化将第一次量化的量化常数作为第二次量化的输入,使用较低精度的数据类型(如8位浮点数)进行第二次量化。这种方法能够显著减少量化常数所占用的内存空间,从而进一步降低整体内存占用。
分页优化器
分页优化器是一种利用NVIDIA统一内存管理技术的优化器,旨在解决在训练大型模型时可能出现的内存峰值问题。当GPU内存不足时,分页优化器能够自动将部分数据(如梯度检查点等)从GPU内存转移到CPU内存中,以释放GPU内存空间。当需要这些数据时,分页优化器会再次将它们从CPU内存移回GPU内存。通过这种方式,分页优化器能够在不牺牲性能的前提下有效管理内存使用,避免内存溢出错误的发生。
泛化能力
QLora有很强的泛化能力,实验结果表明,不管是大模型还是小模型,经过QLora微调后,模型的表现能力都很好。
介绍
QLORA(Quantization with Low-rank ORthogonal Adapters)是一种创新的量化方法,它首先使用高精度的技术将一个预训练模型量化到4位,然后添加一组可学习的低秩正交适配器(Low-rank Orthogonal Adapters)权重。这些适配器权重通过量化权重的反向传播梯度进行调整,以在保持模型性能的同时进一步减少量化带来的精度损失。
训练模型的趋势
(1)数据质量远比数据集大小重要
(2)对于给定任务,数据集的适用性比大小更重要
创新之处
(1)4-bit NormalFloat 4bit量化
(2)Double Quantization 双重量化
(3)Paged Optimizers 分页优化器
比较
背景
量化
量化是将输入从包含更多信息的表示离散化为包含较少信息的表示的过程。 它通常意味着采用更多位的数据类型并将其转换为更少的位。
输入数据类型通常通过输入元素的绝对最大值进行标准化,重新调整为目标数据类型范围,例如,将 32 位浮点 (FP32) 张量量化为范围为 [−127, 127] 的 Int8 张量
这种量化方法的弊端
在量化过程中,我们通常会将连续的浮点数映射到离散的量化级别上,这些量化级别由一系列的“量化桶”(quantization bins)或“量化区间”(quantization intervals)表示。每个桶对应一个特定的位组合(bit combination),并代表一个量化后的值。当输入张量中存在大量的小值或中等值时,这些值可以很好地分布到各个量化桶中,从而有效利用每个桶。然而,如果输入张量中包含一个或多个极端大或极端小的值(即异常值),情况就会变得复杂。这些异常值可能会占用原本设计为容纳较小或中等值的桶
量化弊端的解决
名词解释
适配器
在深度学习领域,特别是在处理大型语言模型(LLM)时,适配器(Adapters)是一种参数高效的微调(PEFT)方法。适配器的核心思想是在保持预训练模型大部分参数固定的情况下,通过引入一小部分可训练的参数(即适配器)来适应新的任务或数据。LoRA是一种特殊的适配器技术,它通过引入两个低秩矩阵(L1和L2)来近似原始权重矩阵的一个低秩更新
梯度检查点
梯度检查点是一种深度学习优化技术,旨在减少神经网络训练过程中的内存占用。在训练深度学习模型时,通常需要存储每一层的激活值(即网络层的输出),以便在反向传播时计算梯度。然而,当网络层数非常多时,这些激活值会占用大量的内存。梯度检查点技术通过只在前向传播时保存部分激活值的信息,并在反向传播时重新计算其他激活值,从而减少了内存的使用。具体来说,它在前向传播时使用特定的函数(如PyTorch中的torch.utils.checkpoint.checkpoint)来标记需要保存检查点的层。在反向传播时,这些检查点被用来重新计算之前未保存的激活值,从而避免了在内存中存储所有激活值的需求。
参数高效微调的内存要求
由于LoRA的内存占用非常小,我们可以使用更多的适配器来提高性能,而不会显著增加总内存使用量。尽管LoRA被设计为一种参数高效的微调(PEFT)方法,但在大型语言模型(LLM)微调中,大部分内存占用实际上来自于激活梯度,而不是学习的LoRA参数。通过使用梯度检查点技术,输入梯度的平均内存占用可以进一步降低到每个序列18MB,这使得它们比所有LoRA权重组合起来还要占用更多内存。相比之下,基础模型(假设为4位精度)消耗了5048MB的内存。这强调了梯度检查点技术的重要性,但也表明大幅度减少LoRA参数的数量只会带来微小的内存节省。因此,我们可以使用更多的适配器,而不会显著增加总体训练内存占用。
对于lora算法而言,使用更多的适配器意味着LoRA技术通过向预训练模型中的特定层(如Transformer的自注意力层或全连接层)注入低秩矩阵(A和B),来实现对模型的高效微调,而不需要重新训练整个模型。
QLORA四个创新介绍
QLora存储数据和计算数据介绍
QLora的存储数据类型通常是4位的,这意味着它可以以非常低的精度存储数据,这对于减少模型大小和加快推理速度非常有用。
QLora的计算数据类型则通常是BFloat16,这是一种专为浮点数运算优化的16位浮点数格式,它在保持较高精度的同时,相比传统的32位浮点数(如Float32)能够显著减少内存占用和计算量。
在实践中,当QLORA的权重张量被使用时,首先会进行反量化操作,将4位的低精度数据转换为BFloat16格式。这一步骤是必要的,因为直接在低精度格式下进行复杂的数学运算(如矩阵乘法)可能会导致精度损失过大,影响模型的性能。转换为BFloat16后,就可以在保持较高精度的同时,利用16位运算的优势进行矩阵乘法等计算。
4-bit NormalFloat Quantization(4bit量化)
分位数量化:分位数量化是一种数据压缩和量化的技术,它基于输入数据的分位数来划分量化区间.确保每个量化区间内分配相同数量的值(或尽可能接近相同数量)。
分位数量化的工作原理是通过经验累积分布函数估计输入张量的分位数。
分位数量化的一个主要限制是,准确估计分位数的过程非常昂贵,特别是对于大型数据集。分位数估计需要确定将数据分成等大小部分(或分位数)的值,这在数据未排序或分布在多个系统上时尤其计算密集。为了解决这个问题,通常会使用快速的分位数近似算法,如SRAM分位数等,来估计分位数。这些算法通过牺牲一些精度来换取更快的计算速度。然而,由于这些算法的近似性质,对于异常值(通常是最重要的值)的数据类型,会产生较大的量化误差。
当输入张量(tensors)来自一个固定到某个量化常数的分布时,可以避免昂贵的分位数估计和近似误差
预训练的神经网络权重通常具有以0为中心、标准差为σ的正态分布。为了将这些权重适配到特定的数据类型范围内,我们可以对标准差σ进行缩放,以确保权重分布完全适应我们设定的数据类型范围。因此,数据类型的分位数和神经网络权重都需要标准化到这个范围内。
对称k位量化存在的问题及解决办法
在讨论对称k位量化时,确实存在一个问题,即这种方法无法精确表示零值,而精确表示零值对于量化填充(padding)和其他零值元素而不产生误差是至关重要的。为了确保有一个离散的零值点,并且充分利用k位数据类型中的2^k个比特,我们设计了一种非对称数据类型.
这种方法首先估计两个范围(负数和正数)的分位数qi,其中负数的范围是从-2(k-1)到-1(共2(k-1)个值),正数的范围是从1到2(k-1)(同样共2(k-1)个值,但注意这里不包括0,因为我们已经为负数范围分配了-1作为最接近零的负值)。然后,我们将这两个qi集合合并,并移除在两个集合中都出现的零值(实际上,在合并前,我们就没有为正数范围包括0,所以这一步主要是强调没有重复零值)。
这种数据类型被称为k位NormalFloat(NFk),因为它在每个量化桶中具有相等数量的预期值,这对于零中心正态分布的数据在信息论意义上是最优的。这意味着,对于符合正态分布(均值为0)的数据,NFk类型能够更有效地量化,减少量化误差。
NFk的具体值取决于k的大小和如何精确分配这些值以平衡正负范围。
Double Quantization(双重量化)
Paged Optimizers(分页优化器)
在 CPU 和 GPU 之间自动进行页到页传输,以便在 GPU 偶尔出现内存不足的情况下实现无错误的 GPU 处理。我们使用此功能为优化器状态分配分页内存,然后在 GPU 内存不足时自动将其移出到 CPU RAM,并在优化器更新步骤需要内存时将其分页回 GPU 内存。
局限性
论文中提出的局限性主要在于没有在一些数据集或者模型上进行测试,不确定QLora在其上的表现