跳转到主要内容

量化: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 倍

量化的三重收益:

  1. 减少显存占用 → 能跑更大的模型 / 更大的 batch
  2. 减少数据搬运量 → 直接加速 memory-bound 的 decode
  3. 部分硬件有低精度加速单元 → 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推理适用场景
GPTQINT4/3/2优秀 (Marlin kernel)不支持GPU 服务端部署
AWQINT4优秀不支持GPU 服务端部署
GGUFQ2-Q8中等良好支持本地/边缘/混合部署
BitsAndBytesINT8/INT4中等良好不支持快速实验/QLoRA微调
FP8FP8最快最优 (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. 延伸阅读

修改历史1 次提交