前语

浮点数和定点数

浮点数(floating point number)和定点数(fixed point number)都是核算机中表明实数(即带有小数部分的数)的办法。在数值核算中,小数在内存中是以浮点数格式表明和参与运算。浮点数和定点数中的“点”指的是小数点。

1,浮点数表明法是用科学计数法表明实数,即:

fractionbaseexponent\text{fraction} \times \text{base}^\text{exponent}

其中,fractionfraction 表明尾数,basebase 表明基数(一般为 2),exponent\text{exponent} 表明指数。浮点数的表明法将尾数和指数分别存储在核算机内存中,由于指数可为负数或小数,能够表明十分大或十分小的实数,一起也具有必定的精度。浮点数一般运用 IEEE754 规范表明,如单精度浮点数运用 32 位-FP32(1 位符号位,8 位指数位,23 位尾数位)来表明实数。

2,定点数表明法是用一个固定的小数位数来表明实数,即用必定数量的二进制数表明小数部分。定点数没有指数部分,小数部分的位数是固定的,所以它的规模和精度比较有限。定点数一般运用有符号或无符号整数表明,比方常见的 INT8

INT8 是 8 位定点数,其取值规模为 [−128,127][-128,127],共 256256 个不同的取值。

IEEE754 规范

咱们知道,浮点数是一种关于数学中实数的近似值数值表现法,其由符号、尾数、基和指数组成,如 −0.3141592610102−0.3141592610 \times 10^20.101001_2230.101001\_{2} \times 2^{3}

在数学中,实数(real number)是有理数和无理数的总称,直观了解便是小数

IEEE 754 规范中, 浮点数是用二进制表明的, 方式如下:

V=(−1)sf2eV = (-1)^s \times f \times 2^{e}

其由三部分组成:

  • 符号,sign,其值用 ss 表明。
  • 指数,exponent,其值用 ee 表明,关于单精度浮点数,指数占 8
  • 尾数,fraction,其值用 ff 表明。

IEEE 754 规范中的单精度和双精度格式如下图所示:

模型压缩-量化算法概述

单精度浮点数值的分类:

1,规格化的(一般状况):

指数位既不全为 0(数值 0),也不全位 1(单精度数值 255,双精度数值 2047)。这种状况下,指数为被界说以偏置方式表明的有符号整数,即指数位数值是 E=e−BiasE = e – Bias。核算进程省掉,可是由此发生的指数的取值规模,关于单精度是 [−126,127][-126, 127],而关于双精度是 [−1022,1023][-1022, 1023]

关于单精度的规格化数,其数值规模[12−126,(2−)2127],=0[1\times 2^{-126}, (2-\varepsilon) \times 2^{127}], \varepsilon = 0,通过换算十进制数规模为 [1.1710−38,3.41038][1.17 \times 10^{-38}, 3.4 \times 10^{38}]

2^{-126} = 1.17*10^{-38}
2 * 2^{127} = 3.4*10^{38}

2,非规格化的

CSAPP 中文书上翻译为阶码域为全 0 时,所表明的数时非规格化方式,即指数为全为 0(数值 0)。

3,特别值

和非规格化相反,阶码域为全 1 。

一,模型量化概述

所谓量化,其实能够等同于低精度(Low precision)概念,惯例模型精度一般运用 FP32(32 位浮点数,单精度)存储模型权重参数,低精度则表明运用 INT8FP16 等权重数值格式。

模型量化(Model Quantization,也叫网络量化)进程分为两部分:将模型的单精度参数(一般 FP3232浮点参数)转化为低精度参数(一般 INT88定点参数),以及模型推理进程中的浮点运算转化为定点运算,这个需求推理结构支撑。

模型量化技术能够降低模型的存储空间、内存占用和核算资源需求,然后进步模型的推理速度,也是为了更好的适配移动端/端侧 NPU 加快器。简略总结便是,模型变小了,速度变快了,支撑的场景更多了。

最终,现在工业界干流的思路便是模型练习运用高精度-FP32 参数模型,模型推理运用低精度-INT8 参数模型。

1.1,模型核算量和参数量核算

之所以需求做模型量化,是由于练习好的原始 FP32 模型实在太大了,在端侧/移动端都很好直接布置,即便运行起来速度和功耗也很大。经典 backbone 的参数量和核算量核算成果如下:

模型压缩-量化算法概述

来历 thop,也叫 PyTorch-OpCounter 东西核算成果。

Pytorch 结构中常用的参数量和核算量核算分析东西有,torchsummarythop。以 thop 为例,其根底用法如下所示:

import torch
from torchvision.models import resnet50
from thop import profile
model = resnet50()
input = torch.randn(1, 3, 224, 224)
macs, params = profile(model, inputs=(input, ))
print("flops: %.2f\nparameters: %.2f" % (macs, params))

运行成果如下所示:

[INFO] Register count_convNd() for <class 'torch.nn.modules.conv.Conv2d'>.
[INFO] Register count_normalization() for <class 'torch.nn.modules.batchnorm.BatchNorm2d'>.
[INFO] Register zero_ops() for <class 'torch.nn.modules.activation.ReLU'>.
[INFO] Register zero_ops() for <class 'torch.nn.modules.pooling.MaxPool2d'>.
[INFO] Register zero_ops() for <class 'torch.nn.modules.container.Sequential'>.
[INFO] Register count_adap_avgpool() for <class 'torch.nn.modules.pooling.AdaptiveAvgPool2d'>.
[INFO] Register count_linear() for <class 'torch.nn.modules.linear.Linear'>.
flops: 4133742592.00
parameters: 25557032.00

二,模型量化的计划

在实践中将浮点模型转为量化模型的办法有以下三种办法:

  1. data free:不运用校准集,传统的办法直接将浮点参数转化成定点数,运用上十分简略,可是一般会带来很大的精度丢失,可是高通最新的论文 DFQ 不运用校准集也得到了很高的精度。
  2. calibration:根据校准集计划,通过输入少量真实数据进行核算分析,然后确定浮点值域(min/max)。很多芯片厂商都供给这样的功用,如 tensorRT、高通、海思、地平线、寒武纪。TensorRT 校准时,一般是用练习集的子集。这儿运用校准集,是由于第一个 conv 需求核算输入 的 min、max 外,其他层都只需求核算中间输出 feature 的 min、max 即可。
  3. finetune:根据练习 finetune 的计划,将量化差错在练习时仿真建模,调整权重使其更适合量化。好处是能带来更大的精度提高,缺点是要修改模型练习代码,开发周期较长。

TensorFlow 结构依照量化阶段的不同,其模型量化功用分为以下两种:

  • Post-training quantization PTQ(练习后量化、离线量化);
  • Quantization-aware training QAT(练习时量化,伪量化,在线量化)。

PTQ Post Training Quantization 是练习后量化,也叫做离线量化。

  1. 根据量化零点 x_zeropointx\_{zero_point} 是否为 0,练习后量化分为对称量化非对称量化。根

  2. 据数据通道顺序 NHWC(TensorFlow) 这一维度区分,练习后量化又分为逐层量化逐通道量化。现在 nvidiaTensorRT 结构中运用了逐层量化的办法,每个网络层选用同一个阈值来进行量化。逐通道量化便是对每一层的每个通道都有各自的阈值,对精度能够有一个很好的提高。

2.1,量化算术的分类

现在已知的加快推理速度概率较大的量化办法主要有:

  1. 二值化,其能够用简略的位运算来一起核算很多的数。对比从 nvdia gpu 到 x86 渠道,1bit 核算分别有 5 到128倍的理论性能提高。且其只会引进一个额外的量化操作,该操作能够享受到 SIMD(单指令多数据流)的加快收益。
  2. 线性量化(最常见),又可细分为非对称,对称和 ristretto 几种。在 nvdia gpux86arm 和 部分 AI 芯片渠道上,均支撑 8bit 的核算,功率提高从 1 倍到 16 倍不等,其中 tensor core 甚至支撑 4bit核算,这也是十分有潜力的方向。线性量化引进的额外量化/反量化核算都是规范的向量操作,因而也能够运用 SIMD 进行加快,带来的额外核算耗时不大。
  3. 对数量化,一种比较特别的量化办法。两个同底的幂指数进行相乘,那么等价于其指数相加,降低了核算强度。一起加法也被转变为索引核算。现在 nvdia gpux86arm 三大渠道上没有实现对数量化的加快库,可是现在已知海思 351X 系列芯片上运用了对数量化。

与非线性量化不同,线性量化选用均匀散布的聚类中心,原始浮点数据和量化后的定点数据存在一个简略的线性变换联系,由于卷积、全衔接等网络层自身只是简略的线性核算,因而线性量化中能够直接用量化后的数据进行直接核算。

三,量化算法

3.1,浮点转定点算术

32-bit 浮点数和 8-bit 定点数的表明规模如下表所示:

数据类型 最小值 最大值
FP32 -1.17e38 3.4e38
int8 -128 127
uint8 0 255

原始神经网络模型的推理由浮点运算构成。FP32INT8 的值域是 [1.1710−38,3.41038][1.17 \times 10^{-38}, 3.4 \times 10^{38}][−128,127][−128,127],而取值数量大约分别为 2322^{32}282^8FP32 取值规模十分广,因而,将网络从 FP32 转化为 INT8 并不像数据类型转化截断那样简略。

根据偏移量 ZZ 是否为 0,能够将浮点数的线性量化分为两类-对称量化和非对称量化

当浮点值域落在 (−1,1)(-1,1) 之间,权重浮点数据的量化运算可运用下式的办法将 FP32 映射到 INT8,这是对称量化。其中 xfloatx_{float} 表明 FP32 权重, xquantizedx_{quantized} 表明量化的 INT8 权重,xscalex_{scale} 是缩放因子(映射因子、量化尺度(规模)/ float32 的缩放因子)。

xfloat=xscalexquantizedxquantized=xfloatxquantizedx_{float} = x_{scale} \times x_{quantized} \\ x_{quantized} = \frac{x_{float}}{x_{quantized}}

对称量化的浮点值和 8 位定点值的映射联系如下图,从图中能够看出,对称量化便是将一个 tensor 中的 [−max(∣x∣),max(∣x∣)][-max(|\mathrm{x}|),max(|\mathrm{x}|)] 内的 FP32 值分别映射到 8 bit 数据的 [-128, 127] 的规模内,中间值依照线性联系进行映射,称这种映射联系是对称量化。能够看出,对称量化的浮点值和量化值规模都是相关于零对称的。

模型压缩-量化算法概述

由于对称量化的缩放办法或许会将 FP32 零映射到 INT8 零,但咱们不期望这种状况出现,所以出现了数字信号处理中的均一量化,即非对称量化。数学表达式如下所示,其中 xzeropointx_{zero_point} 表明量化零点(量化偏移)。

xfloat=xscale(xquantized−xzeropoint)x_{float} = x_{scale} \times (x_{quantized} – x_{zero_point})

大多数状况下量化是选用无符号整数,即 INT8 的值域就为 [0,255][0,255] ,这种状况,显着要用非对称量化。非对称量化的浮点值和 8 位定点值的映射联系如下图:

模型压缩-量化算法概述

总的来说,权重量化浮点值能够分为两个步骤

  1. 通过在权重张量(Tensor)中找到 minminmaxmax 值然后确定 xscalex_{scale}xzero_pointx_{zero\_point}
  2. 将权重张量的每个值从 FP32 转化为 INT8 。
xfloat∈[xfloatmin,xfloatmax]xscale=xfloatmax−xfloatminxquantizedmax−xquantizedminxzeropoint=xquantizedmax−xfloatmaxxscalexquantized=xfloatxscale+xzero_point\begin{aligned} x_{float} &\in [x_{float}^{min}, x_{float}^{max}] \\ x_{scale} &= \frac{x_{float}^{max} – x_{float}^{min}}{x_{quantized}^{max} – x_{quantized}^{min}} \\ x_{zero_point} &= x_{quantized}^{max} – x_{float}^{max} \div x_{scale} \\ x_{quantized} &= x_{float} \div x_{scale} + x_{zero\_point} \end{aligned}

留意,当浮点运算成果不等于整数时,需求额外的舍入步骤。例如将 FP32 值域 [−1,1] 映射到 INT8 值域 [0,255],有 x_scale=2255x\_{scale}=\frac{2}{255},而x_zeropoint=255−2552≈127x\_{zero_point}= 255−\frac{255}{2}≈127

relu 激活量化中,relu 中零点的方位不是实践 8 位的 0,而是咱们核算出来的 zero_point 值。

留意,量化进程中存在差错是不可避免的,就像数字信号处理中量化相同。非对称算法一般能够较好地处理数据散布不均匀的状况

3.2,定点转浮点算术

这儿以常用的非对称量化为例分析。

量化的另一个方向是定点转浮点算术,即量化后模型中的 INT8 核算是描绘惯例神经网络的 FP32 核算,对应的便是反量化进程,也便是如何将 INT8 的定点数据反量化成 FP32 的浮点数据。

