7.2 模型量化:INT8/INT4、AWQ 与 GPTQ


文档摘要

7.2 模型量化:INT8/INT4、AWQ 与 GPTQ 一个 70B 模型用 FP16 要 140GB 显存,用 INT4 只要 35GB——一张 A100 就装得下。量化是 LLM 推理降本最直接、效果最显著的武器,但「精度掉多少」是它的核心权衡。 7.2.1 量化是什么:用更低精度存权重 量化(Quantization) 指把模型权重(通常 FP16/BF16,每参数 2 字节)压缩到更低精度(INT8 每参数 1 字节、INT4 每参数 0.5 字节),从而减少显存占用、提升推理速度。

7.2 模型量化:INT8/INT4、AWQ 与 GPTQ

一个 70B 模型用 FP16 要 140GB 显存,用 INT4 只要 35GB——一张 A100 就装得下。量化是 LLM 推理降本最直接、效果最显著的武器,但「精度掉多少」是它的核心权衡。

7.2.1 量化是什么:用更低精度存权重

量化(Quantization) 指把模型权重(通常 FP16/BF16,每参数 2 字节)压缩到更低精度(INT8 每参数 1 字节、INT4 每参数 0.5 字节),从而减少显存占用、提升推理速度。

精度 每参数字节 70B 模型大小 相对 FP16
FP32 4 280 GB 2x
FP16/BF16 2 140 GB 1x(基线)
INT8 1 70 GB 0.5x
INT4 0.5 35 GB 0.25x
INT2 0.25 17.5 GB 0.125x

量化的收益显而易见:

  • 显存减半到 1/4:原本需要 4 卡的模型,量化后 1 卡就能装下。
  • 吞吐提升:显存带宽是 Decode 阶段的瓶颈,权重小了、读取快了,Decode 加速。
  • 成本下降:可以用更便宜的卡(如 L20、T4)跑更大的模型。

但量化的代价是精度损失——把连续的浮点数压到有限的整数级别,必然引入误差。怎么把误差控制到「不影响业务效果」,是量化的核心议题。

7.2.2 量化的两个维度:权重 vs 激活

量化要分清两个对象:

  • 权重量化(Weight Quantization):量化模型权重。权重是静态的(训练后不变),量化相对容易。
  • 激活量化(Activation Quantization):量化前向传播中的激活值。激活随输入变化,分布动态,量化更难。

LLM 推理中:

  • 权重量化几乎总是做(容易、收益大)。
  • 激活量化对 LLM 较难,因为激活中有少量「离群点(outliers)」分布极不均匀,量化易损失精度。
  • KV Cache 量化是激活量化的一个特例,专门量化缓存中的 K/V(详见 7.2.6)。

💡 判读:现代 LLM 量化研究的主流是「权重 + KV Cache 量化」,而激活(中间状态)量化只在特定场景做。这是权重量化技术(如 AWQ/GPTQ)成熟、激活量化困难的结果。

7.2.3 量化粒度:从 tensor 到 group

量化的另一个维度是「粒度」——多少参数共享一个量化参数(scale 与 zero point)。

