量化:INT8 / INT4 / FP8 到底在干嘛
1. 量化的本质
1.1 量化不是压缩,是精度转换
量化的核心操作:把模型权重(和/或激活值)从高精度浮点数转换为低精度整数或浮点数。
原始权重 (FP16): 每个参数 16 bit = 2 bytes
INT8 量化后: 每个参数 8 bit = 1 byte → 省 50% 显存
INT4 量化后: 每个参数 4 bit = 0.5 byte → 省 75% 显存
不是 zip 那种压缩,而是用更少的 bit 来表示同一个数值,必然损失精度。关键在于:损失多少精度是可接受的?
1.2 为什么量化能加速推理?
回忆上一章:decode 是 memory-bound,瓶颈在于从显存读取权重的速度。
Llama-3-8B decode 一个 token:
FP16: 读 16 GB 权重 / 2 TB/s 带宽 = 8ms
INT8: 读 8 GB 权重 / 2 TB/s 带宽 = 4ms ← 快 2 倍
INT4: 读 4 GB 权重 / 2 TB/s 带宽 = 2ms ← 快 4 倍
量化的三重收益:
- 减少显存占用 → 能跑更大的模型 / 更大的 batch
- 减少数据搬运量 → 直接加速 memory-bound 的 decode
- 部分硬件有低精度加速单元 → INT8 Tensor Core 比 FP16 更快
2. 数据格式详解
2.1 浮点格式家族
FP32 (32 bit): 1 sign + 8 exponent + 23 mantissa
范围大,精度高,但太占空间
模型训练的传统格式
FP16 (16 bit): 1 sign + 5 exponent + 10 mantissa
范围较小,容易溢出
推理常用格式
BF16 (16 bit): 1 sign + 8 exponent + 7 mantissa
范围同 FP32,精度低于 FP16
训练和推理都好用(A100+ 支持)
FP8 E4M3: 1 sign + 4 exponent + 3 mantissa
H100 原生支持,推理新宠
精度有限但够用
FP8 E5M2: 1 sign + 5 exponent + 2 mantissa
范围更大,精度更低
适合梯度等需要大范围的场景
2.2 整数格式
INT8 (8 bit): 范围 [-128, 127] 或 [0, 255]
需要 scale + zero_point 映射回浮点
量化公式: x_quant = round(x / scale) + zero_point
INT4 (4 bit): 范围 [-8, 7] 或 [0, 15]
只有 16 个离散值!
需要更精细的量化策略(分组量化)
2.3 量化映射过程
原始 FP16 权重: [0.23, -1.45, 0.87, -0.12, 2.31, ...]
INT8 对称量化 (per-tensor):
scale = max(|weights|) / 127 = 2.31 / 127 ≈ 0.0182
量化: round(0.23 / 0.0182) = 13
round(-1.45 / 0.0182) = -80
...
存储: [13, -80, 48, -7, 127, ...] ← 每个只要 1 byte
反量化 (推理时):
13 × 0.0182 = 0.2366 (原始 0.23, 误差 0.0066)
-80 × 0.0182 = -1.456 (原始 -1.45, 误差 0.006)
3. 主流量化方法对比
3.1 GPTQ (Post-Training Quantization)
核心思想: 逐层量化,用少量校准数据最小化量化误差
基于 OBQ (Optimal Brain Quantization) 的近似方法
流程:
1. 准备校准数据集(128-256 条样本)
2. 逐层处理:量化当前层权重,用 Hessian 信息补偿误差
3. 输出量化后的模型
特点:
✓ 支持 INT4/INT3/INT2
✓ 量化质量好(有误差补偿)
✓ 推理时有高效 CUDA kernel(ExLlama, Marlin)
✗ 量化过程较慢(需要校准数据 + 逐层优化)
✗ 对校准数据有一定依赖
3.2 AWQ (Activation-Aware Weight Quantization)
核心思想: 不是所有权重同等重要!
通过观察激活值分布,找出"重要"权重通道,对其保护
流程:
1. 用校准数据跑一遍 forward,统计每个通道的激活值大小
2. 激活值大的通道 → 对应权重更重要 → 用 scale 保护
3. 对 scale 后的权重做标准量化
特点:
✓ 量化质量通常优于 GPTQ(尤其 INT4)
✓ 量化速度快(不需要逐层优化)
✓ 硬件友好,有高效 kernel
✗ 需要校准数据
3.3 GGUF (llama.cpp 格式)
核心思想: CPU/混合推理友好的量化格式
支持多种量化级别(Q2_K 到 Q8_0)
特点:
✓ 支持 CPU 推理(不需要 GPU)
✓ 支持 CPU+GPU 混合推理(模型部分在 GPU,部分在 CPU)
✓ 格式自包含(模型+tokenizer+元数据 一个文件)
✓ 量化级别丰富(Q2 到 Q8,K-quant 变体)
✗ GPU 推理速度不如 GPTQ/AWQ(kernel 优化程度不同)
✗ 主要生态在 llama.cpp / Ollama
3.4 对比总结
| 方法 | 精度 | 速度 | GPU推理 | CPU推理 | 适用场景 |
|---|---|---|---|---|---|
| GPTQ | INT4/3/2 | 快 | 优秀 (Marlin kernel) | 不支持 | GPU 服务端部署 |
| AWQ | INT4 | 快 | 优秀 | 不支持 | GPU 服务端部署 |
| GGUF | Q2-Q8 | 中等 | 良好 | 支持 | 本地/边缘/混合部署 |
| BitsAndBytes | INT8/INT4 | 中等 | 良好 | 不支持 | 快速实验/QLoRA微调 |
| FP8 | FP8 | 最快 | 最优 (H100原生) | 不支持 | H100/H200 生产部署 |
4. 量化对 Prefill 和 Decode 的加速差异
Prefill (Compute-bound):
量化减少了计算量(INT4 乘法比 FP16 快)
但 prefill 瓶颈在算力,加速效果有限
典型加速: 1.2x - 1.5x
Decode (Memory-bound):
量化直接减少了要读取的数据量
decode 瓶颈在带宽,加速效果显著
典型加速: 2x - 4x (与量化比例成正比)
这解释了为什么量化是”小显卡跑大模型”的核心技术:
Llama-3-70B 部署需求:
FP16: 140 GB 显存 → 需要 2×A100-80GB
INT8: 70 GB 显存 → 需要 1×A100-80GB
INT4: 35 GB 显存 → 需要 1×A100-40GB 或 RTX 4090 (24GB + offload)
INT4 decode 速度还更快(读的数据少了 4 倍)
5. 分组量化 (Group Quantization)
INT4 只有 16 个离散值,per-tensor 量化误差太大。解决方案:分组量化。
Per-tensor 量化:
整个权重矩阵共享 1 个 scale → 误差大
Per-channel 量化:
每个输出通道 1 个 scale → 好一些
Group 量化 (group_size=128):
每 128 个连续权重共享 1 个 scale → 误差小很多
额外存储: 每组 1 个 FP16 scale = 2 bytes / 128 params
开销: 2/128 = 0.015 bytes/param,可忽略
示例:
权重 [w₁, w₂, ..., w₁₂₈] → scale₁, [q₁, q₂, ..., q₁₂₈]
权重 [w₁₂₉, ..., w₂₅₆] → scale₂, [q₁₂₉, ..., q₂₅₆]
GPTQ 和 AWQ 默认都用 group_size=128 的分组量化。
6. 关键要点总结
┌──────────────────────────────────────────────────────────┐
│ 量化核心认知 │
├──────────────────────────────────────────────────────────┤
│ 1. 量化 = 低精度表示权重,用精度换显存和速度 │
│ 2. 对 decode (memory-bound) 加速最明显,接近线性 │
│ 3. AWQ ≥ GPTQ > BnB 在质量上;GGUF 适合 CPU/混合推理 │
│ 4. FP8 是 H100 时代的生产标准,几乎无精度损失 │
│ 5. 分组量化 (group_size=128) 是 INT4 保持质量的关键 │
│ 6. 量化让 70B 模型跑在单卡上成为可能 │
└──────────────────────────────────────────────────────────┘
7. 延伸阅读
- Complete LLM Quantization Comparison — GPTQ vs AWQ vs GGUF — 全面的量化方法对比
- NVIDIA: Optimizing LLMs with Post-Training Quantization — NVIDIA 官方量化指南
- The Complete Guide to LLM Quantization with vLLM — vLLM 量化实战 benchmark
- The Impact of Quantization on vLLM Inference Performance — 量化对推理性能的量化分析
修改历史1 次提交
- docs(ai-systems): add comprehensive LLM inference documentationxiaocheng··
7c98505