量化将网络中主要算子(Convolution,Pooling,Binary等)由原先的浮点计算转成低精度的Int8计算,减少模型大小并提升性能。
PS:
1、关于KL量化方法,可以参考:http://on-demand.gputechconf.com/gtc/2017/presentation/s7310-8-bit-inference-with-tensorrt.pdf
cd <path_to_tnn>/platforms/linux/
./build_quanttool.sh -c
量化模型命令:<path_to_tnn>/platforms/linux/build/quantization_cmd
./quantization_cmd [-h] [-p] [-m] [-i] [-b] [-w] [-n] [-s] [-c] <param>
命令参数 | 是否必须 | 带参数 | 参数说明 |
---|---|---|---|
-h, --help | 输出命令提示。 | ||
-p, --proto | ✅ | ✅ | 指定tnnproto模型描述文件。 |
-m, --model | ✅ | ✅ | 指定tnnmodel模型参数文件。 |
-i, --input_path | ✅ | ✅ | 指定量化输入文件夹路径。目前支持格式为: • 文本文件(文件后缀为.txt) • 常用图片格式文件(文件后缀为 .jpg .jpeg .png .bmp) 会将此目录下面的所有文件作为输入。 |
-b, --blob_method | ✅ | 指定feature map的量化方法: • 0 Min-Max方法(默认) • 2 KL方法 |
|
-w, --weight_method | ✅ | 指定weights的量化方法: • 0 Min-Max方法(默认) • 1 ADMM方法 |
|
-n, --bias | ✅ | 预处理,仅对输入为图片时起作用。对输入数据各通道进行bias操作,参数格式为:0.0,0.0,0.0 | |
-s, --scale | ✅ | 预处理,仅对输入为图片时起作用。对输入数据各通道进行scale操作,参数格式为:1.0,1.0,1.0 | |
-c, --merge_channel | ✅ | 在量化feature map的时候是否对所有通道一起计算,否则是各通道单独计算。 |
输入数据需要包括典型的输入,否则影响输出结果的精度,图片数量在20~50左右。
对图片的输入数据进行预处理,主要通过bias和scale参数进行。公式为:
input_pre = (input - bias) * scale
在执行命令的当前目录下会生成两个文件:
- model_quantized.tnnproto -- 量化后的模型描述文件;
- model_quantized.tnnmodel -- 量化后的模型参数文件;
(1)-n和-s参数仅对输入为图片的时候有作用;
(2)输入为图片时,内部会转为RGB格式进行处理;
(3)输入为txt时,输入数据存储方式是NCHW,且为float类型。存储格式为,一行存储一个数据,总共N*C*H*W行。例如,
0.01
1.1
0.1
255.0
...