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模型采用静态量化的方式,如果都满足不了精度要求,建议采用量化感知训练,重新训练模型

1万+

被折叠的 条评论
为什么被折叠?



