onnx之量化

量化的核心本质——从一个连续区间到离散整数集的保序映射

📐 数学形式化表达

可以精确地用下面的公式表达:

量化值 = clamp(round((浮点值 - range_min) / scale) + zero_point, q_min, q_max)

其中:

  • scale = (range_max - range_min) / (q_max - q_min) ← 决定映射的"缩放比例"

  • zero_point = q_min - round(range_min / scale) ← 决定映射的"平移基准"

这个公式确保了:

  1. 保序性float(x) < float(y) → quant(x) <= quant(y)(单调递增映射)

  2. 双射区间[range_min, range_max] ↔ [q_min, q_max] 是一一对应的

  3. 截断处理:超出[range_min, range_max]的值会被clamp到边界

💡 为什么用更少的bit能加速?

1️⃣ 计算密度提升

# 浮点计算(32bit)
conv2d_float = sum(W_f32[i] * X_f32[i])  # 每次乘法需32bit乘法器

# 整型计算(8bit)
conv2d_int8 = (sum(W_i8[i] * X_i8[i]) - bias) * scale  # 8bit乘法器速度快4-10倍

2️⃣ 内存带宽减负

数据类型带宽占用缓存命中率理论加速比
FP324字节/参数1x
INT81字节/参数4x
INT40.5字节/参数极高8x

3️⃣ SIMD指令集优势

现代CPU/GPU的SIMD单元:

  • AVX2:1个指令同时处理32个INT8,但只能处理8个FP32

  • Tensor Core:单周期完成4x4 INT8矩阵乘法,比FP16快2倍

量化中可能遇到的问题汇总如下,

核心问题总览

问题类别核心问题问题描述主要解决方法
映射过程问题截断误差放弃范围外的极值,导致信息永久丢失。1. 最优截断:使用KLMSE等校准算法。
2. 层级均衡LayerwiseEqualization,将大范围分布拆分到相邻层。
舍入误差四舍五入导致的精度损失。1. 最优截断:让分布更“挤”,格子更“密”。
2. 可学习参数LSQ / TQT,通过训练优化舍入方式。
溢出/饱和计算时数值超出整数表示范围(通常是中间结果)。1. 算子融合QuantFusion,将多个操作合并,避免产生大数。
2. 动态范围调整:自动调整scale,预留安全边际。
结构/分布问题分布不均不同通道的数据范围差异巨大(常见于深度可分离卷积)。Per-channel量化:为每个通道独立设置scalezero_point
零点漂移量化ReLU等操作后,零点位置不稳定。优化调度策略Dispatcher,争议区算子用浮点计算,或做图优化。
特殊操作问题跨层合并量化后的Conv + BN + Relu等操作无法直接融合。算子融合QuantFusion,将BN参数吸收进Conv,再进行量化。
激活函数处理某些激活函数(如Swish, GeLU)对量化不友好。调度策略:将该激活函数放到浮点域计算(异构执行)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值