专栏算法工具链【J6】校准量化中HistogramObserver解析

【J6】校准量化中HistogramObserver解析

no_name2026-03-30
30
0

1. HistogramObserver的定义与原理

HistogramObserver是horizon_plugin_pytorch中一种基于直方图统计的量化Observer。与MinMaxObserver仅记录最小最大值、MSEObserver在线性搜索中计算MSE不同,HistogramObserver通过构建完整的数值分布直方图来捕获张量的统计特性,并支持多种量化参数计算方法。

MinMaxObserver与MSEObserver解析可参考:https://developer.horizon.auto/blog/13467

1.1 基本原理

HistogramObserver的工作流程分为两个阶段:

阶段一:直方图收集(forward过程)

直方图桶(Histogram Bin):将数值范围划分为若干个等宽的区间,每个区间就是一个"桶"(bin)。落在某个区间内的数值个数就是该桶的计数。
例如,数据范围 [-10, 10],设置 bin_num=4:
  • 桶0 [-10, -5) 包含 -8, -6 → 计数 = 2
  • 桶1 [-5, 0) 包含 -3 → 计数 = 1
  • 桶2 [0, 5) 包含 2, 1, 4 → 计数 = 3
  • 桶3 [5, 10] 包含 7, 9 → 计数 = 2

桶越多(bin_num越大),分布刻画越精细,内存占用越大。

阶段二:量化参数计算(calculate_qparams过程)

HistogramObserver支持多种计算方法,在calculate_qparams时根据method参数选择:

方法

描述

mse

最小化量化误差的积分估计(默认)

kl

最小化KL散度

js

最小化JS散度

cdf_kl

基于累积分布函数的KL散度

cdf_js

基于累积分布函数的JS散度

wasserstein

最小化Wasserstein距离

percentile

百分位截断

重点关注mse 和 percentile 即可。

1.2 核心实现

1.3 直方图扩展机制

当遇到超出当前边界的数值时,边界会按2的幂次扩展,同时通过分桶合并保持bin数量不变:

这种设计确保了:直方图可以处理任意范围的数值、内存占用保持恒定、多卡校准结果一致性。

1.4 特点分析

优点:

  • 保留完整分布信息,支持多种量化参数计算方法

  • 计算与收集分离,可在校准后灵活切换方法

  • 边界对齐机制确保多卡校准结果一致

缺点:

  • 内存占用较高(bin_num默认2048)

2. 与MinMaxObserver/MSEObserver的区别

2.1 核心差异对比

特性

MinMaxObserver

MSEObserver

HistogramObserver

统计方式

仅记录min/max

在线搜索最优scale

构建完整直方图

内存占用

极低

中等

较高

计算时机

forward时更新

forward时搜索

forward收集,qparams时计算

分布感知

部分(通过MSE)

是(完整分布)

多方法支持

否(仅MSE)

是(7种方法)

Per-channel支持

2.2 具体区别分析

与MinMaxObserver的区别:

  1. 信息保留:MinMaxObserver只保留极值信息,丢失了分布密度;HistogramObserver保留完整分布信息。
  2. 离群值处理:MinMaxObserver对离群值极其敏感;HistogramObserver通过分布感知方法(如percentile、kl)自动处理离群值。
  3. 校准稳定性:MinMaxObserver的滑动平均可能导致校准结果不稳定;HistogramObserver的直方图累加更加稳定。

与MSEObserver的区别:

  1. 计算时机:MSEObserver在每次forward时进行完整的搜索;HistogramObserver将收集和计算分离。
  2. 误差度量:MSEObserver仅支持L2误差;HistogramObserver支持MSE、KL、JS、Wasserstein等多种度量。
  3. 灵活性:HistogramObserver支持在计算量化参数时更换方法,无需重新校准。

3. reset_dtype与reset_scale用法

3.1 reset_dtype方法

reset_dtype方法定义在ObserverBase基类中,用于在运行时更改量化数据类型:

使用场景:

  1. 混合精度量化:不同层使用不同量化位宽时,动态调整Observer的dtype。
  2. 量化位宽探索:尝试INT8、INT4等不同位宽,无需重新校准。

3.2 reset_scale类方法

reset_scale是HistogramObserver的类方法,用于基于已收集的直方图重新计算量化参数:

参数说明:

参数

说明

model

待处理的模型

method

计算方法:mse/kl/js/cdf_kl/cdf_js/wasserstein/percentile

method_kwargs

方法参数(如steps、percentile)

prefix

仅处理指定前缀的模块

dtype

仅处理指定dtype的模块

使用场景:

  1. 方法对比实验:使用同一份校准数据,对比不同量化参数计算方法的效果。
  1. 混合策略量化:不同层使用不同的校准方法。

3.3 reset_scale vs 重新校准

对比项

reset_scale

重新校准

数据需求

无需校准数据

需要校准数据

时间成本

极低

适用场景

方法对比、参数调优

分布变化、数据变更

4. 使用场景建议

方法选择建议:

数据分布特征

推荐方法

正态分布

mse

长尾分布

percentile 或 kl

多峰分布

wasserstein

存在离群值

percentile(0.9999)

HistogramObserver在实际应用中,适用于高精度量化需求、复杂分布数据、需要灵活调整量化策略的场景。

建议:校准时收集直方图,通过reset_scale对比不同方法后确定最优策略。

算法工具链
技术深度解析社区征文杂谈征程6
评论0
0/1000