onnx模型int8量化

原帖:ONNX详解之七:onnx模型int8量化 - 知乎

Int8量化的概念

int8量化简单来说就是将原来模型中fp32的计算转换成int8计算,从而提升推理速度;在量化过程中,浮点值映射到以下形式的 8 位量化空间:val_fp32 = scale * (val_quantized - zero_point)

意思是:
1. 从量化值(val_quantize)中减去偏移量(zero_point),得到一个中间值。
2. 然后将这个中间值乘以缩放因子(scale),转换回浮点数(val_fp32)。

ONNX量化的表示格式

1. 面向算子 (QOperator):

所有量化的算子都有自己的 ONNX 定义,如 QLinearConv、MatMulInteger 等。

这些量化算子可以直接在模型中使用。

2. 面向张量 (QDQ;Quantize and DeQuantize) :
此格式在原始算子之间插入 DeQuantizeLinear(QuantizeLinear(tensor)) 以模拟量化和解量化过程。
这种方式可以在不修改原始算子的情况下进行量化。

总之,前者是直接使用量化算子,后者是在原始算子之间插入量化和解量化操作。两种方式都可以实现模型的量化。

动态量化

根据输入动态的计算scale和zero_point,使用QOperator的模型表示方式;

优点:能够保持较高的精度,

缺点:但推理速度可能相对较慢。

import onnx
from onnxruntime.quantization import quantize_dynamic, QuantType

model_fp32 = 'resnet50-v1-12.onnx'
model_quant = 'dynamic_quant_model.onnx'
quantized_model = quantize_dynamic(model_fp32, model_quant)

静态量化

通过提供的校准数据集,提前计算好scale和zero_point,使用QDQ的模型表示方式;

优点:推理速度快

缺点:精度没有动态量化高

建议对于RNN和transformer模型采用动态量化的方式,对于CNN模型采用静态量化的方式,如果都满足不了精度要求,建议采用量化感知训练,重新训练模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值