简介
本文介绍如何对Caffe框架的原始网络模型进行量化,量化是指对模型的参数(权重)和数据进行低比特处理,让最终生成的网络模型更加轻量化,从而达到节省网络模型存储空间、降低传输时延、提高计算效率,达到性能提升与优化的目标。昇腾模型压缩工具使用场景如图3-1所示。
根据量化方法不同,分为基于calibration的量化和基于retrain的量化。
上述两种量化方法,根据量化对象不同,分为权重量化和数据量化,根据是否对权重数据进行压缩又分为均匀量化和非均匀量化(仅支持均匀量化),基于retrain的量化,只支持均匀量化。
下面分别介绍相关概念:
基于calibration的量化
基于calibration的量化是指借助少量校准数据,找到数据和权重的量化因子,对数据和权重进行量化的方案。量化过程请参见基于calibration的量化。基于calibration的量化不支持多个GPU同时运行。
- 校准数据集
由于数据的量化参数的确定过程(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正相关。
- 权重量化
在进行模型推理加速时模型的权值已经确定,数值的范围也已经确定,因此可以直接根据权值的数据范围进行量化。
根据是否对权重数据进行压缩又分为均匀量化和非均匀量化(仅支持均匀量化)。
- 均匀量化
是指量化后的数据比较均匀地分布在某个数值空间中,例如INT8量化就是用只有8比特的INT8数据来表示32比特的FP32数据,将FP32的卷积运算过程(乘加运算)转换为INT8的卷积运算,加速运算和实现模型压缩功能;均匀的INT8量化则是量化后数据比较均匀地分布在INT8的数值空间[-128, 127]中,量化过程请参见均匀量化。
当前支持的均匀量化层为:全连接层(InnerProduct:transpose属性为true不做量化,axis>=2不做量化)、卷积层(Convolution:dilation为1、filter维度为4)、反卷积层(Deconvolution:group为1、dilation为1、filter维度为4)、平均下采样层Pooling(下采样方式为AVE,且非global pooling)。
- 如果均匀量化后的模型精度无法满足要求,则需要参见基于retrain的量化进行retrain的量化。
基于retrain的量化
基于retrain的量化是指借助用户完整训练数据集,在模型训练过程中插入量化相关操作,找到数据和权重的量化因子。该方案需要在量化基础上通过使用大量数据来对量化参数进行进一步优化,使得量化参数能够更好的匹配当前数据,从而在普通量化的基础上提高精度。
当前支持重训练的层为:全连接层(InnerProduct:transpose属性为true不做量化,axis>=2不做量化)、卷积层(Convolution:dilation为1、filter维度为4)、反卷积层(Deconvolution:group为1、dilation为1、filter维度为4)、平均下采样层Pooling(下采样方式为AVE,且非global pooling)。
基于retrain的量化缺点是较为耗时,同时需要大量数据。量化过程请参见基于retrain的量化。
- 训练数据集
基于用户训练网络中的数据集。
- 数据量化
数据量化是对每个要量化的层/Operation的输入数据进行统计,每个层/Operation计算出最优的一组scale和offset。数据是模型推理计算的中间结果,retrain通过arq retrain算法,在retrain的过程中,不断优化这两个参数,得到最终的最优参数。
- 权重量化
权重量化指的是在retrain的过程中不断优化权重的量化参数,得到最终的权重量化参数。
基于retrain的量化,只支持均匀量化。