LLM 量化
量化(Quantization)是一种通过将模型的权重和激活从高精度格式(如 FP32)转换为 INT8、INT4 甚至 INT2 等低精度格式,来降低模型内存和计算需求的技术。
更少的位意味着模型的内存占用更低。例如:
- 一个 FP32 格式的 7B 模型精度很高,但仅权重就需要 28 GB 内存。
- 同一个模型使用 FP16 可将内存使用减半。
- INT8 或 INT4 等低精度格式能进一步压缩模型,大幅减小其体积。
这些数字仅考虑了模型权重。运行时元素(如注意力缓存、激活和框架开销)还需要额外的内存。
为什么要使用量化
量化可以在三个方面帮助 LLM 推理:
- 更小的模型体积。每个参数所占的位数直接决定了模型权重需要多少内存。例如,一个 7B 模型 FP16 权重大约需要 14 GB,而 INT8 权重约需 7 GB。这可能是模型能否装进单张 GPU,还是需要分布到多张 GPU 或多个节点之间的区别。
- 更少的数据搬运。LLM 解码(Decode)通常受限于 GPU 内存带宽,因为运行时在生成 token 时会反复读取模型权重。低精度权重意味着从 GPU 内存到计算单元搬运的字节更少,这可以降低每个 token 的延迟。
- 更快的计算。GPU 和其他加速器处理受支持的低精度格式时,其吞吐量高于 FP32 或 FP16。以 H100 SXM 为例,BF16/FP16 Tensor Core 达到 1,979 TFLOPS,而 FP8 和 INT8 将其翻倍至 3,958 TFLOPS/TOPS,仅通过减半位宽就实现了干净的 2 倍提升。实际加速取决于硬件和推理运行时是否为所选格式提供了优化内核。
更小的权重体积还能为 KV 缓存、更大的批次和更多的并发请求留出更多 GPU 内存。权重量化本身不会减少每个 token 的 KV 缓存大小,这需要单独量化 KV 缓存。
这种精度与体积之间的权衡会带来一定的精度下降。对许多应用来说,上述好处只有在生成的输出对生产环境仍然足够可靠时才有意义。例如,一个更快但明显变差的模型很少是值得的权衡。
好消息是,现代量化方法已经让这种权衡变得不那么严重。GPTQ W4A16、AWQ,以及同时对权重和激活做 FP8 量化的技术,往往能保持与原始模型几乎相同的精度,同时显著提升推理效率。因此,许多生产部署可以在对模型质量几乎没有可感知影响的情况下采用量化。
量化格式
不同的量化格式在体积节省与精度之间提供了不同的平衡。这里有一个快速指南:
| 格式 | 相对 FP32 体积 | 精度下降 | 使用场景 | 内存占用 | 说明 |
|---|---|---|---|---|---|
| FP32 | 100% | 无 | 训练 | 高 | 全精度,但速度慢 |
| FP16 | 50% | 极小 | 训练与推理 | 中等 | 大多数 LLM 的标准 |
| FP8 | 25% | 低 | 训练与推理 | 低 | 仍在发展之中 |
| INT8 | 25% | 低 | 推理 | 低 | 各方面权衡良好 |
| INT4 | 12.5% | 中等 | 推理 | 极低 | 需要 GPTQ/AWQ 等方法 |
| INT2 | 6.25% | 高 | 罕见/实验性 | 极小 | 精度往往较差 |
使用下面的可视化工具,看看这些权衡在对应模型规模下是如何体现的。请注意,对于 MoE 模型,该计算器使用的是总存储参数,而不是每个 token 的激活参数。
该计算器仅估算权重内存。请使用 GPU 显存计算器来估算你的总体需求。
量化什么
一般来说,你应该聚焦于那些占用最多内存、且不会过多损害性能的部分。
- 模型权重是最常被量化的组件。它们稳定,并且在内存占用中占比很高。
- 激活也可以被量化,但这更棘手,可能导致更多的精度损失。
- KV 缓存可以在运行时被量化,以减少长上下文服务中的内存压力。这不同于权重量化,因为缓存是在推理过程中生成的,并且在解码期间被反复读取。主要的挑战是保持注意力质量: 当键和值向量以更少的位存储后,模型仍需要准确的键/查询相似度分数。
量化与剪枝
量化并不是减小模型体积的唯一方法。另一种相关技术是模型剪枝。
剪枝(Pruning)会移除对模型输出贡献甚微的参数。它们可以是单个权重、神经元、注意力头,甚至整个层。通过消除冗余组件,剪枝产生一个更小、更稀疏的模型,这可以减少计算需求并加速推理。
剪枝和量化通常在部署流水线中一起使用:
- 训练模型
- 剪除不重要的权重
- 微调模型
- 量化权重
- 部署用于推理
简单来说:
- 量化减少用于表示每个权重的位数。
- 剪枝减少模型中的权重数量。
两种技术都旨在降低推理期间的内存占用和计算成本。然而,量化通常更容易在生产系统中应用,因为现代硬件对低精度算术提供了强大的支持。
何时使用量化
以下情况下,量化是一个不错的选择:
- 你要部署到 GPU 内存有限的硬件上(例如 24 GB 或更少)。
- 你想要更低的推理延迟。
- 你需要降低服务成本。
- 你想支持更高的并发。量化会减少每个 token 的 KV 缓存大小,从而允许更多 token(因此更多并行请求)装进同一 GPU 内存。
- 你能容忍小幅的精度权衡。
以下情况下,量化可能不是好的选择:
- 你需要尽可能高的精度(例如用于敏感或安全关键的场景)。
- 你的模型已经很小(此时量化收益有限)。
- 你的部署硬件不支持量化格式。
许多流行基础模型的量化版本已经可以在 Hugging Face 上找到,因此你无需自己量化模型。你通常可以在模型树部分找到它们。
量化方法
为了在不显著损失性能的情况下让 LLM 更高效,业界已经开发出几种先进的量化技术。
下面是一些被广泛采用的量化方法:
AWQ
激活感知权重量化(AWQ,Activation-aware Weight Quantization)专为在边缘或资源受限设备上运行 LLM 而设计。其核心洞察是,并非所有权重对性能的贡献都相同。其开发者认为只有约 1% 的权重是"显著的(salient)",在量化时需要额外小心。因此,这种方法基于激活分布而非仅基于权重本身,有选择地保护影响最大的权重。
从高层来看,AWQ 应用一种等价变换,根据离线收集的激活统计信息对重要权重通道进行缩放。
它非常适合在边缘场景或对延迟敏感的环境中部署的模型的低比特量化。
SmoothQuant
SmoothQuant 是一种通用的、无需训练的训练后量化(PTQ,post-training quantization)方法,可实现权重和激活的高效 8 位量化(W8A8)。
虽然量化权重相对直接,但由于存在会显著降低精度的离群值,量化激活要困难得多。SmoothQuant 通过"平滑"激活离群值来解决这个问题。它在数学上通过等价变换将量化难度从激活转移到权重。结果是,它为 LLM 实现了高达 2 倍的内存减少和高达 1.56 倍的加速。
当你想要以下特性时,SmoothQuant 是个很好的选择:
- 完整的 INT8 量化(权重和激活)
- 无需重新训练的高硬件效率
- 极小的精度下降
- 与大多数 Transformer 模型的即插即用兼容性
它是一个在精度、性能和易用性之间取得平衡的交钥匙解决方案,非常适合要求规模化效率的生产场景。
GPTQ
GPTQ 是一种快速的训练后量化方法,可将大型 Transformer 模型压缩到每个权重 3–4 位,且精度损失极小。它专为扩展到数千亿参数规模的模型而设计,并且无需重新训练。
亮点:
- 规模化高效: 可在约 4 个 GPU 小时内量化 OPT-175B 或 BLOOM-176B 等模型。
- 极小的精度损失: 即使在激进压缩下也能保持较低的困惑度。
- 极端量化: 支持 2 位和三值量化,仍保持可用性能。
- 在单张 GPU 上运行巨型模型: 可在单张 A100 或两张 A6000 上推理 175B 模型。
- 性能提升: 自定义 GPU 内核带来比 FP16 约 3.25 倍的加速。
GPTQ 被广泛用于开源模型服务流水线,尤其是在 AutoGPTQ 中。它是大型模型高速、低内存推理的首选方法。
许多现代推理框架不仅能高效地服务量化模型,还提供内置的 API 或工具来量化模型。例如,在线量化通常只需要一个服务参数:
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 文档中的量化(Quantization in the MAX documentation)。
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 文档中的量化(Quantization in the vLLM documentation)。
SGLang
sglang serve --model-path meta-llama/Llama-3.1-8B-Instruct \
--quantization fp8
--quantization 接受 awq、gptq、fp8 和 bitsandbytes 等方法。更多信息请参阅 SGLang 文档中的量化(Quantization in the SGLang documentation)。
在其他情况下,模型会使用专门的工具离线量化,然后由服务框架直接加载。因此,大多数用户不再需要自己实现量化算法。
你通常可以从 Hugging Face 上已有的量化模型开始。它托管了许多预量化变体,例如 8 位和 4 位模型,这些模型开箱即可用于推理,并针对更低的内存占用和更快的部署进行了优化。同时,如果你想应用自己的量化策略,它也提供全精度基础模型。
其他资源
- Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference
- AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration
- GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers
- SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models