LLM quantization
Quantization 是一种降低模型内存与 compute 需求的技术,其做法是将 weights 和 activations 从 FP32 等高精度格式转换为 INT8、INT4 甚至 INT2 等低精度格式。
bit 数越少,模型占用的内存就越低。例如:
- FP32 格式的 7B 模型精度很高,但仅 weights 就需要 28 GB 内存。
- 同一个模型使用 FP16 后,内存占用会减半。
- INT8 或 INT4 等低精度格式可以进一步压缩模型,大幅减小模型大小。
这些数字只计算了 model weights。Attention cache、activations 和 framework overhead 等 runtime 元素还需要额外内存。
为什么使用 quantization
Quantization 可以从三个主要方面改善 LLM inference:
- 更小的 model footprint。每个 parameter 使用的 bit 数会直接影响 model weights 所需的内存。例如,7B 模型的 FP16 weights 约需 14 GB,而 INT8 weights 约需 7 GB。这可能决定模型能否装入单个 GPU,还是必须分布到多个 GPU 或 node 上。
- 更少的 data movement。LLM decoding 通常受限于 GPU memory bandwidth,因为 runtime 在生成 Token 时会反复读取 model weights。低精度 weights 意味着需要从 GPU memory 移动到 compute unit的数据字节更少,从而降低 per-token latency。
- 更快的计算。GPU 和其他 accelerator 能以高于 FP32 或 FP16 的 throughput 处理受支持的低精度格式。例如,在 H100 SXM 上,BF16/FP16 Tensor Core 可达到 1,979 TFLOPS,而 FP8 和 INT8 可达到其两倍,即 3,958 TFLOPS/TOPS;bit width 减半带来了整整 2 倍的提升。实际加速幅度取决于硬件和 inference runtime 是否为所选格式提供 optimized kernel。
更小的 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 数量。
此计算器仅估算 weight memory。由于 KV cache、activations 和 framework overhead 的存在,实际内存占用可能高得多。请使用 GPU memory 计算器估算总体需求。
应该 quantize 哪些部分
通常,应优先处理最消耗内存,同时又不会对性能造成过大影响的部分。
- Model weights 是最常被 quantize 的组件。它们较为稳定,并且占据了很大一部分内存。
- Activations 也可以被 quantize,但这更为棘手,并可能导致更大的准确率损失。
- KV cache 可以在 runtime 被 quantize,以减轻 long-context serving 中的内存压力。这不同于 weight quantization,因为 cache 在 inference 期间生成,并会在 decoding 过程中被反复读取。主要挑战是保持 attention quality:当 key vector 和 value vector 以更少的 bit 存储后,模型仍需要计算准确的 key/query similarity score。
Quantization vs. pruning
Quantization 并不是缩小模型的唯一方式,另一项相关技术是 model pruning。
Pruning 会移除对模型输出贡献很小的 parameter。这些 parameter 可以是单独的 weights、neuron、attention head,甚至整个 layer。通过消除冗余组件,pruning 可以生成更小、更 sparse 的模型,从而降低 compute 需求并提升 inference 速度。
Pruning 和 quantization 经常在 deployment pipeline 中结合使用:
- 训练模型
- Prune 不太重要的 weights
- Fine-tune 模型
- Quantize weights
- 部署用于 inference
简单来说:
- Quantization 减少表示每个 weight 所需的 bit 数。
- Pruning 减少模型中的 weight 数量。
这两种技术都旨在减少 inference 期间的内存占用和计算成本。不过,quantization 通常更容易应用于生产系统,因为现代硬件对 low-precision arithmetic 有强大的支持。
什么时候使用 quantization
在以下情况下,quantization 是一个不错的选择:
- 你要部署到 GPU memory 有限的硬件上(例如 24 GB 或更少)。
- 你希望降低 inference latency。
- 你需要降低 serving 成本。
- 你希望支持更高的 concurrency。Quantization 会减少每个 Token 对应的 KV cache 大小,使同一 GPU memory 能容纳更多 Token,进而处理更多并行请求。
- 你可以接受小幅的准确率损失。
在以下情况下,quantization 可能不是一个好的选择:
- 你需要尽可能高的准确率(例如敏感任务或 safety-critical task)。
- 你的模型已经很小(此时 quantization 的收益有限)。
- 你的部署硬件不支持 quantized format。
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 会是一个很好的选择:
- Full INT8 quantization(weights 和 activations)
- 无须 retraining 即可获得较高的硬件效率
- 极小的准确率下降
- 与大多数 Transformer model 即插即用
它是一套兼顾准确率、性能和易用性的 turnkey solution,非常适合要求规模化效率的生产场景。
GPTQ
GPTQ 是一种快速的 post-training quantization 方法,能够以极小的准确率损失,将大型 Transformer model 压缩到每个 weight 3–4 bit。它专为扩展至拥有数千亿 parameter 的模型而设计,并且无须 retraining。
主要特点:
- 规模化效率高:可以在约 4 个 GPU 小时内 quantize OPT-175B 或 BLOOM-176B 等模型。
- 准确率损失极小:即使进行激进压缩,也能保持较低的 perplexity。
- 极端 quantization:支持 2-bit 和 ternary quantization,同时仍能保持可用性能。
- 可在单 GPU 上运行超大模型:能够在单张 A100 或两张 A6000 上对 175B 模型执行 inference。
- 性能提升:自定义 GPU kernel 相比 FP16 可实现约 3.25 倍加速。
GPTQ 广泛用于 open-source model serving pipeline,尤其常与 AutoGPTQ 搭配使用。对于大型模型的高速、低内存 inference,它是首选方案之一。
许多现代 inference framework不仅能高效 serving quantized model,还提供内置 API 或工具来 quantize 模型。例如,online quantization 通常只需要一个 serving flag:
- MAX
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
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
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。