文件名 大模型量化技术.md

大模型量化技术

本文目录

正文

大部分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):
    1. 计算权重量化的近似误差;
    2. 用二阶信息(Hessian 或 Fisher 信息矩阵)来衡量误差对输出的影响;
    3. 逐列/逐块量化权重,使得整体误差最小。
  • 特点: 不需要重新训练,只在量化时用少量数据。常用于 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 |