下面的等式 5-10 是反量化乘法 xfloat⋅yfloatx_{float} \cdot y_{float} 的进程。关于给定神经网络,输入 xx、权重 yy 和输出 zz 的缩放因子肯定是已知的,因而等式 9 的 Multiplierx,y,z=xscaleyscalezscaleMultiplier_{x,y,z} = \frac{x_{scale}y_{scale}}{z_{scale}} 也是已知的,在反量化进程之前可预先核算。因而,除了 Multiplierx,y,zMultiplier_{x,y,z}(xquantized−xzeropoint)⋅(yquantized−yzeropoint)(x_{quantized} – x_{zero_point})\cdot (y_{quantized} – y_{zero_point}) 之间的乘法外,等式 10 中的运算都是整数运算。

zfloat=xfloat⋅yfloatzscale⋅(zquantized−zzero_point)=(xscale⋅(xquantized−xzero_point))⋅(yscale⋅(yquantized−yzero_point))zquantized−zzero_point=xscale⋅yscalezscale⋅(xquantized−xzero_point)⋅(yquantized−yzero_point)z_quantized=xscale⋅yscalezscale⋅(xquantized−xzero_point)⋅(yquantized−yzero_point)+zzero_pointMultiplierx,y,z=xscale⋅yscalezscalezquantized=Multiplierx,y,z⋅(xquantized−xzero_point)⋅(yquantized−yzero_point)+zzero_point\begin{aligned} z_{float} & = x_{float} \cdot y_{float} \\ z_{scale} \cdot (z_{quantized} – z_{zero\_point}) & = (x_{scale} \cdot (x_{quantized} – x_{zero\_point})) \cdot (y_{scale} \cdot (y_{quantized} – y_{zero\_point})) \\ z_{quantized} – z_{zero\_point} &= \frac{x_{scale} \cdot y_{scale}}{z_{scale}} \cdot (x_{quantized} – x_{zero\_point}) \cdot (y_{quantized} – y_{zero\_point}) \\ z\_{quantized} &= \frac{x_{scale} \cdot y_{scale}}{z_{scale}} \cdot (x_{quantized} – x_{zero\_point}) \cdot (y_{quantized} – y_{zero\_point}) + z_{zero\_point} \\ Multiplier_{x,y,z} &= \frac{x_{scale} \cdot y_{scale}}{z_{scale}} \\ z_{quantized} &= Multiplier_{x,y,z} \cdot (x_{quantized} – x_{zero\_point}) \cdot (y_{quantized} – y_{zero\_point}) + z_{zero\_point} \\ \end{aligned}

等式:反量化算术进程。

关于等式 9 能够应用的大多数状况,quantizedquantizedzeropointzero_point 变量 (x,y)(x,y) 都是 INT8 类型,scalescaleFP32。实践上两个 INT8 之间的算术运算会累加到 INT16INT32,这时 INT8 的值域或许无法保存运算成果。例如,关于 xquantized=20x_{quantized}=20xzero_point=50x_{zero\_point} = 50 的状况,有 (xquantized−xzero_point)=−30(x_{quantized} − x_{zero\_point}) = −30 超出 INT8 值规模 [0,255][0,255]

另外,数据类型转化进程或许将 Multiplierx,y,z⋅(xquantized−xzeropoint)⋅(yquantized−yzeropoint)Multiplier_{x,y,z} \cdot (x_{quantized} – x_{zero_point}) \cdot (y_{quantized} – y_{zero_point}) 转化为 INT32 或 INT16 类型,之后和 zzeropointz_{zero_point} 运算,确保核算成果简直悉数落入 INT8 值域 [0,255] 中。

关于以上状况,在工程中,比方关于卷积算子的核算,sum(x*y) 的成果需求用 INT32 保存,一起,b 值一般也是 INT32 格式的,之后再 requantize (重新量化)成 INT8

四,量化办法的改进

量化浮点部分中描绘权重浮点量化办法是十分简略的。在深度学习结构的早期开发中,这种简略的办法能快速跑通 INT8 推理功用,可是选用这种办法的网络的预测准确度一般会出现显着的下降。

虽然 FP32 权重的值域很窄,在这值域中数值点数量却很大。以上文的缩放为例,[−1,1][−1,1] 值域中 2312^{31}(是的,基本上是总得可表明数值的一半)个 FP32 值被映射到 256256 个 INT8 值。

  • 量化类型:(SYMMETRIC) 对称量化和 (NON-SYMMETRIC) 非对称量化;
  • 量化算法:MINMAXKL 散度、ADMM
  • 权重量化类型:per-channel per-layer

选用普通量化办法时,靠近零的浮点值在量化时没有精确地用定点值表明。因而,与原始网络比较,量化网络一般会有显着的精度丢失。关于线性(均匀)量化,这个问题是不可避免的。

一起值映射的精度是受由 xfloatminx_{float}^{min}xfloatmaxx_{float}^{max} 得到的 xscalex_{scale} 显著影响的。而且,如图十所示,权重中邻近 xfloatminx_{float}^{min}xfloatmaxx_{float}^{max} 邻近的值一般是可疏忽的,其实就等同于映射联系中浮点值的 minmax 值是能够通过算法挑选的

模型压缩-量化算法概述

图十将浮点量化为定点时调整最小值-最大值。

上图展示了能够调整 min/max 来挑选一个值域,使得值域的值更准确地量化,而规模外的值则直接映射到定点的 min/max。例如,当从原始值规模 \[−1,1]\[−1,1] 中选定x_minfloat=−0.9x\_{min}^{float} = −0.9x_maxfloat=0.8x\_{max}^{float} = 0.8\[−0.9,0.8]\[−0.9,0.8] 中的值将能更准确地映射到 \[0,255]\[0,255] 中,而 \[−1,−0.9]\[−1,−0.9]\[0.8,1]\[0.8,1] 中的值分别映射为 00255255

4.1,浮点数动态规模挑选

参阅干货:深度学习模型量化(低精度推理)大总结。

通过前文对量化管用的了解和上面两种量化算法的介绍咱们不难发现,为了核算 scalezero_point,咱们需求知道 FP32 weight/activation 的实践动态规模。关于推理进程来说,weight 是一个常量张量,动态规模是固定的,activation 的动态规模是改变的,它的实践动态规模有必要通过采样获取(一般把这个进程称为数据校准(calibration))。

即卷积层权重的量化 scale 可通过量化算法 + weights 直接核算得到,可是激活层的量化 scale 需求通过采样获取,即输入校准数据集。

将浮点量化转为定点时调整最小值/最大值(值域调整),也便是浮点数动态规模的挑选,动态规模的选取直接决定了量化数据的散布状况,处于动态规模之外的数据将被映射成量化数据的边界点,即值域的挑选直接决定了量化的差错

现在各大深度学习结构和三大渠道的推理结构运用最多的有最大最小值(MinMax)、滑动均匀最大最小值(MovingAverageMinMax)和 KL 间隔(Kullback-Leibler divergence)三种办法,去确定浮点数的动态规模。如果量化进程中的每一个 FP32 数值都在这个实践动态规模内,咱们一般称这种为不饱满状态;反之如果出现某些 FP32 数值不在这个实践动态规模之内咱们称之为饱满状态。

4.2,最大最小值(MinMax)

MinMax 是运用最简略也是较为常用的一种采样办法。基本思想是直接从 FP32 张量中选取最大值和最小值来确定实践的动态规模,如下公式所示。

