LLM quantization

Quantization 是一种降低模型内存与 compute 需求的技术,其做法是将 weights 和 activations 从 FP32 等高精度格式转换为 INT8、INT4 甚至 INT2 等低精度格式。

bit 数越少,模型占用的内存就越低。例如:

这些数字只计算了 model weights。Attention cache、activations 和 framework overhead 等 runtime 元素还需要额外内存。

为什么使用 quantization

Quantization 可以从三个主要方面改善 LLM inference:

更小的 weight footprint 还能为 KV cache、更大的 batch 和更多并发请求留出更多 GPU memory。Weight quantization 本身不会减少每个 Token 对应的 KV cache 大小;要实现这一点,需要单独 quantize KV cache。

这种在 precision 与大小之间的权衡会导致一定程度的准确率下降。对许多应用而言,只有在生成的输出仍足够可靠、可以用于生产环境时,上述优势才有意义。例如,如果一个速度更快的模型生成的回复明显更差,这种取舍通常并不值得。

好消息是,现代 quantization 方法已经大幅缓解了这种取舍。GPTQ W4A16、AWQ,以及同时对 weights 和 activations 进行 FP8 quantization 等技术,通常可以保持与原始模型几乎相同的准确率,同时显著提高 inference efficiency。因此,许多生产部署都可以采用 quantization,而对模型质量几乎没有或完全没有可察觉的影响。

Quantization format

不同的 quantization format 在体积节省和准确率之间提供不同的平衡。以下是一份快速指南:

Format 相对 FP32 的大小 准确率下降 使用场景 内存 说明
FP32 100% 无 Training 高 Full precision,但速度较慢
FP16 50% 极小 Training 和 Inference 中 大多数 LLM 的标准格式
FP8 25% 低 Training 和 Inference 低 仍在发展中
INT8 25% 低 Inference 低 整体权衡良好
INT4 12.5% 中等 Inference 很低 需要 GPTQ/AWQ 等方法
INT2 6.25% 高 少见/实验性 极低 准确率通常较差

使用下方的可视化工具,查看这些权衡会如何随模型大小变化。请注意,对于 MoE model,此计算器使用存储的 parameter 总量,而不是每个 Token 激活的 parameter 数量。

可视化工具:Quantization Memory Impact (Weights Only)

此计算器仅估算 weight memory。由于 KV cache、activations 和 framework overhead 的存在,实际内存占用可能高得多。请使用 GPU memory 计算器估算总体需求。

应该 quantize 哪些部分

通常,应优先处理最消耗内存,同时又不会对性能造成过大影响的部分。

Quantization vs. pruning

Quantization 并不是缩小模型的唯一方式,另一项相关技术是 model pruning。

Pruning 会移除对模型输出贡献很小的 parameter。这些 parameter 可以是单独的 weights、neuron、attention head,甚至整个 layer。通过消除冗余组件,pruning 可以生成更小、更 sparse 的模型,从而降低 compute 需求并提升 inference 速度。

Pruning 和 quantization 经常在 deployment pipeline 中结合使用:

  1. 训练模型
  2. Prune 不太重要的 weights
  3. Fine-tune 模型
  4. Quantize weights
  5. 部署用于 inference

简单来说:

这两种技术都旨在减少 inference 期间的内存占用和计算成本。不过,quantization 通常更容易应用于生产系统,因为现代硬件对 low-precision arithmetic 有强大的支持。

什么时候使用 quantization

在以下情况下,quantization 是一个不错的选择:

在以下情况下,quantization 可能不是一个好的选择:

-success

Quantization 方法

业界已经开发出多种高级 quantization 技术,可在不显著损失性能的情况下提高 LLM 的效率。

以下是一些得到广泛采用的 quantization 方法:

AWQ

Activation-aware Weight Quantization (AWQ) 专为在 edge device 或资源受限设备上运行 LLM 而设计。其核心洞见是,并非所有 weights 对性能的贡献都相同。开发者认为,只有约 1% 的 weights 是“salient”的,在 quantization 期间需要额外关注。因此,这种方法会根据 activation distribution 选择性地保护影响最大的 weights,而不是只考虑 weights 本身。

从高层来看,AWQ 会应用 equivalent transformation,根据离线采集的 activation statistics 对重要的 weight channel 进行 scaling。

对于部署在 edge 环境或 latency-sensitive 环境中的模型,它是进行 low-bit quantization 的理想选择。

SmoothQuant

SmoothQuant 是一种通用的 training-free post-training quantization (PTQ) 方法,可以对 weights 和 activations 高效执行 8-bit quantization (W8A8)。

Quantize weights 相对简单,但 activations 中的 outlier 可能显著降低准确率,因此处理难度大得多。SmoothQuant 通过“平滑”activation outlier 来解决这个问题。它利用 equivalent transformation,在数学上将 quantization 的难点从 activations 转移到 weights。由此,它可以使 LLM 的内存占用最多降低 2 倍、速度最多提升 1.56 倍。

如果你有以下需求,SmoothQuant 会是一个很好的选择:

它是一套兼顾准确率、性能和易用性的 turnkey solution,非常适合要求规模化效率的生产场景。

GPTQ

GPTQ 是一种快速的 post-training quantization 方法,能够以极小的准确率损失,将大型 Transformer model 压缩到每个 weight 3–4 bit。它专为扩展至拥有数千亿 parameter 的模型而设计,并且无须 retraining。

主要特点:

GPTQ 广泛用于 open-source model serving pipeline,尤其常与 AutoGPTQ 搭配使用。对于大型模型的高速、低内存 inference,它是首选方案之一。


许多现代 inference framework不仅能高效 serving quantized model,还提供内置 API 或工具来 quantize 模型。例如,online quantization 通常只需要一个 serving flag:

max serve --model meta-llama/Llama-3.1-8B-Instruct \
  --quantization-encoding float8_e4m3fn

--quantization-encoding 接受高精度编码(float32、float16、bfloat16)、低精度浮点格式(float8_e4m3fn、float4_e2m1fnx2)、GGUF 整数格式(q4_0、q4_k、q6_k),以及用于 GPTQ 检查点的 gptq。更多信息请参阅 MAX 文档中的量化说明。

vllm serve --model meta-llama/Llama-3.1-8B-Instruct \
  --quantization mxfp8

--quantization 支持 fp8_per_tensor、fp8_per_block、mxfp8 和 bitsandbytes 等方法。如果不设置该参数,vLLM 会从模型配置中读取 quantization_config,并在无法获取时回退到未量化权重。更多信息请参阅 vLLM 文档中的“量化”。

sglang serve --model-path meta-llama/Llama-3.1-8B-Instruct \
  --quantization fp8

--quantization 支持 awq、gptq、fp8 和 bitsandbytes 等方法。更多信息请参阅 SGLang 文档中的“量化”。

在其他情况下,可以使用专用工具离线 quantize 模型,再由 serving framework 直接加载。因此,大多数用户不再需要自行实现 quantization algorithm。

通常可以直接从 Hugging Face 上已经 quantize 的模型开始。它托管了许多 pre-quantized variant,例如 8-bit 和 4-bit 模型;这些模型已经可以直接用于 inference,并针对更低的内存占用和更快的部署进行了优化。同时,如果你想应用自己的 quantization strategy,它也提供 full-precision base model。

其他资源