简介
本文介绍如何对原始TensorFlow框架的网络模型进行量化,量化是指对模型的参数和数据进行低比特处理,让最终生成的网络模型更加轻量化,从而达到节省网络模型存储空间、降低传输时延、提高计算效率,达到性能提升与优化的目标。昇腾模型压缩工具使用场景如图4-1所示。
根据量化方法不同,分为基于calibration的量化和基于retrain的量化;上述两种量化方法,根据量化对象不同,分为权重量化和数据量化。
下面分别介绍相关概念:
基于calibration的量化
基于calibration的量化是指借助少量校准数据,找到数据和权重的量化因子,对数据和权重进行量化的方案。量化过程请参见基于calibration的量化。基于calibration的量化不支持多个GPU同时运行。
当前支持量化的层为:全连接层(MatMul,transpose_a=False, transpose_b=False,adjoint_a=False,adjoint_b=False),卷积层(Conv2D)、Depthwise卷积层(DepthwiseConv2dNative,dilation为1)、反卷积层(Conv2DBackpropInput,dilation为1)以及平均下采样层Pooling。
- 校准数据集
由于数据的量化参数的确定过程(calibration过程),算法会把校准集中的每一份数据作为输入,积攒下每个需要量化的层/Operations的对应输入数据,根据积攒下的数据作为量化算法的输入数据来确定量化参数。由于量化参数的确定和校准数据集的选择相关,因此量化后模型的精度也和校准数据集的选择相关,推荐使用验证集的子集作为校准数据集。
- 数据量化
数据量化是对每个要量化的层/Operation的输入数据进行统计,每个层/Operation计算出最优的一组scale和offset(通过原始高精度数据d_float计算得到UINT8数据,q_uint8的转换公式为q_uint8 = round(d_float/scale) - offset,其中scale为浮点数的缩放因子,offset为偏移量)。
数据是模型推理计算的中间结果,其数据的范围和输入相关,因此需要使用一组参考输入(校准数据集)作为激励,从而记录下来需要量化的层/Operations的输入数据,用于搜索得到量化参数(scale和offset)。由于在做数据calibration的过程中,需要占用额外的存储空间(显存/内存)来存储用于确定量化参数的输入数据,所以对于显存/内存的占用比仅推理的过程要高,额外占用空间的大小和calibration过程中的batch_size* batch_num正相关。
- 权重量化
在进行模型推理加速时模型的权值已经确定,数值的范围也已经确定,因此可以直接根据权值的数据范围进行量化。
基于retrain的量化
基于retrain的量化是指借助用户完整训练数据集,在已经训练好的模型中插入量化相关操作,找到数据和权重的量化因子。该方案需要在量化基础上通过使用大量数据来对量化参数进行进一步优化,使得量化参数能够更好的匹配当前数据,从而在普通量化的基础上提高精度。
当前支持重训练的层为:全连接层(MatMul,transpose_a=False, transpose_b=False,adjoint_a=False,adjoint_b=False),卷积层(Conv2D)、Depthwise卷积层(DepthwiseConv2dNative,dilation为1)、反卷积层(Conv2DBackpropInput,dilation为1)以及平均下采样层Pooling。
- 训练数据集
基于用户训练网络中的数据集。
- 数据量化
数据量化是对每个要量化的层/Operation的输入数据进行统计,每个层/Operation计算出最优的一组scale和offset。数据是模型推理计算的中间结果,retrain通过arq retrain算法,在retrain的过程中,不断优化这两个参数,得到最终的最优参数。
- 权重量化
权重量化指的是在retrain的过程中不断优化权重的量化参数,得到最终的权重量化参数。
基于retrain的量化,只支持均匀量化。