xmin={min(X)ifxmin=Nonemin(xmin,min(X))otherwisex_{min} = \left\{\begin{matrix}min(X) & if\ x_{min} = None \\ min(x_{min}, min(X)) & otherwise\end{matrix}\right.

xmax={max(X)ifxmax=Nonemax(xmax,max(X))otherwisex_{max} = \left\{\begin{matrix}max(X) & if\ x_{max} = None \\ max(x_{max}, max(X)) & otherwise\end{matrix}\right.

weights 而言,这种采样办法是不饱满的,可是关于 activation 而言,如果采样数据中出现离群点,则或许显着扩展实践的动态规模,比方实践核算时 99% 的数据都均匀散布在 [-100, 100] 之间,可是在采样时有一个离群点的数值为 10000,这时候采样取得的动态规模就变成 [-100, 10000]

4.3,滑动均匀最大最小值(MovingAverageMinMax)

MinMax 算法直接替换不同,MovingAverageMinMax 会选用一个超参数 c (Pytorch 默认值为0.01)逐步更新动态规模。

xmin={min(X)ifxmin=None(1−c)xmin+c;min(X)otherwisex_{min} = \left\{\begin{matrix}min(X) & if x_{min} = None \\ (1-c)x_{min}+c ; min(X) & otherwise\end{matrix}\right.

xmax={max(X)ifxmax=None(1−c)xmax+c;max(X)otherwisex_{max} = \left\{\begin{matrix}max(X) & if x_{max} = None \\ (1-c)x_{max}+c ; max(X) & otherwise\end{matrix}\right.

这种办法取得的动态规模一般要小于实践的动态规模。关于 weights 而言,由于不存在采样的迭代,因而 MovingAverageMinMax 与 MinMax 的作用是相同的。

4.4,KL 间隔采样办法(Kullback–Leibler divergence)

了解 KL 散度办法之前,咱们先看下 TensorRT 关于值域规模阈值挑选的一张图:

模型压缩-量化算法概述

这张图展示的是不同网络结构的不同 layer 的激活值散布核算图,横坐标是激活值,纵坐标是核管用量的归一化表明,而不是肯定数值核算;图中有卷积层和池化层,它们之间散布很不相同,因而合理的量化办法应该是适用于不同层的激活值散布,而且减小信息丢失,由于从 FP32INT8 其实也是一种信息再编码的进程。

简略的将一个 tensor 中的 -|max| 和 |max| FP32 value 映射为 -128 和 127 ,中间值依照线性联系进行映射,这种映射联系为不饱满的(No saturation),也叫对称的。关于这种简略的量化浮点办法,试验成果显现会导致比较大的精度丢失。

通过上图能够分分出,线性量化中运用简略的量化浮点办法导致精度丢失较大的原因是:

  • 上图的激活值核算针对的是一批图片,不同图片输出的激活值不完全相同,所以图中是多条曲线而不是一条曲线,曲线中前面一部分数据重合在一起了(红色虚线),阐明不同图片生成的大部分激活值其散布是类似的;可是在曲线的右边,激活值比较大时(红色实现圈起来的部分),曲线不重复了,一个激活值会对应多个不同的核算量,这时激活值散布是比较乱的。
  • 曲线后边激活值散布比较乱的部分在整个网络层占是占少量的(比方 10−910^-9, 10−710^-7, 10−310^-3),因而曲线后边的激活值散布部分能够不考虑到映射联系中,只保存激活值散布的主方向。

一般以为量化之后的数据散布与量化前的数据散布越类似,量化对原始数据信息的丢失也就越小,即量化算法精度越高。KL 间隔(也叫 KL 散度)一般被用来衡量两个散布之间的类似性。这儿的数据散布都是离散方式的,其离散数据的 KL 散度公式如下:

DKL(P∣Q)=∑iP(i)logaP(i)Q(i)=∑iP(i)[logP(x)−logQ(x)]D_{KL}(P | Q) = \sum_i P(i)log_{a} \frac{P(i)}{Q(i)} = \sum_i P(i)[logP(x) – log Q(x)]

式中 P 和 Q 散布表明量化前 FP32 的数据散布和量化后的 INT8 数据散布。留意公式要求 P、Q 两个核算直方图长度相同(也便是 bins 的数量相同)。

TensorRT 运用 KL 散度算法进行量化校准的进程:首先在校准集上运行 FP32 推理,然后关于网络每一层履行以下步骤:

  1. 搜集激活层输出的直方图。
  2. 生成许多具有不同饱满度阈值的量化散布。
  3. 挑选最小化 KL_divergence(ref_distr, quant_distr) 的阈值 T,并确定 Scale

以上运用校准集的模型量化进程一般只需几分钟时刻。

4.5,总结

  • 对称的,不饱满的线性量化,会导致精度丢失较大;
  • 通过最小化 KL 散度来挑选饱满量化中的 阈值 |T|;

五,量化实战经验

参阅【商汤泰坦公开课】模型量化了解一下?

1,量化是一种现已取得了工业界认可和运用的办法,在练习 (Training) 中运用 FP32 精度,在推理 (Inference) 期间运用 INT8 精度的这套量化体系现已被包含 TensorFlowTensorRTPyTorchMxNet 等很多深度学习结构和启用,地平线机器人、海思、安霸等很多 AI 芯片厂商也在深度学习东西链中供给了各自版本的模型量化功用。 2,量化是一个大部分硬件渠道都会支撑的,因而比较常用;常识蒸馏有利于取得小模型,还能够进一步提高量化模型的精度,所以这个技巧也会运用,尤其是在有现已训好比较强的大模型的根底上会十分有用。剪枝用的会相对较少,由于能够被网络结构查找覆盖。

参阅资料

  1. 后练习量化——Data free quantization
  2. 神经网络量化–从早期的量化算法谈起
  3. SystemforAI-10-Efficiency via Compression and Sparsity
  4. NNI 文档
  5. 附录 A IEEE 浮点运算规范