粒度 含义 精度 计算/存储开销
per-tensor 整个张量一个 scale 低(最粗) 极低
per-channel 每个通道一个 scale
per-group 每组 N 个元素一个 scale 高(最细) 中(默认 group=128)
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 280" font-family="sans-serif" font-size="12"> <text x="360" y="22" text-anchor="middle" font-size="15" font-weight="bold">量化粒度对比</text> <!-- per-tensor --> <rect x="40" y="60" width="640" height="50" rx="6" fill="#fee2e2" stroke="#dc2626"/> <text x="60" y="80" font-weight="bold">per-tensor:</text> <text x="60" y="100" font-size="11">整个矩阵一个 scale → 精度低、开销最小</text> <!-- per-channel --> <rect x="40" y="120" width="640" height="50" rx="6" fill="#fef9c3" stroke="#ca8a04"/> <text x="60" y="140" font-weight="bold">per-channel:</text> <g> <rect x="180" y="125" width="100" height="40" fill="#ca8a04" opacity="0.6"/> <rect x="280" y="125" width="100" height="40" fill="#ca8a04" opacity="0.6"/> <rect x="380" y="125" width="100" height="40" fill="#ca8a04" opacity="0.6"/> <rect x="480" y="125" width="100" height="40" fill="#ca8a04" opacity="0.6"/> </g> <text x="580" y="145" font-size="10">每列一个 scale</text> <!-- per-group --> <rect x="40" y="180" width="640" height="50" rx="6" fill="#dcfce7" stroke="#16a34a"/> <text x="60" y="200" font-weight="bold">per-group:</text> <g> <rect x="180" y="185" width="40" height="40" fill="#16a34a" opacity="0.6"/> <rect x="220" y="185" width="40" height="40" fill="#16a34a" opacity="0.6"/> <rect x="260" y="185" width="40" height="40" fill="#16a34a" opacity="0.6"/> <rect x="300" y="185" width="40" height="40" fill="#16a34a" opacity="0.6"/> <rect x="340" y="185" width="40" height="40" fill="#16a34a" opacity="0.6"/> <rect x="380" y="185" width="40" height="40" fill="#16a34a" opacity="0.6"/> <rect x="420" y="185" width="40" height="40" fill="#16a34a" opacity="0.6"/> <rect x="460" y="185" width="40" height="40" fill="#16a34a" opacity="0.6"/> <rect x="500" y="185" width="40" height="40" fill="#16a34a" opacity="0.6"/> <rect x="540" y="185" width="40" height="40" fill="#16a34a" opacity="0.6"/> </g> <text x="620" y="205" font-size="10">每 128 个一组</text> <text x="360" y="260" text-anchor="middle" font-size="11" fill="#475569">粒度越细 → 精度越高、开销越大;AWQ/GPTQ 默认 per-group(group=128)</text> </svg>

7.2.4 量化方式:PTQ vs QAT

按量化时机分两类:

  • PTQ(Post-Training Quantization,训练后量化):模型训练完成后,无需再训练,直接量化。简单、快速,但精度可能损失。
  • QAT(Quantization-Aware Training,量化感知训练):在训练时模拟量化误差,让模型适应量化。精度更高,但要重训练。

LLM 场景中,由于训练成本极高(百万美元级),PTQ 是主流——已发布的大模型(Llama、Qwen 等)大多直接 PTQ 量化使用。QAT 只在精度要求极高、有资源重训的场景使用。

7.2.5 主流量化方案:AWQ 与 GPTQ

LLM 权重量化的两大主流方案是 AWQGPTQ。它们都属于 PTQ,但思路不同。

GPTQ:基于二阶信息的量化

GPTQ(Generalized Post-Training Quantization)基于经典的 OBQ(Optimal Brain Quantization)方法,核心思想:

  • 逐层量化,每层的量化误差用二阶信息(Hessian 矩阵)建模。
  • 量化一个权重时,把误差「补偿」到还没量化的权重上,最小化整体误差。
  • 用校准集(calibration set)估计 Hessian。

GPTQ 的特点:

  • 量化质量高(per-group 下精度损失小)。
  • 量化过程需要校准集与较多计算(量化一个 70B 模型要数十分钟到数小时)。
  • 适合 INT4 与 INT3 量化。

AWQ:激活感知的量化

AWQ(Activation-aware Weight Quantization)的核心洞察是:不是所有权重都同样重要——与「显著激活通道」对应的权重对精度影响大,应该保护。

AWQ 的做法:

  • 用校准集找出「显著通道」(激活值大的通道)。
  • 给这些通道的权重一个保护性 scale,减少量化误差。
  • 等效于一个等价的、对激活分布友好的量化。

AWQ 的特点:

  • 量化质量与 GPTQ 相当甚至略优。
  • 量化速度比 GPTQ 快(无需二阶计算)。
  • 推理 kernel 优化好(vLLM、TGI 都原生支持)。
  • 适合 INT4 量化,是当前 INT4 的事实标准。
