05. AWQ、GPTQ、INT8、INT4 这些量化方法该怎么理解和选择?

整理 AWQ、GPTQ、INT8、INT4 等量化方法的理解与选型。

简单回答

INT8/INT4 是量化精度,AWQ 和 GPTQ 是量化方法(算法)。GPTQ 是一种基于二阶信息(Hessian)的 PTQ 方法,逐列量化权重并补偿误差,量化速度快、效果好,是目前最流行的 INT4 量化方案。AWQ(Activation-aware Weight Quantization)的思路是"权重中有少数通道对激活值影响特别大,保护这些通道",通过对重要通道做缩放来减少量化误差。选择上:INT8 量化几乎无损用 bitsandbytes 就行;INT4 推荐 AWQ 或 GPTQ,AWQ 在推理速度上通常略优,GPTQ 生态更成熟。

详细解释

先厘清概念

INT8 和 INT4 描述的是量化的目标精度——把参数表示为 8 位整数还是 4 位整数。这是"量化到什么精度"。

GPTQ、AWQ、SmoothQuant、bitsandbytes 等描述的是量化的具体算法——"用什么方法做量化"。同样是 INT4 量化,不同的算法产生的量化精度(效果损失)可以差很大。

GPTQ

GPTQ(来自 Frantar et al., 2022)是目前最流行的权重量化方法之一。它基于 OBQ(Optimal Brain Quantization)框架,核心思想是:按列逐个量化权重矩阵中的元素,每量化一个元素后用 Hessian 信息计算其对输出的影响,并更新剩余未量化的元素来补偿误差。

直觉理解:量化第一列权重会引入一些误差,GPTQ 不是忍受这个误差,而是微调剩余列的值来"弥补"这个误差。这种逐列补偿的方式使得整体量化误差远小于朴素的逐元素量化。

GPTQ 需要一个小的校准数据集(通常几百条文本)来估算激活值分布和 Hessian。量化过程比较快——一个 7B 模型通常几分钟到几十分钟就能量化完。

GPTQ 的生态很成熟——AutoGPTQ 库提供了完整的量化和推理流程,vLLM、TGI 等推理框架都支持加载 GPTQ 量化模型。HuggingFace 上大量的量化模型都是 GPTQ 格式。

AWQ

AWQ(Lin et al., 2023)的出发点是一个观察:权重矩阵中不同通道的重要性差异很大。某些通道(channel)对应的激活值幅度很大,量化这些通道对输出的影响远大于量化那些激活值幅度小的通道。

AWQ 的做法不是跳过重要通道不量化(那会导致混合精度的计算复杂性),而是在量化前对重要通道做缩放——把重要通道的权重乘以一个缩放因子变大,让它们在量化时获得更高的有效精度(因为量化的绝对误差是固定的,数值越大相对误差越小)。缩放因子的选择基于激活值分布,用校准数据集确定。

AWQ 的推理速度通常比 GPTQ 快一些。原因在于 AWQ 量化后的权重排布更适合高效的 CUDA kernel 实现。AutoAWQ 库提供了量化和推理支持。

SmoothQuant

SmoothQuant(Xiao et al., 2022)主要解决的是激活值量化的问题。权重通常分布比较平滑,量化起来容易。但激活值经常有离群值(outlier)——某些通道的激活值特别大,其他通道很小,这导致量化时要么用很大的量化范围(让小值的量化精度很差),要么裁剪离群值(损失大值的精度)。

SmoothQuant 的核心思想是在权重和激活之间做"平滑"——把激活中的离群值"迁移"到权重上。具体做法是在量化前对激活乘以一个缩放矩阵 ,对权重乘以 ,使得 ——数学上等价,但激活变得更平滑,更容易量化。

SmoothQuant 是 W8A8(权重 INT8、激活 INT8)的代表方案,适合需要同时量化权重和激活的场景(纯权重量化 Decode 更快,但 Prefill 阶段激活量化也能带来加速)。

bitsandbytes

bitsandbytes(Tim Dettmers 等)提供了简单易用的 INT8/INT4 量化方案。LLM.int8() 方法的特点是对离群值做特殊处理——激活中的离群通道保持 FP16 计算,其他通道用 INT8。NF4(4-bit NormalFloat)是 QLoRA 中用到的量化格式,针对正态分布的权重做了优化。

bitsandbytes 的优势是集成简单——加载模型时加一个参数就能量化。劣势是推理速度不如 GPTQ/AWQ 快(因为混合精度计算的 overhead)。更适合微调场景(QLoRA)而不是高性能推理部署。

怎么选

只需要 INT8 量化、追求简单——用 bitsandbytes 或 SmoothQuant。效果损失极小,几乎开箱即用。

需要 INT4 量化、追求推理速度——AWQ 通常是最佳选择。推理速度快,效果和 GPTQ 相当或略好。

需要 INT4 量化、追求生态兼容性——GPTQ 生态最成熟,HuggingFace 上量化模型最多,框架支持最广。

做 QLoRA 微调——用 bitsandbytes 的 NF4 量化。

更极致的量化(INT3、INT2)——目前还不太成熟,效果损失较大,仅在端侧极端资源受限的场景下考虑。

面试时可以这样答

先区分概念:INT8/INT4 是量化精度,GPTQ 和 AWQ 是量化算法。

GPTQ 的核心思想是逐列量化权重并用 Hessian 信息补偿误差,量化快、效果好,生态最成熟。AWQ 的思路不同——它发现权重中少数通道对激活影响特别大,通过缩放这些重要通道来减少量化误差,推理速度通常比 GPTQ 快一些。SmoothQuant 解决的是激活值量化的问题,把激活中的离群值"迁移"到权重上使其更平滑。

选择上我一般这样判断:INT8 量化几乎无损,用 bitsandbytes 就行,最简单。INT4 量化推荐 AWQ 或 GPTQ——追求推理速度选 AWQ,追求生态兼容选 GPTQ。做 QLoRA 微调用 bitsandbytes 的 NF4。不管用哪种方法,量化完都要在业务场景上做效果评测。

常见追问

  1. GPTQ 的校准数据集需要多大?数据选择对量化效果有多大影响?
  2. AWQ 的"重要通道"具体是怎么定义和识别的?
  3. FP8 量化和 INT8 量化有什么区别?