大模型量化技术原理:AWQ 与 AutoAWQ
近年来,随着 Transformer、MOE 架构的提出,深度学习模型轻松突破上万亿规模参数,导致模型变得越来越大。为了降低模型部署成本并提升推理性能,我们需要一些大模型压缩技术。模型压缩主要分为以下几类:
- 剪枝(Pruning)
- 知识蒸馏(Knowledge Distillation)
- 量化
本系列将针对大模型的一些常见训练后量化方案(GPTQ、LLM.int8()、SmoothQuant、AWQ 等)进行讲述。
背景
将 LLM 进行低比特权重量化可以节省内存,但却很难实现。量化感知训练(QAT)由于训练成本较高并不实用,而训练后量化(PTQ)在低比特场景下面临较大的精度下降。
最接近的工作是 GPTQ,它使用二阶信息来进行误差补偿,但它可能在重建过程中过拟合校准集,从而扭曲分布之外领域上的学习特征,这可能会出现问题,因为 LLM 是通才模型。
因此,作者提出了一种'激活感知权重量化(Activation-aware Weight Quantization,AWQ)'方法,这是一种对硬件友好的低比特 LLM 仅权重化方法。该方法源于'权重对于 LLM 的性能并不同等重要'的观察,存在约 0.1%-1% 显著权重对大模型性能影响太大,通过跳过这 1% 的显著权重(salient weight)不进行量化,可以大大减少量化误差。
尽管我们只做了权重量化,但要找到显著的权重通道,我们应该根据激活分布而不是权重分布。与较大激活幅度 (activation magnitudes) 相对应的权重通道更加突出,因为它们处理了更重要的特征。
为了避免硬件效率低下的混合精度实现,我们分析了权重量化产生的误差,并推导出放大显著通道(salient channels)可以减少其相对量化误差。根据这一直觉,我们设计了一种按通道缩放的方法,以自动搜索最优缩放(scaling),使全部权重下的量化误差最小。AWQ 不依赖于任何反向传播或重构,因此可以很好地保持 LLM 在不同领域和模态上的泛化能力,而不会过拟合校准集。此外,我们还实现了一个高效的服务框架,将 AWQ 理论上节省的内存转换为实际的加速。我们的框架利用 kernel 融合的优势,最大限度地减少推理开销(例如,中间 DRAM 访问和 kernel 启动开销),以便我们可以更好地实现量化线性层的加速(AWQ 应用于包含大部分参数的线性层)。
为什么需要大模型量化
在大模型落地过程中,显存占用往往是最大的瓶颈之一。一个 7B 参数的 FP16 模型大约需要 14GB 显存,加上 KV Cache 和激活值,推理时可能需要 20GB 以上。这对于消费级显卡来说门槛很高。量化通过将权重从 16 位浮点数转换为 4 位整数,可以将模型体积缩小至原来的 1/4 左右。这不仅降低了存储需求,还减少了内存带宽压力,从而显著提升推理速度,特别是在 Memory-bound 的场景下。
然而,直接量化会导致精度严重损失。这是因为某些关键权重(即显著权重)对模型输出影响巨大,如果将它们强行压缩到 INT4,会引入巨大的噪声。AWQ 的核心思想就是保护这些关键权重,同时允许非关键权重被大幅压缩。
AWQ 技术原理
AWQ(AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration)是一种对大模型仅权重量化方法。通过保护更'重要'的权重不进行量化,从而在不进行训练的情况下提高准确率。
1. 通过保留 1% 的显著权重来改进 LLM 量化
由于 LLM 的权重并非同等重要,与其他权重相比,有一小部分显著权重对 LLM 的性能更为重要。因此,作者认为跳过这些显著权重不进行量化,可以在不进行任何训练的情况下,弥补量化损失造成的性能下降。
为了验证这个想法,作者测量了 INT3 量化模型的性能,同时保留了一定权重通道的比例为 FP16。确定了权重重要性的一种广泛使用的方法是查看其大小(magnitude)或 L2-norm。
但是发现跳过具有较大 Norm(基于 W)的权重通道并不能显著提高量化性能,与随机选择效果类似仅少量改进。而根据激活幅度(magnitude)选择权重可以显著提高性能,通过只保留 0.1%-1% 的较大激活对应权重通道就能显著提高量化性能,甚至能与基于重构的 GPTQ 相媲美。因此,我们认为幅度较大的输入特征通常更为重要,通过保留相应的权重为 FP16 可以保留这些特征,从而提高模型性能。
尽管将 0.1% 的权重保留为 FP16 可以在不明显增加模型大小的情况下提高量化性能,但这种混合精度数据类型会给系统实现带来困难(硬件效率低下)。因此,我们需要想出一种方法来保护重要的权重,而不将其实际保留为 FP16。
2. 通过激活感知缩放保护显著权重
作者提出了另一种方法,通过按逐通道(per-channel)缩放来减少显著权重的量化误差,这种方法不存在硬件效率低下的问题。
首先分析仅权重量化产生的误差。考虑一个权重为 w 的组/块;线性运算可写成 y = Wx,量化后的对应运算为 y = Q(W)x。量化函数定义如下:


