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 要 140GB 显存,用 INT4 只要 35GB——一张 A100 就装得下。量化是 LLM 推理降本最直接、效果最显著的武器,但「精度掉多少」是它的核心权衡。
量化(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 |
量化的收益显而易见:
但量化的代价是精度损失——把连续的浮点数压到有限的整数级别,必然引入误差。怎么把误差控制到「不影响业务效果」,是量化的核心议题。
量化要分清两个对象:
LLM 推理中:
💡 判读:现代 LLM 量化研究的主流是「权重 + KV Cache 量化」,而激活(中间状态)量化只在特定场景做。这是权重量化技术(如 AWQ/GPTQ)成熟、激活量化困难的结果。
量化的另一个维度是「粒度」——多少参数共享一个量化参数(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>
按量化时机分两类:
LLM 场景中,由于训练成本极高(百万美元级),PTQ 是主流——已发布的大模型(Llama、Qwen 等)大多直接 PTQ 量化使用。QAT 只在精度要求极高、有资源重训的场景使用。
LLM 权重量化的两大主流方案是 AWQ 与 GPTQ。它们都属于 PTQ,但思路不同。
GPTQ(Generalized Post-Training Quantization)基于经典的 OBQ(Optimal Brain Quantization)方法,核心思想:
GPTQ 的特点:
AWQ(Activation-aware Weight Quantization)的核心洞察是:不是所有权重都同样重要——与「显著激活通道」对应的权重对精度影响大,应该保护。
AWQ 的做法:
AWQ 的特点:
| 维度 | GPTQ | AWQ |
|---|---|---|
| 思路 | 二阶信息补偿 | 激活感知保护 |
| 量化速度 | 慢(数十分钟-小时) | 快(数分钟) |
| 精度 | 高 | 高(略优) |
| 推理 kernel 支持 | 广 | 极广(主流引擎原生) |
| INT4 表现 | 好 | 优 |
| 适合 | INT3/INT4 | INT4(事实标准) |
💡 判读:AWQ 是 2024 年的事实标准——量化快、精度优、kernel 支持广。新项目优先 AWQ-INT4。GPTQ 适合已有 GPTQ 模型或对 INT3 极致追求的场景。
回顾第 6 章 6.2 节,KV Cache 是 LLM 推理显存的大头(占 50%-90%)。量化 KV Cache 可以进一步降低显存、提升吞吐。
KV Cache 量化的特点:
KV Cache 量化的精度损失比权重量化敏感——KV Cache 是「累积」的,误差会在长序列上放大。所以 KV Cache 量化通常只到 INT8 或 FP8,不到 INT4。
| 量化对象 | 推荐精度 | 收益 | 风险 |
|---|---|---|---|
| 权重 | INT4/INT8 | 显存 1/4-1/2 | 中(可接受) |
| KV Cache | INT8/FP8 | 显存 1/2 | 中(长序列敏感) |
| 激活(中间) | 一般不做 | - | 高(outlier 多) |
FP8(8-bit Floating Point) 是 NVIDIA Hopper 架构(H100)引入的新数据格式。它不是整数(INT8),而是 8 位浮点数,有两种格式:
FP8 的优势:
FP8 的限制:
| 精度 | 硬件要求 | 精度 | 加速 | 适合 |
|---|---|---|---|---|
| INT4 | 通用 | 中 | 极快(显存最小) | 通用降本 |
| INT8 | 通用 | 高 | 快 | 通用 |
| FP8 | Hopper+ | 更高 | 快(原生) | H100/H200 用户 |
量化最关键的问题是「精度掉多少」。这取决于模型、量化方案、量化粒度。一些公认的经验数据(以 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%+(显著) |
可以看到:
⚠️ 现实提醒:上面的数字是 perplexity 这种「通用指标」。在实际业务指标(如代码生成准确率、数学推理、中文理解)上,量化的损失可能更大或更小,要根据业务测试集实测。比如代码生成对量化敏感(INT4 可能掉几个百分点 pass@1),而闲聊几乎无感。
量化不仅省显存,还加速推理:
| 量化 | 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 原生 |
落地量化的几个工程实践:
| 实践 | 价值 |
|---|---|
| 优先 INT4 AWQ | 性价比甜点 |
| KV Cache INT8/FP8 | 进一步省显存 |
| H100 用 FP8 | 精度与性能双优 |
| 业务指标实测 | 防止业务劣化 |
| 保留 FP16 备份 | 高精度兜底 |
| 兼容 PagedAttention | 不损失分页优化 |
| 兼容 Speculative | 降本加速叠加 |
💡 判读:量化是 LLM 推理降本的「第一性武器」——它直接把显存与算力需求砍半到 1/4。一个 70B 模型从 4 卡 A100 变成 1 卡 A100(INT4),成本直接降到 1/4。这种收益是其他优化难以比拟的。
量化是最主流的压缩技术,但还有其他方向:
LLM 场景这些技术的应用不如量化广泛,因为它们要么需要重训练(蒸馏、剪枝),要么硬件支持有限(稀疏化)。量化仍是最实用的「训练后、即用、即降本」技术。
下一节《7.3 Speculative Decoding:投机采样加速》将讲清无损加速的另一利器。