通过训练,神经网络就可以使用更低精度的数据格式(包括浮点、定点和整数)进行推理。低精度数据格式提供了几个性能优势:
- 许多处理器通过 low-bit 格式提供更高吞吐量的数学管道,这可以加快计算密集型的运算,如卷积和矩阵乘法;
- 低精度的数据格式可以减少了内存带宽压力,提高了带宽有限计算的性能;
- 低精度的数据格式可以降低内存大小的需求,这可以提高缓存利用率以及内存系统操作的其他方面。
本文主要研究神经网络模型推理的整数量化,其中网络模型在推理时使用整数权重和激活。表 1 列出了 NVIDIA Turing GPU 体系结构中各种数据类型相对的张量运算吞吐量和带宽减少倍数。与 FP32 中的相同操作相比,在 INT8 类型上执行的数学密集型张量运算的速度可以提高 16 倍。与 FP32 数据类型相比,受内存限制的运算,INT8 可以提高 4 倍的速度,因为它的位数更小。其他处理器,如 TPU,带有 VNNI 指令的英特尔 CPU 和许多新兴的加速器设计都为 INT8 操作提供了显著的加速。
表 1 NVIDIA Turing GPU 架构中张量运算的低精度数据类型的优势
1. 量化基础
均匀量化可分为两步:
- 首先,选择要量化的实数的范围,限制在该范围之外的值;
- 其次,将实值映射到可由量化表示的相应位宽的整数(将每个映射的实值四舍五入到最接近的整数值)。
在预先训练的浮点神经网络中启用整数运算需要两个基本操作:
- 将实数转换为量化的整数表示(例如从 FP32 到 INT8);
- 将数字从量化的整数表示转换为实数(例如从 INT32 转换为 FP16)。
1.1 映射范围
[β,α]为选择用于量化的可表示实值的范围, b为有符号整数表示的位宽。均匀量化将输入值 xϵ[β,α] 转换为 [-2b-1,2b-1-1] 整数范围内,其中超出范围的输入被截断到最近边界值。由于我们只考虑均匀变换,变换函数只有两种选择:f(x)=sx+z 及其特殊情形 f(x)=sx,其中