想象你要去一次长途旅行。你的大行李箱里塞满了 32 位浮点数——这就是 AI 模型的参数。可手机、智能门铃这些边缘设备,头顶的行李舱只有一点点大,箱子根本塞不进去。量化就是改打包方案:把每个 32 位参数压缩成 8 位或 4 位整数,就像把大瓶洗发水倒进旅行装小瓶。8 位相当于随身登机箱,精度接近原版;4 位相当于斜挎包,更轻便,但要更精细地规划空间。这背后是一套把浮点映射到整数的数学方法:缩放系数是浓缩倍数,零点是刻度对齐的基准线。沿着「行李打包」的思路,本文讲清量化的数学原理、精度权衡、训练后量化与量化感知训练的区别,以及边缘端部署的工具选型。

岗位关联

对 AI 从业者来说,掌握量化就像背包客掌握收纳术——能在边缘设备上释放推理算力、降低带宽与功耗,是嵌入式 AI 产品落地的关键技能。

目录
  1. 可视化演示
  2. 量化本质:把大行李箱换成随身包
  3. 数学映射:打包的压缩比与对齐刻度
  4. 精度权衡:少带物品的代价
  5. 量化方式:先规划还是后整理
  6. 位宽选型:带几件还是只带必须
  7. 部署工具:打包员的工具箱
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

量化本质:把大行李箱换成随身包

预训练模型里的参数个个都是 32 位浮点数,像行李舱里的大件物品,每件占 32 个存储格。手机、智能门铃这类边缘设备,内存和算力像头顶行李舱一样有限,硬塞大箱子只会超重。于是我们换一种打包思路:把每个参数从 32 位浮点压缩到 8 位或 4 位整数。8 位像旅行装小瓶,4 位像更小的样品瓶,存储空间立刻缩小好几倍。

这种压缩能省多少空间,可以用一条简单的公式描述:

但量化不只为省存储。边缘芯片里往往有 INT8 整数加速单元,整数乘加的能效远高于浮点乘加。真正让推理变快的,是量化后能用整数算子跑模型:功耗降低、延迟缩短,这才是在设备端「更省」的根源。大行李箱换成了随身包,不仅装得下了,走路也更轻快。

R=32b\mathrm{R} = \frac{32}{b}
R 是存储压缩比,b 是量化后的位宽。位宽越小,模型体积越小。
  1. 分子 32模型参数原本以 32 位浮点数保存,这是未压缩时的存储成本。
    3232
  2. 分母 b量化后的目标位宽,常见为 8 或 4。
    b∈{8,4}b \in \{8, 4\}
  3. 整体求值b=8 时压缩 4 倍,b=4 时压缩 8 倍。
    R=328=4,324=8\mathrm{R} = \frac{32}{8} = 4, \qquad \frac{32}{4} = 8

数学映射:打包的压缩比与对齐刻度

压缩不能瞎挤。行李箱内部会划分成很多格子,你要把物品沿着格子线压到对应位置。量化也一样:要把连续浮点权重排到离散整数网格上,需要两个关键参数——缩放系数和零点。

一组浮点权重有它的取值范围,目标整数也有自己的区间。缩放系数 s 表示一个整数刻度对应多大的浮点范围;零点 z 表示浮点最小值对齐到哪个整数刻度。数学上,量化和反量化是一对互逆的映射:

这套机制下还有对称与非对称之分。若权重围绕 0 基本对称,就用对称量化,z 固定为 0,省掉零点这一步的加减运算;若数据明显偏向一侧(比如 ReLU 输出的激活值都是非负的),就选非对称量化,z 不为 0,把整个取值范围都利用起来。就像有些行李箱隔层左右对称,有些上大下小,总得根据行李形状选盒子,才能让每一格空间都不浪费。

\displaystyle q = \operatorname{round}\left(\frac{r}{s}\right) + z, \qquads = \frac{r_{\max} - r_{\min}}{q_{\max} - q_{\min}}, \qquadz = q_{\min} - \operatorname{round}\left(\frac{r_{\min}}{s}\right)
r^=(q−z)×s\displaystyle \hat{r} = (q - z) \times s
第一行是量化编码,第二行是反量化还原。s 是格子宽度,z 是让浮点最小值恰好落在整数刻度起点的偏移。
  1. 求缩放系数 s把浮点范围 r_max − r_min 均匀切分成 q_max − q_min 格,每格宽度就是 s。
    s=rmax⁡−rmin⁡qmax⁡−qmin⁡s = \frac{r_{\max} - r_{\min}}{q_{\max} - q_{\min}}
  2. 求零点 z用浮点最小值 r_min 反推它应落在整数刻度的哪个位置,得到偏移量。
    z=qmin⁡−round⁡(rmin⁡s)z = q_{\min} - \operatorname{round}\left(\frac{r_{\min}}{s}\right)
  3. 量化映射浮点值除以格宽、四舍五入后平移到整数刻度,得到整数表示 q。
    q=round⁡(rs)+zq = \operatorname{round}\left(\frac{r}{s}\right) + z
  4. 反量化还原整数先减零点再乘格宽,近似恢复浮点值,用于推理中还原权重或激活。
    r^=(q−z)×s\hat{r} = (q - z) \times s

