正文
大部分model name会包含float(FP)、bfloat(BF)、int、W8A8、A35B等等字样,这其实是不同量化方式的一种体现。
这里会介绍有关大模型量化( Quantization )的基础知识。
还有GPTQ、AWQ介绍。
注意:Qwen3-30B-A3B,这个不属于量化,这是MOE,总参数30B,每次激活3B参数的专家。
1.量化的目的与挑战
目的:
- 减少显存/存储(模型更小)
- 提升推理速度(带宽更低)
-
降低能耗挑战:
- 精度损失(数值被逼近)
- 部分层敏感,量化后可能严重退化
2.常见数值表示格式
| 格式 | 位数 | 结构 | 精度特点 | 动态范围 | 应用场景 |
| — | — | — | — | — | — |
| FP32
(基本不用,参考下面个人理解) | 32 位 | 1符号 + 8指数 + 23尾数 | 高精度 | 极大 | 训练/高精度推理 |
| FP16 | 16 位 | 1+5+10 | 小数精度好,范围有限 | 中 | 推理常用 |
| BF16 | 16 位 | 1+8+7 | 范围大,小数精度差 | 大 | 训练稳定 |
| FP8 (E4M3/E5M2) | 8 位 | 1+(4/5)+(3/2) | 精度有限 | 中 | 新趋势,推理/训练 |
| BF8 | 8 位 | 1+8+(-) | 更强调范围 | 大 | 训练研究中 |
| INT8 | 8 位 | 整数 [-128,127] + scale | 线性格子,误差大 | 小 | 推理主流 |
| INT4 | 4 位 | 整数 [-8,7] + scale | 极少格子,误差更大 | 极小 | 超低精度推理 |
个人理解:为什么FP32基本不用,无论是在训练、推理过程中都不会使用?
是因为LLM属于神经网络模型,通过概率进行预测输出logits。在经过多层网络的特征提取、归一化等等一系列操作后,足够明显的特征已经被无限放大,这使得不需要32位精度表示已经能够很好的进行区分了。即使将所有权重都设为fp32,虽然可能更准确的表示结果,但消耗的资源成倍增长,得不偿失。这是一个权衡关系。同时,目前未量化的模型,基本采用fp16、bf16,已经能够很好的理解语义关系,没有哪个模型需要fp32才能理解语义关系的。
int与W-A量化关系:
W-A量化,其实是属于int量化的一种具体实现形式,在提及int量化时,需要追问 “你是怎么int量化的/你对哪些层int量化?”
3.W-A 量化的含义
- W = Weights 权重量化
- A = Activations 激活量化
常见组合:
- W8A8:权重/激活都 int8 → 常见的推理方案,是int8量化的一种具体方案
- W4A16:权重 int4,激活 FP16 → 节省存储但保持激活精度
- W8A16:权重 int8,激活 FP16 → 常用于量化感知训练 (QAT)
👉 注意:并非所有层都量化
- Embedding 层、输出层、LayerNorm、Softmax 往往保留原始的 FP16/BF16
- 其余线性层用 W-A 量化
问题:为什么W8A8是采用的int8,而不是fp8(bf8),fp、bf不是更精准吗?int不是有精度损失吗?
GPT回答:主要涉及 硬件支持、存储效率、精度vs稳定性的权衡、生态。
硬件支持:int8在NVidia等芯片厂商有成熟的矩阵算法指令,经过多年优化推理速度很快,框架齐全(pytorch、tensor、onnx等)。fp8/bf8一般在新兴GPU(H100、L40)才支持,目前多数GPU没有fp8加速,速度不如int8
存储效率:int8存储简单整数,矩阵乘法实现更高效;fp8/bf8,需要额外浮点格式,开销大。
精度vs稳定性:fp8/bf8在表达能力上更精准,误差更小。但int8可以通过 per-tensor / per-channel scale 技巧把误差压到1%。
成熟的生态:int8有一套完整的工具链体系( AWQ, GPTQ, SmoothQuant )。fp/bf生态不如int8
显存资源有限情况下,不同量化方案的性能:
| 方案 | 显存占用 | 输出质量 | 推理速度 | 推荐场景 | | — | — | — | — | — | | int8 | 中 | 较高 | 快 | 显存有限,中等质量要求 | | int4 | 低 | 较低 | 快 | 显存极度有限,质量可妥协 | | W8A16 | 低-中 | 高 | 较快 | 显存紧张,要求兼顾质量 | | W8A8 | 低 | 中 | 快 | 显存紧张,速度优先 | | W4A16 | 极低 | 较低 | 快 | 极端压缩需求 |
4.具体量化方法:AWQ、GPTQ
AWQ 和 GPTQ 可以理解为 量化技术的具体实现方法,或者说是 量化策略 / 算法,它们的目标都是:
把大模型从高精度(FP32/FP16/BF16)压缩到低精度(INT8/INT4 等),同时尽量减少精度损失。
GPTQ (Gradient-based Post-Training Quantization)
- 定义:GPTQ = 基于梯度信息的后训练量化(Post-Training Quantization, PTQ)。
- 核心思想:量化不是随便 round,而是通过 误差最小化,特别是考虑权重之间的相互影响。
- 思路:模型训练完成(FP16/FP32)。对每一层(通常是线性层的权重矩阵 W):
- 计算权重量化的近似误差;
- 用二阶信息(Hessian 或 Fisher 信息矩阵)来衡量误差对输出的影响;
- 逐列/逐块量化权重,使得整体误差最小。
- 特点: 不需要重新训练,只在量化时用少量数据。常用于 INT4 / INT8 权重量化。适合大模型(LLaMA, GPT 系列)推理部署
AWQ (Activation-aware Weight Quantization)
定义: AWQ = 激活感知的权重量化。
核心思想:不是所有权重都 equally 重要,哪些权重对激活值影响大,就需要更高精度。
思路:
- 分析模型在推理时的 激活分布。
- 找到对激活影响最大的权重子集:
- 保留这些权重为高精度(如 FP16);
- 其余大部分权重量化到低比特(如 INT4)。
- 最终实现 混合精度量化。
** 特点 :**
- 比单纯的 INT4 精度更好,因为“关键权重”没丢信息。
- 常用配置:W4A16(权重 INT4,激活 FP16)。
- 对大模型(几十 B 参数)非常有效。
GPTQ vs AWQ 对比
| 特性 | GPTQ | AWQ | | — | — | — | | 量化目标 | 整体误差最小化 | 关注激活敏感权重 | | 精度恢复 | 较高(适合 INT4/INT8) | 更高(尤其在 INT4 时) | | 计算代价 | 需要二阶近似,量化过程较慢 | 相对简单,推理更快 | | 常用场景 | LLaMA、GPT 模型压缩 | LLaMA、OPT、BLOOM 等大模型推理 | | 输出格式 | INT4 / INT8 | INT4 / INT8(混合 FP16) | | 特征(个人理解) | qwen3-int8、qwen3-int4 | W8A8、W4A16 |