维度 GPTQ AWQ
思路 二阶信息补偿 激活感知保护
量化速度 慢(数十分钟-小时) 快(数分钟)
精度 高(略优)
推理 kernel 支持 广 极广(主流引擎原生)
INT4 表现
适合 INT3/INT4 INT4(事实标准)

💡 判读:AWQ 是 2024 年的事实标准——量化快、精度优、kernel 支持广。新项目优先 AWQ-INT4。GPTQ 适合已有 GPTQ 模型或对 INT3 极致追求的场景。

7.2.6 KV Cache 量化:激活量化的特例

回顾第 6 章 6.2 节,KV Cache 是 LLM 推理显存的大头(占 50%-90%)。量化 KV Cache 可以进一步降低显存、提升吞吐。

KV Cache 量化的特点:

  • 只量化 K 和 V,不量化 Q(Q 是每步新计算的,量化的收益小)。
  • 粒度可以是 per-tensor 或 per-token
  • 精度选择 INT8 或 FP8(FP8 是 H100/H200 支持的新格式,精度更高)。

KV Cache 量化的精度损失比权重量化敏感——KV Cache 是「累积」的,误差会在长序列上放大。所以 KV Cache 量化通常只到 INT8 或 FP8,不到 INT4。

量化对象 推荐精度 收益 风险
权重 INT4/INT8 显存 1/4-1/2 中(可接受)
KV Cache INT8/FP8 显存 1/2 中(长序列敏感)
激活(中间) 一般不做 - 高(outlier 多)

7.2.7 FP8:H100 时代的量化新选项

FP8(8-bit Floating Point) 是 NVIDIA Hopper 架构(H100)引入的新数据格式。它不是整数(INT8),而是 8 位浮点数,有两种格式:

  • E4M3:4 位指数 + 3 位尾数,精度较高,适合前向。
  • E5M2:5 位指数 + 2 位尾数,动态范围大,适合梯度。

FP8 的优势:

  • 精度优于 INT8:浮点格式对 outlier 更友好。
  • 硬件加速:H100/H200 原生支持 FP8 矩阵乘法。
  • 简化量化:FP8 量化比 INT8 更鲁棒,几乎无需调参。

FP8 的限制:

  • 只支持 Hopper+:A100、V100、T4、L20 等不支持。
  • 生态尚在成熟:vLLM、TGI 已支持 FP8,但工具链不如 INT8 完善。
精度 硬件要求 精度 加速 适合
INT4 通用 极快(显存最小) 通用降本
INT8 通用 通用
FP8 Hopper+ 更高 快(原生) H100/H200 用户

7.2.8 量化的精度损失:到底掉多少?

量化最关键的问题是「精度掉多少」。这取决于模型、量化方案、量化粒度。一些公认的经验数据(以 perplexity 为指标,越低越好):

量化方案 LLaMA-7B PPL LLaMA-70B PPL 相对 FP16 损失
FP16(基线) 5.68 3.31 0%
INT8 (per-channel) 5.69 3.32 <1%
INT4 GPTQ 5.75 3.34 1%-2%
INT4 AWQ 5.74 3.33 1%-2%
INT3 GPTQ 5.93 3.45 4%-5%
INT2 6.5+ 4.0+ 15%+(显著)

可以看到:

  • INT8:精度损失 <1%,几乎无感,是「免费午餐」。
  • INT4:精度损失 1%-2%,业务上可接受,是「性价比甜点」。
  • INT3:精度损失 5% 左右,要权衡。
  • INT2:精度损失 15%+,效果显著下降,仅特定场景(极小模型)可用。

⚠️ 现实提醒:上面的数字是 perplexity 这种「通用指标」。在实际业务指标(如代码生成准确率、数学推理、中文理解)上,量化的损失可能更大或更小,要根据业务测试集实测。比如代码生成对量化敏感(INT4 可能掉几个百分点 pass@1),而闲聊几乎无感。

7.2.9 量化的推理加速

量化不仅省显存,还加速推理:

  • Decode 阶段:瓶颈是显存带宽(每步读权重)。权重小了 1/2-1/4,读取快了,Decode 加速。
  • Prefill 阶段:瓶颈是计算(并行算大量 token)。量化后 INT4/INT8 矩阵乘法有专用 kernel 加速(如 Tensor Core 的 INT4 GEMM)。
  • 专用 kernel:vLLM/TGI 的量化 kernel 经过精细优化,几乎能达到硬件理论 INT4/INT8 算力。