精度权衡:少带物品的代价

把大瓶洗发水压进小瓶,总有洒出来的损失。量化同样会引入误差:浮点值本来是连续的小数,变成整数刻度后,原值往往不能精确落在格线上。

量化误差定义为原浮点值 r 与反量化值 r̂ 的差。因为四舍五入最多错半格,所以误差有一个明确上界:

误差大小取决于数值分布和 s 的选取。如果权重集中分布在 0 附近,只有少数大值,直接用最大最小值求 s 会让大量刻度浪费在小值区域。这时需要校准数据集:抽样少量真实输入,在模型上跑一跑,记录激活和权重的真实范围,再据此选择合适的 s 和 z。这也解释了为什么校准数据要贴近部署场景——就像打包前先拿「有代表性的物品试装」来确定压缩袋尺寸,试装错了,行李还是会鼓出来。

e=r−r^,∣e∣≤s2\displaystyle e = r - \hat{r}, \qquad \left| e \right| \le \frac{s}{2}
误差不会超过格子宽度的一半。格子越窄,量化越接近原始值。
  1. 量化误差 e原浮点值 r 与反量化值 r̂ 的差值,衡量压缩损失。
    e=r−r^e = r - \hat{r}
  2. 半格上界四舍五入的误差最多半格,绝对误差被限制在 s/2 以内。
    ∣e∣≤s2\left| e \right| \le \frac{s}{2}

量化方式:先规划还是后整理

打包有两种策略:旅行结束后硬塞压缩袋,或者出发前就练习带小瓶装。对应到量化,就是训练后量化(PTQ)和量化感知训练(QAT)。

PTQ 成本低、流程简单:模型训练完成后,收集少量校准数据,算出 s 和 z,直接把浮点权重转成整数。对 8 位量化来说,PTQ 通常就能保住绝大多数精度。QAT 则更精细:训练过程中,前向传播插入伪量化节点,把参数临时取整再反量化,让模型亲身感受量化带来的误差;反向传播仍按常规梯度更新,让权重学会在压缩变形下保持关键信息。伪量化可以写成一个公式:

PTQ 相当于赛后收拾,QAT 则是边训练边练习压缩。还有一个更细的维度:动态量化在每次推理时实时计算激活范围,静态量化则提前用校准数据算好激活的 s 和 z,推理只需整数运算。选择哪条路线,取决于你的「行李」要压缩到什么程度。

r~=s×(clip(round⁡(rs)+z, qmin⁡, qmax⁡)−z)\displaystyle \tilde{r} = s \times \left( \mathrm{clip}\left( \operatorname{round}\left(\frac{r}{s}\right) + z, \ q_{\min}, \ q_{\max} \right) - z \right)
前向传播时假装已经量化,实际仍用浮点计算梯度。clip 保证数值不越界。
  1. 映射到整数float 除以 s、四舍五入并平移零点,得到整数刻度。
    round⁡(rs)+z\operatorname{round}\left(\frac{r}{s}\right) + z
  2. 裁剪保护clip 把越界整数拉回合法区间,模拟硬件整数溢出保护。
    clip(⋅, qmin⁡, qmax⁡)\mathrm{clip}\left(\cdot, \ q_{\min}, \ q_{\max}\right)
  3. 反量化参与计算减 z 再乘 s,回到浮点空间,让前向和反向传播无缝衔接。
    s×(⋅−z)s \times \left(\cdot - z\right)

位宽选型:带几件还是只带必须

8 位登机箱能带大部分日常物品,4 位斜挎包只能带绝对必需。选哪个,取决于你出差几天、路上有没有补给——放在模型场景里,就是设备的存储、带宽和精度阈值。

8 位量化的优势是稳健:主流硬件和框架支持最全,PTQ 效果好,误差上界低,开发成本小。4 位量化的优势是体积再减一半、带宽再降一半,适合内存极小、功耗苛刻的场景;代价是误差显著增大,通常需要 QAT 或混合精度才能保住精度。这个权衡可以定量看:

实际选型的口诀是:能上 8 位就不冒险,设备逼到极限才用 4 位。就算选了 4 位,也不要一把梭——对注意力层、BN 层等敏感部分保留 8 位,其他层用 4 位,往往能兼顾体积与精度。

∣e∣max⁡(b)=rmax⁡−rmin⁡2×(2b−1)\displaystyle \left| e \right|_{\max}(b) = \frac{r_{\max} - r_{\min}}{2 \times (2^b - 1)}
位宽从 8 降到 4 时,误差上界大约扩大 17 倍。省下的一半空间,是用精度换来的。
  1. 动态范围r_max − r_min 是需要覆盖的浮点取值范围。
    rmax⁡−rmin⁡r_{\max} - r_{\min}
  2. 刻度数2^b − 1 是 b 位整数能表达的量化间隔数,8 位为 255,4 位为 15。
    2b−12^b - 1
  3. 误差上界间隔越细误差越小,b 变小则误差加剧,8 位到 4 位约扩大 17 倍。
    rmax⁡−rmin⁡2×(2b−1)\frac{r_{\max} - r_{\min}}{2 \times (2^b - 1)}

部署工具:打包员的工具箱

专业打包员不会徒手塞行李,他们会用行李箱、压缩袋和真空泵。AI 工程师也有自己的工具箱:推理框架负责完成量化转换和算子优化。

主流工具有 TensorFlow Lite、ONNX Runtime、PyTorch 的量化 API、TensorRT 等。它们的工作流高度一致:读入 FP32 模型,配合校准数据,输出量化后的整数模型。工具链里的关键环节是算子优化:把 FP32 卷积、全连接替换成 INT8 整数内核,再做算子融合(比如把 Conv、BN、ReLU 合成一层),减少访存和中间张量开销。

部署时有个陷阱:不是所有硬件都支持 4 位或 8 位算子。若目标芯片缺少对应内核,框架会回退到 FP32,反而更慢。所以最佳实践是:先跑通 8 位 PTQ,验证精度与性能;不够再看 QAT;实在要 4 位,就逐层检查算子支持度。选工具不是看名气,而是看「箱子」能否通过目标硬件的安检——位宽、算子、校准三条线都要对得上。

AI 应用场景

智能手机语音唤醒词检测

阶段:推理部署(端侧优化)

解决的问题:云端语音识别有延迟和隐私顾虑,且手机不能一直联网。8 位量化让唤醒词模型常驻本地内存,用极低功耗持续监听麦克风。

具体案例:手机上的「Hey Siri / 小爱同学」就是典型唤醒词场景。模型先以 FP32 训练,再取几秒钟真实录音做 PTQ 校准,转为 INT8 后模型体积通常小于 1MB,待机功耗控制在毫瓦级。唤醒只触发本地推理,不传音频上云。

电池供电 IoT 摄像头中的 4 位图像分类

阶段:模型压缩(低比特量化)

解决的问题:智能门铃内存只有几百 KB,8 位模型可能还是偏大;4 位量化把模型再减半,很适合电池供电设备长期工作。

具体案例:用 MobileNetV2 做人/猫/狗识别,4 位 QAT 后模型从约 14MB 压缩到约 1.75MB,可以塞入门铃芯片。训练时模拟量化误差,部署后误触发率仅轻微上升,续航却翻了一倍。

工业振动传感器预测性维护

阶段:边缘推理(MCU 部署)

解决的问题:工厂不希望把原始振动数据全部上传云端,数据量大、带宽贵,还涉及现场数据隐私。最好在单片机本地判断设备是否异常。

具体案例:在 STM32 系列 MCU 上部署 8 位量化的一维卷积网络。用约 2000 条振动样本做 PTQ 校准,模型压缩到 64KB SRAM 内可运行,异常检测延迟低于 5ms,正常时只上传告警信息。

Python 演示

python52 行
"""8位与4位量化演示: 在边缘端部署前的精度与体积评估"""  import math  def quantize_symmetric(values, bits):    # 对称量化: 映射到 [-(2^(b-1)-1), 2^(b-1)-1]    max_abs = max(abs(v) for v in values)    levels = 2 ** (bits - 1) - 1    scale = max_abs / levels    q = []    for v in values:        x = int(round(v / scale))        x = max(-levels, min(levels, x))        q.append(x)    deq = [x * scale for x in q]    return q, deq, scale  def rmse(original, approximated):    n = len(original)    return math.sqrt(sum((a - b) ** 2 for a, b in zip(original, approximated)) / n)  def main():    # 模拟一个训练好的小模型权重: 正弦加余弦的混合分布    weights = [math.sin(i * 0.31) * 0.9 + math.cos(i * 0.17) * 0.1               for i in range(128)]     print("模型原始参数个数:", len(weights))    for bits in (32, 8, 4):        if bits == 32:            _, deq, scale = None, weights, 1.0        else:            _, deq, scale = quantize_symmetric(weights, bits)        mem = len(weights) * bits // 8        err = rmse(weights, deq)        print("{}位量化: 存储={}B, scale={:.5f}, RMSE={:.6f}".format(            bits, mem, scale, err))     q8, deq8, _ = quantize_symmetric(weights, 8)    q4, deq4, _ = quantize_symmetric(weights, 4)    print("原始前5个权重:", [round(v, 4) for v in weights[:5]])    print("8位量化前5个整数:", q8[:5])    print("4位量化前5个整数:", q4[:5])  if __name__ == "__main__":    main()
目的:用纯 Python 模拟对称量化,对比同一组权重在 32 位、8 位、4 位下的存储体积和精度损失,帮助理解量化部署前的评估流程。
  1. max_abs = max(abs(v) for v in values)找出所有权重的最大绝对值,作为对称量化范围的基准。
  2. scale = max_abs / levels求缩放系数:把最大范围均匀切分成整数刻度,每个刻度代表真实浮点范围。
  3. x = int(round(v / scale))浮点值除以缩放系数后四舍五入,映射到整数刻度。
  4. x = max(-levels, min(levels, x))裁剪越界整数,模拟硬件中对超出量化范围数值的保护。
  5. deq = [x * scale for x in q]反量化回浮点,模拟推理时系统真正读到的权重值。
  6. err = rmse(weights, deq)用均方根误差衡量量化损失,误差越小表示精度保留得越好。
  7. for bits in (32, 8, 4)在同一组权重上对比三种位宽,直观看到存储和误差的变化规律。

常见误区

误区把 32 位浮点小数「四舍五入」成整数就是量化了,其他步骤都不重要。

正解量化是「全局范围校准」下的高精度离散化。光做 round 而不考虑 scale 和 zero-point,数值会严重失真。就像打包行李不能随便把衣服捏成一团,必须根据箱子尺寸划分隔层,物品才能规整放进包。实际流程中还有校准、对称选择、裁剪等步骤。

为何常见:量化公式里确实有 round,容易让人误以为取整就是全部,忽略了更关键的缩放与零点设计。

误区PTQ 精度损失太大,8 位也要上 QAT 才安心。

正解8 位 PTQ 在现代主流模型上通常能保持 99% 以上精度,代价只是一次校准转换。QAT 训练成本高、周期长,一般只在 4 位或精度敏感层上才必要。合理流程是先 PTQ 评估,不达标再升级到 QAT。

为何常见:看到 4 位量化精度崩塌的案例后,把对低比特的担忧错误地推广到了 8 位 PTQ。

误区位宽越大精度越高,所以边缘端一律选 8 位最稳妥。

正解8 位精度高,但存储和带宽开销更大;4 位能塞进更小内存、更省电。如果业务精度阈值允许,4 位可能更优。选型要看设备资源与精度底线,而不是一味追求大位宽。

为何常见:把精度当作唯一指标,忽略了边缘端更紧要的内存和功耗约束。

误区量化就是压缩文件,模型小了,但推理速度不会有本质变化。

正解真正的加速来自硬件上的 INT8/INT4 整数算子,以及算子融合带来的访存减少。如果没有对应内核,FP32 转 INT 反而会引入额外开销。部署时要确认框架把核心算子替换成了整数量化内核。

为何常见:混淆了「存储节省」和「计算加速」两个相对独立的收益,以为体积缩小等同于速度提升。

误区为了算准 scale 和 zero-point,直接把整个训练集拿去校准。

正解校准只需有代表性的子集,几百到几千张就足够。训练集里重复样本太多反而会拉偏范围估计,还会拖慢转换流程。校准集应贴近真实推理时遇到的数据分布。

为何常见:「数据越多越好」的直觉在资源受限的边缘场景并不成立,校准本质是估计分布,不是重新训练。

面试题

Q1. 将模型从 32 位浮点压缩到 8 位整数后,模型存储体积大约变为原来的多少?

单选题 · easy

  • A.压缩为原来的八分之一
  • B.压缩为原来的四分之一← 正确答案
  • C.扩大为原来的 4 倍
  • D.扩大为原来的 8 倍

