大模型量化详解
把 FP16/BF16 的权重压成 INT8/INT4,是让大模型「跑得动、跑得便宜」的头号手段。面试官爱问:量化到底省了什么?精度掉了怎么办?GPTQ 和 AWQ 差在哪?
01为什么要量化
模型显存 ≈ 参数量 × 每参数字节数。精度越低,单卡能塞下的模型越大:
02精度格式谱系
FP32 / FP16
训练常用;FP16 易溢出的问题靠 loss scaling 或改用 BF16。
BF16
指数位与 FP32 相同,动态范围大、不易溢出,A100/H100 推理默认选。
FP8 (E4M3/E5M2)
H100 原生支持,精度损失小,是新一代推理加速主力。
INT8
典型「训练后量化」目标,精度损失较小,成熟稳定。
INT4 / NF4
4-bit,显存骤降,QLoRA 用 NF4 装下 65B;需小心精度。
INT2 / 1.58-bit
极限探索(BitNet),研究阶段,工程少见。
量化本质是用更少的 bit 表示同一个数:量化值 = round(实数 / scale) + zero_point,反量化时 实数 ≈ 量化值 × scale。核心难点是选好 scale,避免把重要的大数值「压爆」。
03PTQ vs QAT
PTQ(训练后量化)
模型训好后直接量化,只需少量校准数据(几百条)统计激活分布来定 scale。零训练、快、最常用。
QAT(量化感知训练)
训练时就插入伪量化节点,让模型「提前适应」量化误差,精度更好但要重训、成本高。
04量化对象:权重 / 激活 / KV
不是所有张量都该量化,三者影响不同:
W(权重)
静态、占显存大头,量化收益最大,最常被量化。
A(激活)
动态、逐 token 变化,量化难、易掉点,常用 per-token 动态量化。
KV(缓存)
长上下文下显存爆炸,KV Cache 量化(INT8/INT4)是省显存利器。
组合上常见的有 W4A16(权重 4bit、激活 16bit,QLoRA/GPTQ 常用)、W8A8(更稳)、W4A4(激进、研究向)。
05GPTQ 与 AWQ
GPTQ
逐层、逐列量化,用「最小化重构误差」的二阶信息补偿,量化慢但精度好,是 4-bit 事实标准之一。
AWQ(激活感知)
观察到「少量显著权重」对精度影响巨大,只保护这些权重不量化、其余均匀量化。快、硬件友好,效果常优于 GPTQ。
06GGUF 与 llama.cpp
GGUF 是 llama.cpp 生态的模型文件格式,内置量化信息、元数据、分词器,可在 CPU / Apple 芯片 / 各种卡上原地运行。配合 q4_K_M 等量化等级,是本地部署(笔记本跑 7B/13B)最流行的方案。
- 优势:单文件、跨平台、对消费级硬件极友好。
- 常见档位:
q4_0 / q4_K_M / q5_K_M / q8_0,数字越大越准越占空间。
07量化与部署权衡
- 追求质量:BF16 / FP8,上大显存卡。
- 追求省钱/本地:INT4(AWQ/GPTQ 或 GGUF q4)。
- 追求吞吐:FP8 在 H100 上往往比 INT4 更香(硬件原生、不掉点)。
08面试速记卡
量化省什么?
显存(权重×字节)+ 带宽(搬得快),直接决定能上什么硬件。
PTQ / QAT
PTQ 免训练、上线快(主流);QAT 精度高、要重训。
W/A/KV
权重最该量化;激活动态量化;KV 量化救长上下文。
GPTQ vs AWQ
误差补偿 vs 保护重要权重;都是 4-bit PTQ。