在大语言模型(LLM)中,量化(Quantization) 是指将模型中的权重、激活值等数值从高精度浮点数(如 FP32、FP16、BF16)转换为低精度整数(如 INT8、INT4、INT2)的过程。简单说,就是用更少的比特数来表示原来的数值,从而大幅降低模型的存储占用和计算开销。

什么是量化?

想象你要把一幅高清照片(每个像素 1600 万色)发送给一个只能显示 256 色的老式手机。你会发现:虽然颜色数量大幅减少,但照片的大部分信息仍然保留——人还是那个人,景还是那个景。

量化(Quantization)做的正是这件事:把模型中高精度的浮点数(如 32 位或 16 位)映射为低位数表示(如 8 位或 4 位整数),从而压缩模型体积、降低显存占用、加快推理速度。

量化的”魔力”在于:大模型权重存在大量冗余。研究表明,LLM 中的权重分布非常集中(近似高斯分布),绝大多数值聚集在零附近,因此用较少的档位去近似它们,损失的精度非常有限。

量化的三大收益

  • 省显存:INT4 相比 FP16,模型体积缩小 4 倍
  • 提速度:整数运算和低精度访存更快,且显存带宽往往是推理瓶颈,读的数据少了,速度自然快
  • 降功耗:数据搬运量减少,能耗显著降低,对端侧部署至关重要

数值格式的世界:从 FP32 到 INT4

要理解量化,先要理解计算机如何表示数字。浮点数由三部分组成:符号位(Sign)、指数位(Exponent)、尾数位(Mantissa),类似科学计数法。

下表汇总了常见格式的关键参数:

注意:INT4 只有 16 个档位,看起来”完全不够用”。但配合每组权重的缩放因子(scale),INT4 可以表达 16 个均匀分布在该组实际数值范围内的档位——这正是下一节的主角。

量化的数学原理

基本公式:缩放与反量化

线性量化的思路非常朴素:找到浮点数范围与整数范围之间的”比例尺”。以将一组权重 [−0.8, 0.9] 量化到 INT4 为例:

量化:  q = round( w / scale )      反量化:  w ≈ q × scale

对称量化(Symmetric)时,scale 的计算为:

scale = max(|w|) / 7   (INT4 对称范围 -8 ~ 7,用 7 做除数保证不越界)

对称 vs 非对称量化

对称量化(Symmetric)

浮点范围关于 0 对称映射到整数范围(如 −128 ~ 127)。公式简单、反量化无需零点偏移,速度快。权重分布通常近似零对称,故权重量化首选。

非对称量化(Asymmetric)

引入零点(zero-point):q = round(w/scale) + zp。能充分利用整数档位,适合分布偏斜的数据。激活值(如 ReLU 后恒为正)常采用非对称量化。

分组量化(Group-wise Quantization)

一个 7B 模型有 70 亿个权重,用同一个 scale 显然”一刀切”。实际做法是把权重切成小组(常见 group size = 128),每组独立计算 scale:

开销账:group_size = 128 时,每 128 个 INT4 权重(512 bit)附带一个 FP16 scale(16 bit),额外开销仅 3.1%。这就是为什么 GGUF 文件里 INT4 实际大小约为 FP16 的 1/4 略多。若 group_size = 32,开销升至 12.5%,但精度更优。

两大技术路线:PTQ 与 QAT

两者的核心区别在于是否让模型”感知”量化误差:

校准(Calibration)是什么?PTQ 中需要喂入少量代表性文本,统计每一层激活值的分布范围(min/max 或分位数),据此确定激活量化的 scale。这是 PTQ 的关键步骤——校准数据分布越贴近真实使用场景,量化效果越好。

主流量化算法全景

核心挑战:离群值(Outliers)难题

LLM 量化之所以不是”一除了之”,根源在于离群激活值。Transformer 部分通道会出现远大于其他通道的激活值(可达 100 倍),如果按最大值确定 scale,其他 99% 的数值会被压缩到极少档位,精度崩塌。

