大型语言模型(LLM)性能强,但参数量可达千亿级,对计算设备和内存的需求大到普通公司无法承受。量化是一种常见的压缩操作。通过降低模型权重的精度(例如32位到8位),牺牲一些模型性能来换取更快的推理速度和更少的内存需求。但是对于超过1000亿参数的LLM,现有的压缩方法都无法保持模型的精度,也无法在硬件上高效运行。近日,来自麻省理工学院和英伟达的研究人员联合提出了一种通用的训练后量化(GPQ,general-purposepost-trainingquantization)方案SmoothQuant,可以高效实现大型语言模型的8位权重和8位激活。(W8A8)quantization,可以在不训练的情况下保持模型的准确性。论文链接:https://arxiv.org/pdf/2211.10438.pdf代码链接:https://github.com/mit-han-lab/smoothquant由于activation比weight更难量化,SmoothQuant通过数学等价的Activations变换那些更难量化的被迁移到权重,从而能够平滑激活异常值。SmoothQuant可以将所有LLM的各个层中的权重和激活量化为INT8,包括OPT-175B、BLOOM-176B和GLM-130B。与仅对激活进行权重优化或混合精度量化的现有方法相比,SmoothQuant具有更高的硬件效率,实现了1.56倍的加速比,内存需求是原始LLM的一半,并且几乎没有损失。SmoothQuant还具有硬件友好的设计。研究人员将SmoothQuant集成到LLM服务框架FasterTransformer中,以实现更快的推理速度。与FP16的精度相比,只需要一半的GPU数量。文章第一作者肖光轩,来自麻省理工学院电子工程系一年级博士生,毕业于清华大学计算机科学与技术学院。导师宋寒是麻省理工学院电子工程学院副教授。他毕业于斯坦福大学,获得博士学位。主要研究方向为高效深度学习。他曾提出深度压缩(deepcompression)技术,可以在不损失精度的情况下,将神经网络的规模缩小一个数量级。SmoothQuant量化(Quantization)是将高精度的值映射到精度较低的离散值。在这篇论文中,研究人员主要关注对硬件更高效的整数均匀量化(integeruniformquantization),尤其是INT8。可以以不同的粒度执行量化操作,例如应用于整个权重矩阵的按张量量化、应用于激活中每个令牌的按令牌量化以及应用于权重的每个输出通道的按通道量化。通过观察激活的量化结果,研究人员总结出几种模式:1.量化比权重更难量化。权重的分布相对更加均匀和平坦。之前的研究结果证明,将大型语言模型的权重降低到INT8,甚至INT4对准确率影响不大。2.异常值是激活量化的主要难点。激活中的异常值通常比正常值高约100倍,导致没有异常值的通道中的量化位/电平效率低下。3、异常值总是出现在某个通道。异常值只出现在一小部分通道中,但如果一个通道中存在异常值,它可能会出现在所有令牌中。一个给定token的所有channel的方差都会很大(有些channel会很大,但大部分会很小),但是一个给定channel在所有token度的方差都会很小(outlierchannels会很大)。由于离群值在每个通道中具有连续出现和方差小的特点,如果对激活进行per-channel量化,其量化误差会比per-tensor量化小很多。通过一个简单的实验,结果再次验证了研究人员的想法。量化为INT8时,per-channel的精度远高于per-tensor和per-token量化,与FP16基线精度几乎持平。研究人员使用每通道平滑因子s来平滑输入激活。为了保持线性层的数学等价性,权重也需要反向缩放。由于输入X通常是由前面的线性操作(如线性层、层范数等)生成的,所以很容易离线将平滑因子融合到前面层的参数中,不会有内核调用开销额外的缩放。对于其他情况,例如当输入来自残差添加时,可以向残差分支添加额外的缩放。将量化难度从激活转移到权重Smooth的目标是选择一个每通道平滑因子s,使这种逆运算更容易量化。为了减少量化误差,应增加所有通道的有效量化位数。当所有通道的最大幅度相同时,有效量化位数的总数将最大。因此,最直接的平滑因子选择之一是输入中每个通道的最大值,这可以保证除法后所有激活的通道具有相同的最大值,从而更容易量化。但需要注意的是,激活的范围是动态的,对于不同的输入样本是不同的。因此,研究人员使用来自预训练数据集的校准样本来估计激活通道的大小。由于这个公式将所有的量化困难都转移到了权重上,可以发现,在这种情况下,权重的量化误差会很大,导致精度下降很大。另一方面,也可以通过选择sj=1/max(|Wj|)将所有量化难度从权重推到激活。此外,由于较大的激活量化误差,模型的性能也不好。因此需要在权重和激活之间拆分量化难度,以便它们都易于量化。研究人员引入了一个超参数转移强度α来控制从激活转移到权重的难度。可以发现,对于大多数模型,例如OPT和BLOOM模型,α=0.5是一个很好的平衡点,可以均匀分配量化难度,尤其是对权重和激活使用相同的量化器。该公式保证相应通道的权重和激活具有相似的最大值,因此具有相同的量化难度。对于其他激活离群值比较大的模型,比如GLM-130B有30%的离群值,激活量化比较困难,可以选择较大的α(比如0.75),将更多的量化难度转移到权重上。应用于Transformer块线性层的SmoothQuant占据了LLM模型的大部分参数和计算量。默认情况下,SmoothQuant缩放Transformer中所有线性层的输入激活,并使用W8A8量化线性层,从而在注意力计算中启用BMM算子的量化。在此过程中,首先使用INT8对线性层和attention层中BMM等计算量大的算子的输入和权重进行量化,而其他轻量元素的运算,如Softmax和LayerNorm,则保持激活为FP16,如设计有助于平衡准确性和推理效率。在实验部分,研究人员选择了OPT、BLOOM和GLM-130B三种大规模语言模型对SmoothQuant进行评估;并使用了七个零样本任务,包括LAMBADA、HellaSwag、PIQA、WinoGrande、OpenBookQA、RTE、COPA等。实验结果表明,SmoothQuant可以处理激活更难量化的超大型LLM的量化问题。SmoothQuant可以在所有评估数据集上匹配FP16的准确性,而W8A8、ZeroQuant和OutlierSuppression基线产生几乎随机的结果。并且SmoothQuant可以无损量化所有超过100B参数的开放LLM。SmoothQuant的O1和O2级别成功保持了浮点精度,而O3级别(per-tensorstatic)降低了平均精度0.8%,可能是因为静态收集的统计量和激活统计量之间的差异真实评价样本。尽管如此,SmoothQuant-O1可以达到FP16的精度,而SmoothQuant-O3仅将精度降低1%,明显优于基线。SmoothQuant不仅对超过100B参数的非常大的LLM有效,而且对较小的LLM也有稳定的效果。SmoothQuant可以在所有大小的OPT模型上工作,并匹配INT8量化的FP16精度。为了展示集成到PyTorch和FasterTransformer中的SmoothQuant-O3的速度提升和内存节省,研究人员测量了一次生成的一批4个句子的所有隐藏状态的端到端延迟,即上下文阶段,并在此过程中记录了GPU内存使用的峰值。由于Huggingface缺乏对模型并行性的支持,研究人员仅在单个GPU上测量了SmoothQuant的PyTorch实现的性能,因此他们选择了OPT-6.7B、OPT-13B和OPT-30B进行评估。在FasterTransformer库中,SmoothQuant可以与TensorParallelism算法无缝对接,因此研究人员在OPT-13B、OPT-30B、OPT-66B和OPT-175B上测试了SmoothQuant的单GPU和多GPU基准测试。在NVIDIAA10080GBGPU服务器上的实验结果表明,在基于PyTorch实现的推理延迟和峰值内存使用方面,SmoothQuant始终比FP16基线更快,当序列长度为256提升时,在OPT-30B上实现了1.51倍的加速。还可以看出一个趋势,模型越大,加速越大,但LLM.int8()几乎总是比FP16基线慢,这也是由于混合精度激活表示的大开销。在内存方面,SmoothQuant和LLM.int8()都可以将FP16模型的内存使用率几乎减半,而SmoothQuant由于完全使用INT8GEMM,因此节省的内存略多。与FasterTransformer的FP16实现OPT相比,SmoothQuant-O3在使用单个GPU时可以进一步将OPT-13B和OPT-30B的执行延迟降低高达1.56倍。