答案:B。32 位变 8 位,存储变为 8/32 = 1/4,即四分之一。类比:大行李箱换成随身包,体积缩到原来的四分之一。选 B。

Q2. 量化公式 q = round(r/s) + z 中,参数 s 是什么含义?

单选题 · easy

  • A.缩放系数,决定每格真实范围← 正确答案
  • B.零点偏移,确定整数起始位置
  • C.权重张量中的最大最小值
  • D.浮点数保留的有效位数

答案:A。s 是缩放系数,表示一个整数刻度对应的浮点范围大小。类比:量杯上一格代表几毫升,s 就是「每格容量」;z 才是零点偏移。选 A。

Q3. 对称量化与非对称量化相比,主要区别是什么?

单选题 · mid

  • A.零点是否固定为 0← 正确答案
  • B.缩放系数是否可训练
  • C.是否提前去除异常值
  • D.是否逐通道独立量化

答案:A。对称量化让零点固定为 0,省去零点偏移运算;非对称量化允许 z 不为 0,更适合分布偏置的数据。两者本质区别在零点设定,选 A。

Q4. 关于训练后量化(PTQ)的说法,正确的有哪些?

多选题 · mid

  • A.不需要重新训练原始模型← 正确答案
  • B.通常需要一组校准数据← 正确答案
  • C.仅支持对称量化策略
  • D.精度必然超越量化感知训练

答案:AB。PTQ 在训练完成后做转换,不需要重训,A 对;标定 s 和 z 需要校准数据,B 对;PTQ 同样支持非对称量化,C 错;QAT 在低比特下精度往往更好,D 错。答案 [0,1]。

Q5. 与 8 位量化相比,4 位量化最主要的代价是什么?

单选题 · mid

  • A.推理速度明显降低
  • B.量化误差显著增大← 正确答案
  • C.模型体积反而变大
  • D.训练时间成倍拉长

答案:B。位宽从 8 降到 4,量化间隔从 255 个变成 15 个,误差上界约扩大 17 倍,这是最核心的代价。体积和训练时间并不是主要问题。选 B。

Q6. 当模型权重分布存在明显异常值时,下列哪种方法最有助于减少量化误差?

单选题 · hard

  • A.用最大最小范围求缩放
  • B.按百分位截断极值再求缩放← 正确答案
  • C.将异常值直接替换成零
  • D.把批量大小提升到 256

答案:B。min-max 会把格子拉得很宽,导致大部分权重挤在少数刻度里;按百分位截断异常值后再求 scale,能更贴合主体分布。类比:先把撑爆行李箱的巨型按摩枕压到可接受尺寸,再按实际空间分格。选 B。

Q7. 关于量化感知训练(QAT)的说法,正确的有哪些?

多选题 · hard

  • A.前向传播模拟量化误差← 正确答案
  • B.反向传播使用直通估计器← 正确答案
  • C.训练完成后无需再量化
  • D.特别适合 4 位低精度模型← 正确答案

答案:ABD。QAT 前向用伪量化节点模拟误差,A 对;反向传播常用直通估计器近似梯度,B 对;训练完成后仍需把权重转成整数格式,C 错;4 位场景误差大,QAT 让模型提前适应,D 对。答案 [0,1,3]。

Q8. 量化推理的核心价值,下列描述最准确的是什么?

单选题 · easy

  • A.让模型训练精度变得更高
  • B.用整数算子加速边缘端推理← 正确答案
  • C.完全去除数据标注的成本
  • D.替换成更大的预训练模型

答案:B。量化推理的核心是把 FP32 算子替换成整数算子,在边缘端获得更高能效和更低时延。它不会提升精度,也不会省标注。选 B。

Q9. 为边缘端选定一个量化方案时,需要考虑哪些因素?

多选题 · mid

  • A.硬件是否支持 INT8 算子← 正确答案
  • B.敏感层的精度损失情况← 正确答案
  • C.校准数据覆盖真实分布← 正确答案
  • D.训练服务器显存大小

答案:ABC。硬件算子支持决定能否真正加速,敏感层精度决定是否要混合精度,校准分布决定量化质量。训练服务器的显存与部署无关,选 [0,1,2]。

Q10. 若原始权重范围为 [-10, 10],采用 8 位非对称量化且不截断,最大绝对量化误差约为多少?

单选题 · extreme

  • A.0.039← 正确答案
  • B.0.078
  • C.0.156
  • D.0.020

答案:A。范围为 20,8 位非对称量化的间隔数为 255,scale ≈ 20/255 ≈ 0.0784,最大误差为半格 ≈ 0.0392,选 A。类比:包装袋每一格约 0.078 毫升,倒入误差最多半格。