GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers论文解读

Posted by lili on November 20, 2023

本文是论文GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers的解读。

目录

Abstract

GPT模型通过在复杂语言建模任务中取得的突破性性能以及它们极高的计算和存储成本而脱颖而出。由于它们庞大的体积,即使是对于大型、高度准确的GPT模型的推断也可能需要多个性能强大的GPU,这限制了这些模型的可用性。虽然有一些正在出现的工作通过模型压缩来缓解这种压力,但由于GPT模型的规模和复杂性,现有的压缩技术的适用性和性能受到了限制。在本文中,我们解决了这一挑战,并提出了GPTQ,这是一种基于近似二阶信息的新型一次性权重量化方法,既高度准确又高效。具体而言,GPTQ可以在大约四个GPU小时内量化具有1750亿参数的GPT模型,将比特宽度降低到每个权重3或4比特,相对于未压缩的基准几乎没有精度降级。我们的方法相对于先前提出的一次性量化方法更多地提高了压缩效益,保持了准确性,使我们首次能够在单个GPU上执行一个具有1750亿参数的模型进行生成推断。此外,我们还展示了我们的方法在极端量化范围内仍然可以提供合理的准确性,即将权重量化为2比特甚至三值量化水平。我们通过实验证明,这些改进可以用于在高端GPU(如NVIDIA A100)上实现FP16的端到端推断加速,速度提高约3.25倍,并且在使用更具成本效益的GPU(如NVIDIA A6000)时,速度提高4.5倍。

Introduction

来自Transformer家族的预训练生成模型,通常被称为GPT或OPT,已经展示出在复杂语言建模任务中的突破性性能,引起了广泛的学术和实际兴趣。它们的可用性面临的一个主要障碍是计算和存储成本,这在已知模型中居于最高水平。例如,最佳性能的模型变体,如GPT3-175B,具有大约1750亿个参数,并需要数十到数百个GPU年进行训练。即使是在一个预训练模型上执行推理的简单任务,在本文中是我们关注的重点,也是非常具有挑战性的:例如,当以紧凑的float16格式存储时,GPT3-175B的参数占据326GB的内存。这超出了甚至是最高端的单个GPU的容量,因此推断必须使用更复杂和昂贵的设置,如多GPU部署。

尽管消除这些额外开销的标准方法是模型压缩,但关于对这些模型进行推理时的压缩,我们对此知之甚少,这令人惊讶。一个原因是更复杂的低比特量化或模型修剪方法通常需要对模型进行重新训练,而对于拥有数十亿参数的模型来说,这是非常昂贵的。另一种选择是后训练(post-traning)方法,这种方法在不重新训练的情况下一次性压缩模型,会非常吸引人。不幸的是,这类方法的更准确的变体复杂且难以扩展到数十亿参数的规模。迄今为止,仅有基本变体的最近邻量化方法已经应用于GPT-175B的规模;尽管这在低压缩目标(例如8位权重)上效果良好,但在更高的压缩率下无法保持准确性。因此,关于一次性后训练量化是否普遍可行,仍然有待解答。

在本文中,我们提出了一种新的后训练量化方法,称为GPTQ,足够高效,能够在最多几个小时内在拥有数千亿参数的模型上执行,并且足够精确,能够将这些模型压缩到每个参数3或4位而几乎不损失准确性。举例来说,GPTQ可以在大约四个GPU小时内对最大的公开可用模型,OPT-175B和BLOOM-176B进行量化,而困惑度(被认为是一种非常严格的准确性指标)仅略微增加。

此外,我们展示了我们的模型在极端量化范围内也能够提供稳健的结果,即将模型量化为每个分量2位,甚至是三值。在实际应用方面,我们开发了一种执行工具,可以高效地在生成任务中执行由此产生的压缩模型。具体而言,我们能够首次在单个NVIDIA A100 GPU上运行压缩的OPT-175B模型,或者仅使用两个更具成本效益的NVIDIA A6000 GPU。我们还实现了专门的GPU核(kernel),可以利用压缩来加速内存加载,使在使用A100 GPU时速度提高约3.25倍,在使用A6000 GPU时提高4.5倍。

据我们所知,我们是首次展示具有数千亿参数的极其精确的语言模型可以量化为每个分量3-4位的研究者:先前的后训练方法仅在8位时保持准确 ,而先前基于训练的技术仅解决了规模较小的模型,大小相对较小。这种高度的压缩可能似乎是自然的,因为这些网络是过度参数化的;然而,正如我们在对结果的详细分析中所讨论的,压缩引入了在语言建模的准确性(困惑度)、比特宽度和原始模型大小之间的非平凡权衡。

