通过训练,神经网络就可以使用更低精度的数据格式(包括浮点、定点和整数)进行推理。低精度数据格式提供了几个性能优势:
许多处理器通过 low-bit 格式提供更高吞吐量的数学管道,这可以加快计算密集型的运算,如卷积和矩阵乘法;
低精度的数据格式可以减少了内存带宽压力,提高了带宽有限计算的性能;
低精度的数据格式可以降低内存大小的需求,这可以提高缓存利用率以及内存系统操作的其他方面。
本文主要研究神经网络模型推理的整数量化,其中网络模型在推理时使用整数权重和激活。表 1 列出了 NVIDIA Turing GPU 体系结构中各种数据类型相对的张量运算吞吐量和带宽减少倍数。与 FP32 中的相同操作相比,在 INT8 类型上执行的数学密集型张量运算的速度可以提高 16 倍。与 FP32 数据类型相比,受内存限制的运算,INT8 可以提高 4 倍的速度,因为它的位数更小。其他处理器,如 TPU,带有 VNNI 指令的英特尔 CPU 和许多新兴的加速器设计都为 INT8 操作提供了显著的加速。
![affec81b359e7a3fd84ac966f65a25fb.png](https://i-blog.csdnimg.cn/blog_migrate/05220d09e02556c5f0de3fe901f8ccee.png)
1. 量化基础
均匀量化可分为两步:
首先,选择要量化的实数的范围,限制在该范围之外的值;
其次,将实值映射到可由量化表示的相应位宽的整数(将每个映射的实值四舍五入到最接近的整数值)。
在预先训练的浮点神经网络中启用整数运算需要两个基本操作:
将实数转换为量化的整数表示(例如从 FP32 到 INT8);
将数字从量化的整数表示转换为实数(例如从 INT32 转换为 FP16)。
1.1 映射范围
为选择用于量化的可表示实值的范围, 为有符号整数表示的位宽。均匀量化将输入值 转换为 整数范围内,其中超出范围的输入被截断到最近边界值。由于我们只考虑均匀变换,变换函数只有两种选择: 及其特殊情形 ,其中 ,,。
1.1.1 非对称量化
非对称量化映射实值 到 一个 有符号整数 。公式 (1) 和 (2) 定义了非对称变换函数:
其中 是缩放因子, 是零点,即实值零映射到的整数值。在 INT8 的情况下, 和 。 四舍五入为整数值,因此实数零可精确表示为整数。因此,需要对实际可表示范围 进行轻微调整。
公式 (3) 和 (4) 定义了量化运算:
其中 四舍五入到最接近的整数。图 1a 显示了实值到具有非对称量化的 INT8 表示的映射。其中, 是可表示的整数与所选实数范围的比值。
![c678aad8d967a2d48f7288f27b25f4cb.png](https://i-blog.csdnimg.cn/blog_migrate/6d75599d191f28f733400b702ff5b20b.png)
公式 (5) 显示相应的去量化函数,该函数计算原始实数值输入的近似值。
1.1.2 对称量化
对称量化仅通过缩放变换执行量化范围映射,输入范围和整数范围都是对称的。对于 INT8,使用整数范围 [−127, 127],选择不使用值 -128 以支持对称。对于 INT8 量化,丢失 256 个可表示值中的一个是无关紧要。但对于较低的位宽整数量化,其可表示值和对称性之间的权衡应该重新评估。
图1b 说明了通过对称量化将实数值映射到 INT8。公式 (