上手SNPE(4)后量化工具
发表于 2022-03-22 14:57:40

本文介绍下SNPE量化工具snpe-dlc-quantize的使用以及包含的后量化技术。

SNPE中的量化工具是snpe-dlc-quantize

本文以Qualcomm Developer Network SNPE v1.55.0 为基础介绍。

  • 文档: snpe-1.55.0.2958/doc/html/tools.html#tools_snpe-dlc-quantize 和 snpe-1.55.0.2958/doc/html/quantized_models.html
  • 工具:snpe-1.55.0.2958/bin/x86_64-linux-clang/snpe-dlc-quantize

本文将介绍以下三个部分:

  1. snpe-dlc-quantize 基本使用
  2. 增强量化(Enhanced Quantization Mode)
  3. 后量化优化技术 CLE, BC

一、SNPE-DLC-QUANTIZE 基本用法

在上手SNPE(2)使用888的HTP推理inceptionV3中,量化模型章节中已经演示过snpe-dlc-quantize的用法,简单来说它就是将浮点的DLC模型后量化为定点的DLC模型的工具。

具体的使用选项可以通过--help选项了解:

snpe-dlc-quantize --help
Generate 8 or 16 bit TensorFlow style fixed point weight and activations encodings for a floating point SNPE model.
Command Line Options:
  [ -h, --help ]        Displays this help message.
  [ --version ]         Displays version information.
  [ --verbose ]         Enable verbose user messages.
  [ --quiet ]           Disables some user messages.
   .......

1. 准备输入样本

后量化需要推理模型来统计激活输出tensor的量化编码,所以一般需要50到100张输入样本,SNPE要求输入样本以浮点32 的二进制格式存储成.raw文件,然后将输入样本按照格式列在input_list.txt之中。

input_list.txt的格式如下:

#<output_layer_name>[<space><output_layer_name>]
%<output_tensor_name>[<space><output_tensor_name>]
<input_layer_name>:=<input_layer_path>[<space><input_layer_name>:=<input_layer_path>]
…
  • 对于888的HTP,如果要使用离线cache,输出的layers或者输出的tensors必须列在input_list.txt,这个是可选的,可以不列出,也可以只列出一种。
  • 对于snpe-net-run工具:

1)量化使用输出layers,同样的输出layers也必须在snpe-net-run的input_list里面. <snpe-1.55.0.2958/doc/html/tools.html#tools_snpe-net-run_input_list>

2)量化使用输出tensors,snpe-net-run 需要使用– set_output_tensors 指定输出tensors.

  • 对于SNPE API:
  • 量化使用输出layers,调用SNPEBuilder::setOutputLayers。
  • 量化使用输出tensors, 调用SNPEBuilder::setOutputTensors

2. 基本量化选项

假设需要将模型运行在888的HTP上,那么基本的量化选项如下:

snpe-dlc-quantize --input_dlc model.dlc --input_list input_list.txt --enable_htp --htp_socs sm8350
  • --enable_htp 表示使用离线cache,这样可以加速snpe-htp在888上的初始化时间.
  • --htp_socs sm8350 表示使用的888的HTP,如果使用78X的HTP,与之对应的的 sm7350.

二、增强量化(Enhanced Quantization Mode)

对于tensor的量化,首先是决定min和max,简单的策略有:

  • 使用样本统计得到的最大最小值min/max.
  • 选择min/max 使得95%的样本数值在min和max区间,也就是说对于超出范围的值直接取min/max.

1. 使用方法

SNPE 的增强量化模式(Enhanced Quantization Mode)是使用了一种算法来选择一组量化参数,使得模型精度相比于直接取min/max作为量化参数有所提升。

  • snpe-dlc-quantize对应的选项是--use_enhanced_quantizer。
  • 这个选项可以单独作用域weights或者activations,只需要在选项后面加上"weights" 或者 "activations"。
  • 如果模型weights或者activations的分布有长尾特性,可以尝试使用这个模式。

长尾(long tail)指的是tensor大部分的数值在一个小的范围,比如[-100,100],有个别数值是远远超出这个范围。

snpe-dlc-quantize --help
.....
[ --use_enhanced_quantizer ]
                        Use the enhanced quantizer feature when quantizing the model.  Regular quantization determines the range using the actual
                        values of min and max of the data being quantized.  Enhanced quantization uses an algorithm to determine optimal range.  It can be
                        useful for quantizing models that have long tails in the distribution of the data being quantized.

2. 简单原理

  • 1)在主机上用float32推理模型,得到每层输出的activations的概率密度分布PDF。

  • ​​​​​​(2)确定一个量化参数的step size 和 zero offset的可能取值范围。在step size和offset组成的二维栅格上搜索最优解。

  • (3)计算每一组取值的损失loss.

  • (4)选择最小损失的那一组step size,offset作为最后的量化参数.

