01 · 先确定:究竟要把哪一份数据变小
一次 Linear 可以理解为 Y=XW:X 是当前输入的激活,也就是前一计算产生的中间向量;W 是训练得到的权重。模型有很多这样的矩阵乘法。权重反复使用,激活随输入变化,两者都占内存并产生搬运与计算成本。
量化把数据映射到较少位数的表示,同时保存解释这些数值所需的缩放等信息。它通常会引入近似误差,目标是在质量可接受的前提下减少占用、读取量,或使用硬件支持的低精度运算。
| 对象 | 什么时候产生 | 量化主要面对什么 |
|---|---|---|
| 权重 W | 模型训练后保存,推理时重复使用 | 模型驻留容量、权重读取,以及 Linear 内核。 |
| 激活 A | 每次前向产生,内容随请求变化 | 运行时量化、矩阵输入精度与中间工作区。 |
| 历史 KV | 每层处理输入位置时产生并缓存 | 长上下文缓存容量与 Attention 读取;详见 KV 量化篇。 |
02 · 用尺子理解 scale 和 zero point
先看最容易手算的均匀整数方案。设 scale s=0.2,整数码 q=3 表示近似数值0.6,q=−2表示−0.4。s 就像尺子一格代表的真实长度。量化是寻找最近格点,反量化是把格点转换回近似数值。
q = clamp(round(x / s) + z, qmin, qmax)
x_hat = (q - z) * s
s:scale,必须为正;z:zero point,整数零点
round:按约定舍入;clamp:限制到可编码范围
x_hat 是还原近似值,不一定等于原 x对称量化通常让 z=0,正负数围绕0共享量程。非对称量化可以移动零点,更好地利用偏向一侧的数据范围。例如若有效范围为 [−1,2],用8位无符号码0到255、s=3/255、z=85,可以让整数85对应真实0。
这是整数方案的公式。FP8、FP4 是浮点格式,格点与指数有关,并非同一套均匀整数码;它们也可能带 tensor 或 block scale。INT4、NVFP4、MXFP4 虽同为4位,不能用同一张格点表描述。
03 · 量化一组数:误差来自哪里
以下用一个4位对称教学方案,只使用−7到7的码,保留−8不用。取 s=0.2、z=0。实际 INT4 内核可能使用完整−8到7或其他编码,不能直接套这个教学范围。
| 原始 x | x/s | 整数码 q | 还原 x_hat | 绝对误差 |
|---|---|---|---|---|
| −1.20 | −6 | −6 | −1.20 | 0 |
| −0.46 | −2.3 | −2 | −0.40 | 0.06 |
| 0 | 0 | 0 | 0 | 0 |
| 0.74 | 3.7 | 4 | 0.80 | 0.06 |
| 1.20 | 6 | 6 | 1.20 | 0 |
范围内,误差主要来自舍入。如果改用 s=0.1,最大正值只能还原为7×0.1=0.7;原数1.2被截断,误差变成0.5。若增大 s,范围更宽,却让格点更稀。选择 scale 是量程与分辨率的取舍。
换一把尺子:量程和舍入误差怎样变
固定原值 [−1.20,−0.46,0,0.74,1.20];4位对称教学范围 −7到7,z=0。本例不涉及恰好半格的舍入,不模拟任何实际设备内核。在均匀格点内、采用就近舍入且没有截断时,单元素误差不超过半格 s/2;这个简单界不代表模型输出误差也小。很多元素相乘、累加并经过后续层后,需要重新检查结果。
04 · 为什么同样4位,分组方式会改变质量
假设一组数为 [0.2,−0.3,0.4,8.0],同用一个 s=8/7。前三个小值全都可能舍入到0,大值把量程拉宽了。这个显著偏大的元素叫离群值。若前三个元素独立成组,采用 s=0.4/7,它们就能保留更多细节;大值单独用另一个尺度。
| 粒度 | 怎样共享 scale | 取舍 |
|---|---|---|
| per-tensor | 整张张量共用 | 参数少,但更受离群值和各通道范围差异影响。 |
| per-channel / per-row | 按明确指定的通道或行 | 更细;必须说明轴和张量布局,不能只写“通道量化”。 |
| per-group / per-block | 固定数量的元素成组 | 兼顾误差与元数据;组越小,scale等信息通常越多。 |
| per-token 激活 | 当前 token 向量用自己的尺度 | 能随输入变化;计算尺度也有运行时成本。 |
“静态激活量化”用准备阶段估计的尺度;“动态激活量化”在运行时根据当前激活计算尺度。动态可能更适应不同输入,但并不意味着没有误差,也不是免费操作。
05 · W4A16、W8A8:存储位数不等于全程计算位数
| 简称 | 常见含义 | 典型执行路径与注意点 |
|---|---|---|
| W4A16 | 权重4位,激活16位 | 读入打包权重和 scale,按内核需要解包/反量化,结合16位激活计算;不代表整个模型都做原生 INT4 乘法。 |
| W8A8 | 权重和激活各8位 | 量化激活后执行支持的低精度矩阵乘法,再按缩放与输出约定处理。8位仍需注明整数还是浮点。 |
| FP8 / FP4 路径 | 选定低位浮点输入与缩放配方 | 硬件、矩阵形状、块尺度及累加精度均有条件,不能只改 dtype。 |
对于对称整数点积,若 x≈s_x q_x、w≈s_w q_w,可算 sum(q_x q_w),再乘 s_x s_w 还原尺度。使用更宽的累加器是常见做法;累加、偏置和输出的实际精度仍由内核决定。若带非零 zero point,乘法要使用减去零点后的整数,或采用等价修正项。
x = [0.32, -0.82, 1.12, 0.62]
w = [1.23, -0.44, 0.78, 0.15]
原始点积 = 1.721
若 s_x=s_w=0.2、z=0:
q_x = [2,-4,6,3],q_w = [6,-2,4,1]
整数累加 = 2×6 + (-4)×(-2) + 6×4 + 3×1 = 47
还原点积 = 47×0.2×0.2 = 1.88
误差 = 1.88 - 1.721 = 0.159低比特权重若每次先完整展开到 HBM,再做普通矩阵乘法,可能重新付出大规模中间读写。高效 weight-only 内核通常把解包、缩放与后续计算衔接起来,减少额外工作区和写回;实现效果取决于具体后端。
06 · PTQ 与 QAT:什么时候适配量化误差
| 路线 | 准备流程 | 是否更新权重 |
|---|---|---|
| PTQ:训练后量化 | 已有模型 → 选择格式/层 → 必要时用校准数据估计尺度或优化转换 → 导出 | 通常不执行完整的梯度训练;不是每种 PTQ 都需要校准数据。 |
| QAT:量化感知训练 | 插入假量化 → 训练/微调适配误差 → 转成部署表示 → 导出 | 通常会训练可训练参数,让模型经历量化误差。 |
假量化的意思是:前向先舍入到格点,再还原到浮点,但 Tensor 仍可保持浮点存储。模型在训练时见到了部署近似带来的扰动,却不意味着训练内存已经按4位保存,或训练计算已全部换为整数。
展开:舍入不能正常求导,QAT 的反向怎样处理
直接对 round 求导,几乎处处是0,不能提供有用的普通梯度。因此 QAT 常用 straight-through estimator(STE,直通估计)或其他近似梯度规则:前向模拟量化,反向在规定范围内用近似导数传播。具体规则与尺度是否可学习,要按训练配方确认。
PTQ 的校准集应代表实际输入,包括领域与长度分布,并与最终评估集区分。QAT 增加适配训练,并不等于训练加速;真正的 FP8 等低精度训练还涉及前向、反向、梯度与状态管理,见混合精度训练篇。
07 · GPTQ、AWQ、SmoothQuant 各改变什么
| 方法 | 针对的主要问题 | 怎样改进转换 |
|---|---|---|
| GPTQ | 直接逐元素舍入导致层输出偏差 | 利用校准输入和近似二阶信息,逐步量化并补偿剩余权重,减小层重构误差。 |
| AWQ | 不同权重通道对输出的重要性不同 | 利用激活信息选择通道缩放,保护对输出影响大的权重;常见路径仍是 weight-only。 |
| SmoothQuant | 激活离群值让8位输入量化困难 | 用等价通道缩放,把部分数值范围压力从激活转移到权重,再做量化。 |
它们是选择或改善量化方案的方法,不是三个完全独立于内核的速度按钮。导出的格式、group size、zero point、层覆盖和运行时内核仍要匹配。AWQ 名字中的 activation-aware 表示选择权重量化方案时参考激活,不代表推理一定把激活也变成4位。
依据:GPTQ · 原始论文 ↗ · AWQ · 原始论文 ↗ · SmoothQuant · 原始论文 ↗
一个通道缩放的数学小例子:
x=[10,1],w=[0.1,2],x·w=3
令 D=[10,1]:x_new=x/D=[1,1],w_new=D*w=[1,2]
x_new·w_new=3
等价变换先保留原结果;之后的量化仍可能产生误差。08 · 一个7B模型的容量,怎样估算
只看70亿个权重元素:BF16按2字节约14 GB;8位按1字节约7 GB;4位理想打包后约3.5 GB。这里是十进制 GB。真正格式还要加 scale、zero point、未量化层、对齐与运行时工作区。
例如假定所有权重按128个元素分组,每组仅一个 FP16 scale,4位码占3.5 GB,scale占 7×10⁹/128×2=0.109375 GB,合计3.609375 GB,相对14 GB约压缩3.88倍。若另存 zero point 或不同尺度格式,需要继续计入;该简化假设不对应任何固定模型发布包。
把权重变小后,留下的显存可以支持更多缓存或请求,但总服务内存没有自动下降到四分之一。模型文件大小、设备常驻权重、峰值显存和单步 HBM 流量是四个不同指标。
09 · 从数字教学走到真正运行
baseline = load_reference_model()
recipe = choose(weight_dtype, activation_dtype, granularity, layer_exclusions)
quantized = ptq_convert(baseline, recipe, representative_calibration_data)
# 若需要 QAT,则先做假量化适配训练,再转换为部署表示
export(quantized, scales, zero_points, packing_layout, recipe_identity)
engine = load_with_compatible_quantized_kernels(exported_model)
compare_quality_and_service_metrics(engine, baseline)下方标准库 CPU 例子逐项计算舍入与截断,比较原始点积、只量化权重及两侧量化的输出,还实际把两个4位整数码装进一个字节再解包。它没有实现 GPU/NPU 内核、GPTQ、AWQ 或 QAT,不用于证明性能提升。
真正接入可看 torchao 的配置接口、NVIDIA Model Optimizer 与 TensorRT-LLM 的精度文档。先检查目标硬件与矩阵形状支持,再选择转换配方;CPU 教学公式不能替代打包布局、融合内核和版本约束。
依据:torchao · Quantized Inference(stable) ↗ · NVIDIA Model Optimizer ↗ · TensorRT-LLM · Numerical Precision ↗
10 · 怎样验证收益,并比较 NVIDIA 与昇腾
| 维度 | 需要保持或记录什么 |
|---|---|
| 数学/质量 | 相同原模型与输入;记录 logits、任务指标、长序列与关键失败案例,而不只比较一条生成文字。 |
| 计算 | 分开测 Prefill/Decode,查看实际内核、激活量化与反量化开销;必要时记录矩阵形状。 |
| 内存 | 设备驻留权重、KV、元数据与峰值工作区,注明并行配置。 |
| 服务 | 相同并发、输入输出长度、请求到达率;报告吞吐、TTFT、ITL 与尾延迟。 |
小批次 Decode 的权重读取压力较大时,weight-only 可能有利;Prefill 或大批次更可能从合适的低精度矩阵计算受益。这是判断方向,实际瓶颈也可能是 Attention、通信或调度,不能推导固定加速倍数。
NVIDIA 可检查 Model Optimizer 的转换与 TensorRT-LLM 的格式/内核支持。昇腾可从 vLLM Ascend 的量化指南查看 ModelSlim、LLM-Compressor 及对应导出/加载路径,例如其中的 W8A8 示例。比较时把模型、格式、尺度、量化层与实际执行路径对齐;某个 checkpoint 能加载,并不证明在所有设备上都以原始低位格式常驻和计算。
依据:vLLM Ascend · Quantization Guide(main) ↗
QLoRA 等方法会冻结低比特基座并训练适配器,优化训练容量;这与全参数低比特训练不同。QAT 又是为了适配部署误差而训练,三者应按训练对象和目标区分。
11 · 读完应能解释这四件事
- scale 缩小,为什么可能让最大值更不准确?
- W4A16 为什么不意味着整条计算链都是 INT4?
- AWQ 参考激活,为什么仍可能只量化权重?
- QAT 为什么可能增加训练工作,而不是让训练更快?
流程位置与关联方法
这个方法可能出现在多个位置;计算线包含模型计算与算子实现,执行线包含运行时、内存和通信。
资料与核查范围
原理依据以原始论文和官方文档为主;算例与时间线是教学推导。文档核查日期:2026-10-08。引用 main / latest 文档时,实际接口以安装版本为准。
- Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference · 原始论文 ↗
- torchao · Quantized Inference(stable) ↗
- torchao · Quantization-Aware Training(stable) ↗
- GPTQ · 原始论文 ↗
- AWQ · 原始论文 ↗
- SmoothQuant · 原始论文 ↗
- NVIDIA Model Optimizer ↗
- TensorRT-LLM · Numerical Precision ↗
- vLLM Ascend · Quantization Guide(main) ↗
- Hugging Face PEFT · Quantization ↗
代码为接入片段或教学伪代码;本页没有声称完成 NVIDIA / 昇腾硬件实测。