量化 ONNX 模型
内容
- 量化概述
- ONNX 量化表示格式
- 量化 ONNX 模型
- 基于变压器的模型Transformer基于变压器的模型
- GPU 上的量化
- 常问问题
量化概述
ONNX 运行时中的量化是指 ONNX 模型的 8 位线性量化。
在量化期间,浮点值被映射到以下形式的 8 位量化空间:val_fp32 = scale * (val_quantized - zero_point)
scale
是一个正实数,用于将浮点数映射到量化空间。计算方法如下:
对于非对称量化:
<span style="background-color:#f5f6fa"><span style="background-color:#f5f6fa"><span style="color:#5c5962"><span style="background-color:#f5f6fa"><span style="color:#5c5962"><code> scale = (data_range_max - data_range_min) / (quantization_range_max - quantization_range_min)
</code></span></span></span></span></span>
对于对称量化:
<span style="background-color:#f5f6fa"><span style="background-color:#f5f6fa"><span style="color:#5c5962"><span style="background-color:#f5f6fa"><span style="color:#5c5962"><code> scale = max(abs(data_range_max), abs(data_range_min)) * 2 / (quantization_range_max - quantization_range_min)
</code></span></span></span></span></span>
zero_point
表示量化空间中的零。浮点零值在量化空间中能够精确表示是很重要的。这是因为许多 CNN 中都使用了零填充。如果量化后无法唯一表示0,就会导致精度误差。
ONNX 量化表示格式
有两种表示量化 ONNX 模型的方法:
- 面向操作员(QOperator)。所有量化运算符都有自己的 ONNX 定义,例如 QLinearConv、MatMulI