我们希望我们的工作能够激发在这一领域的进一步研究,并成为使这些模型面向更广泛受众的进一步步骤。在限制方面,由于在主流架构上缺乏对混合精度操作数(例如FP16 x INT4)的硬件支持,我们的方法目前不会提供实际乘法的加速。此外,我们目前的结果不包括激活量化,因为在我们的目标情景中它们不是一个重要的瓶颈;然而,可以使用其他技术来支持激活量化。

相关工作

量化方法大致可分为两类:训练期间的量化和后训练量化(Post-training Quantization)。前者通常在广泛的重新训练和/或微调过程中对模型进行量化,使用某种近似的微分机制进行舍入操作。相比之下,后训练(“一次性”)方法使用适度的资源,通常是几千个数据样本和几小时的计算时间,对预训练模型进行量化。后训练方法对于庞大的模型特别有趣,因为对于这些模型,完整的模型训练甚至微调都可能很昂贵。我们在这里专注于这种情景。

后训练量化

大多数后训练方法都集中在视觉模型上。通常,准确的方法通过对单个层或连续几个层的小块进行量化。有关更多细节,请参见第3节。AdaRound通过调节一个惩罚项来计算依赖于数据的舍入,该项鼓励权重向对应于量化水平的网格点移动。BitSplit使用残差误差的平方误差目标逐位构建量化值,而AdaQuant基于Straight-through估计进行直接优化。BRECQ将Fisher信息引入目标中,并在单个残差块内联合优化层。最后,Optimal Brain Quantization(OBQ)将经典的Optimal Brain Surgeon(OBS)二阶权重修剪框架(推广应用于量化。OBQ逐个量化权重,按照量化误差的顺序,始终调整剩余的权重。尽管这些方法在几个GPU小时内对具有约1亿参数的模型产生良好的结果,但将它们扩展到规模更大的网络是具有挑战性的。

大模型量化

随着像BLOOM或OPT-175B这样的语言模型的最近开源发布,研究人员已经开始开发用于推理时压缩这些庞大网络的经济方法。尽管所有现有的工作——ZeroQuant、LLM.int8()和nuQmm——都仔细选择了量化粒度,例如矢量方式,但它们最终只是将权重舍入到最近的量化水平,以保持对非常大模型的可接受运行时。ZeroQuant进一步提出了层次知识蒸馏,类似于AdaQuant,但它只能应用于具有13亿参数的最大模型。在这个规模上,ZeroQuant已经需要约3小时的计算时间;而GPTQ在约4小时内对比ZeroQuant量化了100倍更大的模型。LLM.int8()观察到在一些特征维度上的激活异常值会破坏较大模型的量化,并提出通过保持这些维度的更高精度来解决这个问题。最后,nuQmm为一种特定的基于二进制编码的量化方案开发了高效的GPU核心。

相对于这一系列工作,我们展示了在大规模模型上可以高效实现更复杂且准确的量化器。具体而言,与这些先前技术相比,GPTQ的压缩量增加了一倍以上,同时保持了相似的准确性。

Background

逐层量化

在高层次上,我们的方法遵循后训练量化方法的结构,通过逐层进行量化,为每一层解决相应的重建问题。具体来说,设$W_l$是与线性层l对应的权重,$X_l$是m个数据点在第l层输入。然后,目标是找到一个量化权重矩阵\(\widehat{W}\)使得输出的平方误差最小。形式上,这可以重新表述为:

\[argmin_{\widehat{W}}|| WX -\widehat{W}X ||_2^2\]

Optimal Brain Quantization

我们的方法基于最近提出的Optimal Brain Quantization(OBQ)方法来解决上述定义的逐层量化问题,我们对其进行了一系列重大修改,使其能够扩展到大型语言模型,提供了超过三个数量级的计算速度加快。为了帮助理解,我们首先简要总结一下原始的OBQ方法。

OBQ方法始于这样的观察,即上式可以被写为W的每一行的平方误差之和。然后,OBQ独立处理每一行w,逐个量化权重,始终更新尚未量化的所有权重,以补偿量化单个权重引起的误差。由于相应的目标是二次的,其Hessian矩阵是$H_F = 2X_F X^T_F$,其中F表示剩余的全精度权重集合,因此下一个最佳的贪婪权重wq,我们用δF表示的所有权重的最佳更新,由以下公式给出,其中quant(w)将w舍入到量化格上最近的值: