量化简介和模式

1.量化简介

量化主要是一种加速推理的技术,量化运算符仅支持前向传递。量化是指使用精度较低的数据进行计算和内存访问的技术,与浮点实现相比,通常是 int8。这可以在几个重要领 (1).域实现性能提升:
(2).模型尺寸缩小 4 倍;
(3).内存带宽减少 2-4 倍;
(4).由于内存带宽的节省和使用 int8 算法的更快计算,推理速度提高了 2-4 倍(确切的加速取决于硬件、运行时和模型)。
  然而,量化并非没有额外代价。从根本上说,量化意味着引入近似值,由此产生的网络精度略低。这些技术试图最小化完整浮点精度和量化精度之间的差距。

2. 三种量化模式

2.1 Dynamic Quantization - 动态量化

PyTorch支持的最简单的量化方法称为动态量化。这不仅涉及将权重转换为int8(正如所有量化变量中所发生的那样),而且还涉及在执行计算之前将激活转换为int 8(因此为“动态”)。因此,将使用高效的int8矩阵乘法和卷积实现来执行计算,从而实现更快的计算。然而,激活是以浮点格式读取和写入内存的。

2.2 Post-Training Static Quantization - 训练后静态量化

通过将网络转换为同时使用整数算术和int8内存访问,可以进一步提高性能(延迟)。静态量化执行额外的步骤,首先通过网络输入数据批,并计算不同激活的结果分布(具体来说,这是通过在记录这些分布的不同点插入“观察者”模块来完成的)。该信息用于确定不同的激活应该在推断时量化的具体程度(一种简单的技术是将整个激活范围简单地划分为256个级别,但我们也支持更复杂的方法)。重要的是,这一附加步骤允许我们在操作之间传递量化值,而不是在每个操作之间将这些值转换为浮点值,然后再转换为整数,从而大大加快了速度。

在PyTorch中,支持几个允许用户优化静态量化的功能:

观察者:可以自定义观察者模块,指定如何在量化之前收集统计信息,以尝试更高级的方法来量化数据。
运算符融合:可以将多个操作融合为一个操作,节省内存访问,同时提高操作的数值精度。
每通道量化:我们可以在卷积/线性层中独立量化每个输出通道的权重,这可以以几乎相同的速度获得更高的精度。

2.3 Quantization Aware Training - 量化感知训练

量化感知训练(QAT)是第三种方法,也是这三种方法中精度最高的一种。使用QAT,所有权重和激活在训练的前向和后向过程中都是“伪量化”的:也就是说,浮点值被舍入为模拟int8值,但所有计算仍然使用浮点数字完成。因此,训练期间的所有权重调整都是在“感知到”模型最终将被量化这一事实的情况下进行的;因此,在量化之后,该方法通常比其他两种方法产生更高的精度。

你可能感兴趣的:(模型部署,pytorch,量化)