evo

Evolvable programming language -- evo

View the Project on GitHub lancerstadium/evo

EVO Quant

在 ONNX(Open Neural Network Exchange)标准中,量化(Quantization)和反量化(Dequantization)是用于减少模型大小和提高推理效率的重要操作。ONNX 提供了一些专门用于量化和反量化的算子,它们可以帮助将浮点数值映射到整数范围,并在推理时将其转换回浮点表示。

ONNX 的常见量化/反量化算子有: QuantizeLinear 这是用于将浮点数量化为整数(如 INT8 或 UINT8)的 ONNX 算子。

输入:

输出:

用途:将浮点数值映射到一个整数值区间,用于量化推理。 示例:

quantized_tensor = QuantizeLinear(input_tensor, scale, zero_point)

DequantizeLinear 是用于将量化的整数数据反量化回浮点数值的 ONNX 算子。

输入:

输入张量(量化后的整数张量) scale:量化比例系数(浮点数) zero_point:量化零点(可选,整数) 输出:

反量化后的浮点数张量 用途:

将量化整数值转换回原始的浮点数值,用于模型推理中的精度恢复。 示例:

dequantized_tensor = DequantizeLinear(quantized_tensor, scale, zero_point)

量化/反量化流程的示例

在 ONNX 模型中,量化/反量化的常见操作如下:

量化:在推理开始之前,将输入的浮点数张量通过 QuantizeLinear 算子转换为整数张量。 反量化:在推理中间或结束时,将整数张量通过 DequantizeLinear 算子恢复为浮点数。

Example of quantizing and dequantizing in ONNX:

import numpy as np
import onnx
import onnxruntime as ort

Example float tensor

input_tensor = np.array([0.1, 0.2, 0.3], dtype=np.float32)
scale = np.array([0.02], dtype=np.float32)
zero_point = np.array([0], dtype=np.uint8)

Quantize the float tensor

quantized_tensor = QuantizeLinear(input_tensor, scale, zero_point)

Dequantize back to float

dequantized_tensor = DequantizeLinear(quantized_tensor, scale, zero_point)

其他相关的 ONNX 算子 虽然 QuantizeLinear 和 DequantizeLinear 是最常用的量化/反量化算子,但在具体模型中可能还会使用其他与量化相关的操作,例如:

MatMulInteger 和 ConvInteger:

这些是量化推理中常用的算子,用于整数矩阵乘法和卷积运算。 这些算子接受量化后的整数张量作为输入,而不是浮点数。 QLinearMatMul 和 QLinearConv:

这是支持量化数据的线性矩阵乘法和卷积运算的专用量化版本。它们支持直接在量化的数据上进行操作,避免反量化回浮点数进行计算。

总结:

常见量化方法

在实现不同的量化方法时,每种方法都有其适用的场景和优缺点。以下是 对称量化非对称量化动态范围量化对数量化 的优缺点分析:

1. 对称量化 (Symmetric Quantization)

优点

缺点

2. 非对称量化 (Asymmetric Quantization)

优点

缺点

3. 动态范围量化 (Dynamic Range Quantization)

优点

缺点

4. 对数量化 (Logarithmic Quantization)

优点

缺点


总结

量化方法 优点 缺点
对称量化 简单易实现,适合对称分布的数据,计算高效 不适合偏移较大的数据,难以处理非对称数据
非对称量化 能处理非对称数据,引入零点增加精度,适合偏移数据 实现稍复杂,需计算零点
动态范围量化 动态适应数据分布范围,适合全局数据分布跨度大的情况 动态计算开销大,无法适应局部分布变化
对数量化 适合数据范围跨度大的情况,对指数分布或变化快速的数据效果好 低精度时效果差,计算较复杂,需要处理 0 的特殊情况

不同的量化方法适用于不同的场景:对称量化和非对称量化通常用于神经网络推理优化,而动态范围量化和对数量化则更适用于跨越大范围或指数变化的数据。在实际应用中,可以根据具体的任务需求选择合适的量化方法。

以下是从易到难列举的具体量化算法,每种算法均附有公式,并且涵盖了从简单到复杂的量化方法:

1. 简单 Min-Max 对称量化

2. 简单 Min-Max 非对称量化

3. 最大绝对值对称量化(Max-Abs Symmetric Quantization)

4. 逐通道量化(Per-Channel Quantization)

5. 均值-标准差量化(Mean-Std Quantization)

6. 动态范围量化(Dynamic Range Quantization)

7. KL 散度量化(KL-Divergence Quantization)

8. 对数量化(Logarithmic Quantization)

9. 感知量化(Perceptual Quantization, PQ)

1)}{\text{scale}}\right) ]