参考AIMET里面的实现:TfEnhancedQuantizer.cppTfEnhancedEncodingAnalyzer.cpphttps://github.com/quic/aimet/blob/develop/ModelOptimizations/DlQuantization/src/TfEnhancedEncodingAnalyzer.cpp


三、后量化优化技术(CLE, BC)

由于各种各样的训练技术、模型结构和层类型,量化可能是一个难以解决的问题,为了缓解量化问题,snpe-dlc-quantize加入了两种模型预处理技术, CLE和BC,从而改善某些模型由于量化而准确率下降的问题。

细节参考论文Data-free quantization,https://arxiv.org/abs/1906.04721.

1. Cross-Layer Equalization,CLE

CLE是基于RELU激活函数的缩放一致性(scale-equivariance),调整连续两个convolution层的 weights的取值来实现量化友好。简单来说是将偏差较大的convolution层的weights缩小,将下一层convolution层的weights增加。

原理简介:

(1)如下图所示,MobilNetV2的 Depthwise Convolution层weights在不同channel上的取值范围差异很大,如果采用per-tensor的量化,范围很小的channel量化后损失会很大,从而影响模型准确率。

(2)CLE将对数值很大的channel的weights做scale缩小,从而减少这种不channel之间的差异。

         A. 黄色部分表示weights的channel 0.

         B. 调整Layer_1的weights channel_1的数值为原来的1/2, 同时调整Layer_2的weights 的所有数值为原来的2倍,由于RELU激活层的scale-equivariance,不影响整个模型的输出。

2. Bias Correction, BC

BC是用来纠正量化过程中在激活中引入的偏差,简单来说,BC技术分别统计浮点模型和定点模型的卷积激活输出的分布,然后对量化模型的统计偏差进行校正,这个修正添加在相应层的bias中。

原理简介:

量化之后的输出会发生偏移,如图所示,通过BC技术将他还原成原来的分布。

3. 使用方法

snpe-dlc-quantize对应的选项是--optimizations。

  • CLE+BC --optimizations cle --optimizations bc ,CLE和BC最好一起使用,它们可以相互补充,CLE非常快(秒),然而BC可能非常慢(几分钟到几小时);
  • CLE --optimizations cle ,BC 单独使用并不会有什么作用。
[ --optimizations=<val> ]
                        Use this option to enable new optimization algorithms. Usage is:
                        --optimizations <algo_name1> --optimizations <algo_name2>
                        The available optimization algorithms are:
                        cle - Cross layer equalization includes a number of methods for equalizing weights and biases across layers in order to rectify imbalances that cause quantiza
tion errors.

CLE的限制:

  1. CLE只能对网络中一个分支中的特定结构进行操作,而且这个特定结构只能有一个输出。支持的结构包括(r=必须的,o=可选择的):
  • Conv(r)->Batchnorm(r)->activation(o)->Conv(r)->Batchnorm(r)->activation(o)
  • Conv(r)->Batchnorm(r)->activation(o)->DepthwiseConv(r)->Batchnorm(r)->activation(o)->Conv(r)->Batchnorm(r)->activation(o)
  1. CLE算法目前只支持Relu激活,Relu6会被自动转化成Relu,其他activation算法会自动跳过。
  2. CLE需要batchnorms的beta和gamma在原始模型中,这样可以获得最大精度提升。对于TensorFlow,即便是折叠了BN,只要beta和gamma参数没有被折叠进weights和bias,参数就依然存在,如果CLE没有检测到需要的信息,你会看到"Invalid model for HBA quantization algorithm.",这表示只有部分算法运行,可能会影响最终效果。

总结

到此为止,

  • 介绍了snpe-dlc-quantize 的使用方法
  • snpe-dlc-quantize中的量化增强
  • snpe-dlc-quantize中的后量化技术

参考:

  • Data-Free Quantization Through Weight Equalization and Bias Correction

https://arxiv.org/abs/1906.04721

  • SNPE1.55.0

其他相关内容:

第一篇【上手SNPE(1)推理InceptionV3】

第二篇【上手SNPE(2)使用手机推理inceptionV3】

第三篇【上手SNPE(3)API详解】

作者:Wenhao

CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
微博关注
【免责声明:CSDN本栏目发布信息,目的在于传播更多信息,丰富网络文化,稿件仅代表作者个人观点,与CSDN无关。其原创性以及文中陈述文字和文字内容未经本网证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本网不做任何保证或者承诺,请读者仅作参考,并请自行核实相关内容。您若对该稿件有任何怀疑或质疑,请立即与CSDN联系,我们将迅速给您回应并做处理。】