主流算法对比

GPTQ 是如何”边量化边纠错”的?

GPTQ 的巧妙之处在于:量化第 i 列权重产生误差时,立刻根据 Hessian 矩阵提供的误差梯度信息,调整后面的列来补偿这个误差——相当于”丢车保帅”,全局损失最小化:

量化对性能的影响

显存:最直接的红利

精度:多少 bit 是安全线?

两个容易踩的坑

  • 模型越小越脆弱:70B 模型 INT4 几乎无损,但 1B~3B 模型量化到 INT4 后能力可能明显下降——小模型冗余少,扛不住信息损失。
  • 基准分数 ≠ 真实体验:MMLU 下降 1% 不代表体感一致。长文本生成、代码、数学推理等任务对量化更敏感,建议用真实任务回归测试。

速度:为什么 W4A16 能加速?

推理(尤其是长上下文生成阶段)是典型的显存带宽瓶颈:每生成一个 token,都要把全部权重从显存搬到计算单元。INT4 权重体积只有 FP16 的 1/4,搬运量降为 1/4,解码速度理论上限提升约 4 倍(实际 2~3 倍,取决于算子实现)。

KV Cache 也逃不过量化

权重之外,推理时还有一块隐形显存大户——KV Cache。自回归生成时,每个 token 的 Key/Value 向量都要缓存,供后续注意力计算使用,其大小随上下文长度线性增长:

KV Cache 大小 = 2 × 层数 × KV头数 × 头维度 × 上下文长度 × 字节数

以 Llama-2-70B(80 层,GQA 前 8 KV 头 × 128 维)、FP16、32K 上下文为例:KV Cache 约需 12.5 GB;若上下文拉到 128K,则暴涨到 50 GB,反超 INT4 权重本身!

实践指南:如何选择量化方案

决策流程

三行命令上手

# 方案一:vLLM 加载 AWQ 量化模型(GPU 服务端)
vllm serve Qwen/Qwen2.5-7B-Instruct-AWQ \
    --quantization awq_marlin

# 方案二:llama.cpp 运行 GGUF(CPU / Mac / 单卡)
llama-cli -m qwen2.5-7b-instruct-q4_k_m.gguf \
    -p "你好,介绍一下自己" -n 512

# 方案三:HuggingFace + bitsandbytes(最简入门)
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2.5-7B-Instruct",
    load_in_4bit=True,          # 一行开启 NF4 量化
    bnb_4bit_compute_dtype="bfloat16",
)

验证量化质量的三板斧

  • 困惑度:用 wiki 文本对比量化前后的 PPL 变化(cpp 内置 llama-perplexity)
  • 基准测试:跑 MMLU / C-Eval / GSM8K 等,看下降是否在 1% 以内
  • 真实任务:用你业务的典型 prompt 做盲测,体感差异往往比分数更真实

总结与展望

核心要点回顾

  • 量化 = 用低位整数近似高位浮点,本质是信息压缩与误差控制的平衡
  • 分组 scale + 零点偏移是精度的关键设计
  • PTQ(GPTQ/AWQ/GGUF)是工程主流,QAT 是极端位宽的未来
  • 离群激活值是 LLM 量化的核心挑战
  • W8 无损、W4 近无损、W2 仍是研究前沿
  • KV Cache 量化是长上下文的必修课

趋势展望

  • FP8 生态成熟:H100/B200 原生支持,训练推理全面铺开
  • 原生低位模型:BitNet b1.58 等从训练起就量化的新范式
  • 极端压缩:AQLM/QuIP# 推动可用的 2-bit 时代
  • 端侧大模型:手机上跑 3B~7B 已成现实
  • 动态量化:按输入难度自适应位宽,精度与效率兼得

量化技术让”大模型自由”从云端走向了每个人的桌面。理解它的原理与边界,你就能在成本、速度与质量之间做出精准的工程权衡——这正是 AI 工程师的核心竞争力之一。

0