1. Observer的作用
在神经网络量化过程中,Observer(观察者)是连接浮点模型与量化模型的桥梁,负责在量化感知校准/训练(Calib/QAT)过程中收集张量的统计信息,并基于这些统计信息计算出最优的量化参数。
Observer的功能包括:
- 统计信息收集:在前向传播过程中,Observer会记录每个张量的数值分布特征,如最小值、最大值等。
- 量化参数计算:基于收集的统计信息,Observer计算出量化所需的两个关键参数:
- Scale(缩放因子):将浮点数值映射到整数空间的比例系数
- Zero Point(零点):浮点零值在整数空间中的对应位置
- 校准流程支撑:在校准阶段,Observer记录典型数据流经模型时的激活值分布,为量化做准备。
2. MinMaxObserver原理详解
2.1 基本原理
MinMaxObserver是最基础、最常用的量化Observer。其核心思想:使用张量的最小值和最大值来确定量化范围,从而计算量化参数。
从源码实现来看,MinMaxObserver的工作流程如下:
2.2 核心实现
2.3 特点分析
优点:
- 计算简单高效,仅需一次torch.aminmax操作
内存占用小,只存储min_val和max_val两个标量
适用于大多数常规分布的张量
缺点:
对离群值(outliers)非常敏感,一个极端值可能显著扩大量化范围(滑动平均更新一定程度可缓解)
无法感知数值的分布密度,可能浪费量化位宽
3. MSEObserver原理详解
3.1 基本原理
MSEObserver策略:通过最小化原始张量与量化后张量之间的均方误差(Mean Square Error)来寻找最优量化参数。
MSEObserver核心思想:在原始min-max范围内,线性搜索一个最优的截断阈值,使得量化误差最小。
3.2 算法流程
3.3 核心实现
3.4 内存优化
MSEObserver在GPU上运行时会进行显存估算和分块计算,避免因同时存储大量中间结果导致OOM:
3.5 特点分析
优点:
能够有效处理离群值,自动找到最优截断点
量化精度通常高于MinMaxObserver
适合长尾分布或存在少量极端值的张量
缺点:
计算开销大,需要进行95次量化模拟和误差计算,校准时间会增加
内存占用较高,需要存储中间量化结果
4. 两者对比分析
特性 | MinMaxObserver | MSEObserver |
|---|---|---|
计算复杂度 | O(n) | O(n × num_iter) ≈ O(95n) |
内存占用 | 极低 | 较高 |
对离群值敏感度 | 高 | 低 |
量化精度 | 一般 | 较高 |
适用场景 | 常规分布、快速校准 | 长尾分布、高精度需求 |
5. 使用场景建议
MinMaxObserver和MSEObserver在实际应用中,应根据模型特点、精度需求和计算资源进行权衡选择。
建议:校准使用MSEObserver,QAT使用MinMaxObserver。

