3.4. 量化

3.4.1. 性能瓶颈

对目前大多数深度学习任务而言,只要过了某个合理的阈值不够成性能瓶颈就行。7

3.4.2. 定义

参数量化是指用较低位宽表示典型的32位浮点网络参数,网络参数包括权重、激活值、梯度和误差等等,可以使用统一的位宽(如16-bit、8-bit、2-bit和1-bit等),也可以根据经验或一定策略自由组合不同的位宽.

3.4.2.1. 优点

  1. 能够显著减少参数存储空间与内存占用空间,将参数从32位浮点型量化到8位整型,从而缩小75%的存储空间,这对于计算资源有限的边缘设备和嵌入式设备进行深度学习模型的部署和使用都有很大的帮助;

  2. 能够加快运算速度,降低设备能耗,读取32位浮点数所需的带宽可以同时读入4个8位整数,并且整型运算相比浮点型运算更快,自然能够降低设备功耗.但其仍存在一定的局限性,网络参数的位宽减少损失了一部分信息量,会造成推理精度的下降,虽然能够通过微调恢复部分精确度,但也带来时间成本的增加;量化到特殊位宽时,很多现有的训练方法和硬件平台不再适用,需要设计专用的系统架构,灵活性不高.

量化就是将神经网络的浮点算法转换为定点。这样就可以在移动手机上实现网络的实时运算,对云计算的部署也有帮助。2

常规精度一般使用 FP32(32位浮点,单精度)存储模型权重;低精度则表示 FP16(半精度浮点),INT8(8位的定点整数)等等数值格式。不过目前低精度往往指代 INT8。

3.4.3. 为什么需要量化?

想象一下,一个使用 ATmega328P 微控制器的 Arduino Uno,它使用 8 位运算。要想在 Uno 上运行一个模型,理想情况下模型权重必须存储为 8 位整数(而许多台式计算机和笔记本电脑使用 32 位或 64 位浮点表示)。通过量化模型,权重的存储大小减少为原来的 4 分之一(如 32 位到 8 位值的量化),而对准确度的影响可以忽略(通常约为 1–3%)。

8 位编码过程中量化误差的示意图(图源:https://tinymlbook.com/

此外,在量化过程中,由于量化误差,一些信息可能会丢失。为了解决这个问题,量化感知(QA)训练被提出并作为一种替代方案。

3.4.4. 技术

首先考虑简单情况,将浮点数

(3.4.1)\[x_{\text {float }} \in\left(x_{\min }, x_{\max }\right)\]

量化为整数

(3.4.2)\[q_{i n t} \in\left(q_{\min }, q_{\max }\right)\]

量化的计算公式为

(3.4.3)\[q_{\text {int }}=\text { round }\left(\frac{x_{\text {float }}}{\text { scale }}\right)+z p\]

这里需要提前确定量化信息scale、zp。

通常情况下,有以下三种方式来基于浮点数和整数的映射关系进行量化信息的计算,如图2所示。4

  • 非饱和方式:将浮点数正负绝对值的最大值对应映射到整数的最大最小值。

  • 饱和方式:先计算浮点数的阈值,然后将浮点数的正负阈值对应映射到整数的最大最小值。

  • 仿射方式:将浮点数的最大最小值对应映射到整数的最大最小值。

模型量化是对原始模型中的权重和激活进行量化,量化方法分为以下三种。4

动态离线量化:此方式不需要样本数据。采用非饱和方式进行权重的量化。 静态离线量化:此方式只需使用少量的样本数据进行模型的前向计算,对激活进行数值采样。使用饱和方式量化权重,非饱和方式量化激活。 量化训练:此方式需要使用大量有标签样本数据。通过非饱和方式进行权重和激活的量化,并在训练过程中更新权重。

在权重量化层面,Gupta 发现,使用 16 位的定点数作为权重,足够在 MNIST 上训练一个神经网络 .此外,Dettmers 研究了 8 位定点量化,加快并行训练中深度网络的收敛速度.Han 等人提出了结合权重剪枝,量化和霍夫编码的策略, 可以得到非常高的压缩比,但是这种方法需要专门的运算策略来实现.提出了二值权重网络(Binary Weight Network, BWN)即对于网络的权重而言,只有 1 或-1 两个值.BWN 采用了一种混合策略(BinaryConnect)对于网络的中间层特征,保留其原始精度,只将网络权重进行二值化,将网络前向传播与反向传播时的乘法操作变为加法操作.在网络的训练过程中,二值化的权重应用于前向传播与反向传播的梯度计算,而在更新权重时,采用全精度的权重,当全精度的权重越过阈值时,其对应的二值化后的权重就会发生改变.在测试时,只保留和使用二值化之后的权重,每个权重只占用一个 bit 的空间,对于 32 位或者 64 位 bit 的浮点数,有 32~64 倍的压缩倍率,并且由于用累加代替了乘法运算,使得网络的运行效率也大幅提升.6

3.4.5. 工业界

工业界最终选择了 INT8 量化—— FP32 在推理(inference)期间被 INT8 取代,而训练(training)仍然是 FP32。TensorRT,TensorFlow,PyTorch,MxNet 和许多其他深度学习软件都已启用(或正在启用)量化。5

一些框架简单地引入了 Quantize 和 Dequantize 层,当从卷积或全链接层送入或取出时,它将 FP32 转换为 INT8 或相反。在这种情况下,如图四的上半部分所示,模型本身和输入/输出采用 FP32 格式。深度学习框架加载模型,重写网络以插入Quantize 和 Dequantize 层,并将权重转换为 INT8 格式。5

3.4.6. TPU3

TPU的高性能还来源于对于低运算精度的容忍。研究结果表明,低精度运算带来的算法准确率损失很小,但是在硬件实现上却可以带来巨大的便利,包括功耗更低、速度更快、占芯片面积更小的运算单元、更小的内存带宽需求等。TPU采用了8比特的低精度运算。