量化 Decode 加速 Prefill 加速 备注
INT8 1.5-2x 1.3-1.5x 通用
INT4 2-3x 1.5-2x 量化 kernel 优化好
FP8 1.5-2x 1.5-2x H100 原生

7.2.10 量化的工程实践

落地量化的几个工程实践:

  1. 优先 INT4 AWQ:精度损失可接受、收益最大、生态最成熟。
  2. KV Cache 用 INT8/FP8:进一步省显存,注意长序列场景的精度。
  3. 有 H100 用 FP8:精度更优、硬件加速好。
  4. 业务指标实测:不要只看 perplexity,要在业务测试集上验证精度。
  5. 保留 FP16 备份:关键场景保留 FP16 模型作为「高精度兜底」,量化出问题可快速切换。
  6. 量化与 PagedAttention 兼容:现代引擎都同时支持,量化不损失分页优化的收益。
  7. 量化与 Speculative Decoding 兼容:可以同时用,降本与加速叠加(7.3 节)。
实践 价值
优先 INT4 AWQ 性价比甜点
KV Cache INT8/FP8 进一步省显存
H100 用 FP8 精度与性能双优
业务指标实测 防止业务劣化
保留 FP16 备份 高精度兜底
兼容 PagedAttention 不损失分页优化
兼容 Speculative 降本加速叠加

💡 判读:量化是 LLM 推理降本的「第一性武器」——它直接把显存与算力需求砍半到 1/4。一个 70B 模型从 4 卡 A100 变成 1 卡 A100(INT4),成本直接降到 1/4。这种收益是其他优化难以比拟的。

7.2.11 量化之外:其他压缩技术

量化是最主流的压缩技术,但还有其他方向:

  • 稀疏化(Sparsity):把权重中接近 0 的设为 0,跳过 0 计算。需要硬件支持(如 NVIDIA 2:4 structured sparsity)。
  • 蒸馏(Distillation):用大模型蒸馏出小模型,永久减小模型体积(第 5 章已涉及)。
  • 剪枝(Pruning):直接删掉不重要的权重/通道。
  • 低秩分解(Low-Rank Decomposition):把大矩阵分解为两个小矩阵相乘。

LLM 场景这些技术的应用不如量化广泛,因为它们要么需要重训练(蒸馏、剪枝),要么硬件支持有限(稀疏化)。量化仍是最实用的「训练后、即用、即降本」技术。

本节小结

  • 量化把 FP16 权重压缩到 INT8/INT4,显存减半到 1/4,是 LLM 推理降本第一性武器。
  • 量化对象分权重(容易)、激活(难)、KV Cache(特例);LLM 主流量化「权重 + KV Cache」。
  • 量化粒度:per-tensor(粗、低精度)→ per-channel → per-group(细、高精度,AWQ/GPTQ 默认 group=128)。
  • 量化方式:PTQ(训练后,主流)vs QAT(量化感知,LLM 少用)。
  • GPTQ(二阶信息补偿)与 AWQ(激活感知保护)是两大权重量化方案,AWQ 是 2024 事实标准。
  • KV Cache 量化用 INT8/FP8,对长序列敏感,进一步省显存。
  • FP8(Hopper 原生)精度优于 INT8、硬件加速好,是 H100/H200 用户的新选项。
  • 精度损失:INT8 <1%(免费午餐)、INT4 1%-2%(甜点)、INT3 5%(权衡)、INT2 15%+(不可用)。
  • 推理加速:INT4 Decode 加速 2-3x,因为权重小、读取快。
  • 工程实践:优先 INT4 AWQ + KV Cache INT8 + H100 用 FP8 + 业务实测 + 保留 FP16 备份。

下一节《7.3 Speculative Decoding:投机采样加速》将讲清无损加速的另一利器。


发布者: 作者: 灏天文库 转发
评论区 (0)
U