量化配置
简介
如果通过create_quant_config接口生成的config.json量化配置文件,推理精度不满足要求,则需要参见该章节不断调整config.json文件中的内容,直至精度满足要求,该文件部分内容样例如下:
{ "version": 1, "batch_num": 30, "activation_offset": true, "do_fusion":true, "skip_fusion_layers":[], "layer_name1":{ "quant_enable": false, "activation_quant_params":[ { "max_percentile":0.999999, "min_percentile":0.999999, "search_range":[0.7, 1.3], "search_step":0.01 } ], "weight_quant_params":[ { "channel_wise":true } ] }, "layer_name2":{ "quant_enable": true, "activation_quant_params":[ { "max_percentile":0.999999, "min_percentile":0.999999, "search_range":[0.7, 1.3], "search_step":0.01 } ], "weight_quant_params":[ { "channel_wise":true } ] } }
参数配置说明
配置文件中参数说明如下:
作用 |
控制量化配置文件版本号 |
---|---|
类型 |
int |
取值范围 |
1 |
参数说明 |
目前仅有一个版本号1。 |
推荐配置 |
1 |
可选或者必选 |
可选 |
作用 |
控制量化使用多少个batch的数据。 |
---|---|
类型 |
int |
取值范围 |
大于0 |
参数说明 |
如果不配置,则使用默认值1,建议校准集图片数量不超过50张,根据batch的大小batch_size计算相应的batch_num数值。 batch_num*batch_size为量化使用的校准集图片数量。 其中batch_size为每个batch所用的图片数量。 |
推荐配置 |
1 |
必选或可选 |
可选 |
作用 |
控制数据量化是否带offset。 |
---|---|
类型 |
bool |
取值范围 |
true或false |
参数说明 |
取值为true数据量化时带offset,取值为false数据量化时不带offset。 |
推荐配置 |
true |
必选或可选 |
可选 |
作用 |
是否开启bn融合功能。 |
---|---|
类型 |
bool |
取值范围 |
true或false |
参数说明 |
取值为true开启bn融合,取值为false不开启。 |
推荐配置 |
true |
可选或必选 |
可选 |
作用 |
跳过bn融合的层。 |
---|---|
类型 |
string |
取值范围 |
可融合层的层名,当前仅支持Conv+BN融合、Depthwise_Conv+BN融合、Group_conv+BN融合。 |
参数说明 |
不需要做融合的层。 |
推荐配置 |
- |
可选或必选 |
可选 |
作用 |
指定某个网络层的量化配置。 |
---|---|
类型 |
object |
取值范围 |
无 |
参数说明 |
参数内部包含如下参数:
|
推荐配置 |
无 |
必选或可选 |
可选 |
作用 |
该层是否可量化。 |
---|---|
类型 |
bool |
取值范围 |
true或false |
参数说明 |
取值为true时量化该层,取值为false时不量化该层。 |
推荐配置 |
true |
必选或可选 |
可选 |
作用 |
该层数据量化的参数。 |
---|---|
类型 |
object |
取值范围 |
无 |
参数说明 |
activation_quant_params内部包含如下参数:
|
推荐配置 |
无 |
必选或可选 |
可选 |
作用 |
该层权重量化的参数。 |
---|---|
类型 |
object |
取值范围 |
无 |
参数说明 |
weight_quant_params内部包含如下参数: channel_wise |
推荐配置 |
无 |
必选或可选 |
可选 |
作用 |
最大值搜索位置。 |
---|---|
类型 |
float |
取值范围 |
(0.5,1] |
参数说明 |
在从大到小排序的一组数中,决定取第多少大的数,比如有100个数,1.0表示取第100-100*1.0=0,对应的就是第一个大的数。 对待量化的数据做截断处理时,该值越大,说明截断的上边界越接近待量化数据的最大值。 |
推荐配置 |
0.999999 |
必选或可选 |
可选 |
作用 |
最小值搜索位置。 |
---|---|
类型 |
float |
取值范围 |
(0.5,1] |
参数说明 |
在从小到大排序的一组数中,决定取第多少小的数,比如有100个数,1.0表示取第100-100*1.0=0,对应的就是第一个小的数。 对待量化的数据做截断处理时,该值越大,说明截断的下边界越接近待量化数据的最小值。 |
推荐配置 |
0.999999 |
必选或可选 |
可选 |
作用 |
控制量化因子的搜索范围[search_range_start, search_range_end]。 |
---|---|
类型 |
list,列表中两个元素类型为float。 |
取值范围 |
0<search_range_start<search_range_end |
参数说明 |
控制截断的上边界的浮动范围。
|
推荐配置 |
[0.7,1.3] |
必选或可选 |
可选 |
作用 |
控制量化因子的搜索步长。 |
---|---|
类型 |
float |
取值范围 |
(0, (maxval-minval)] |
参数说明 |
控制截断的上边界的浮动范围步长,值越小,浮动步长越小。 |
推荐配置 |
0.01 |
必选或可选 |
可选 |
作用 |
是否对每个channel采用不同的量化因子。 |
---|---|
类型 |
bool |
取值范围 |
true或false |
参数说明 |
|
推荐配置 |
true |
必选或可选 |
可选 |
参数调优说明
按照config.json文件中的默认配置进行量化,若量化后的推理精度不满足要求,则按照如下步骤调整量化配置文件中的参数。
- 执行amct_tensorflow_sample.tar.gz包中的量化脚本,根据create_quant_config接口生成的默认配置进行量化。
- 若根据1中的默认配置进行量化后,精度满足要求,则调参结束,否则进行3。
- 手动调整量化配置文件中的batch_num:
batch_num控制量化使用数据的batch数目,可根据batch的大小以及量化需要使用的图片数量调整。通常情况下,量化过程中使用的数据样本越多,量化后精度损失越小,但过多的数据并不会带来精度的提升,反而会占用较多的内存,降低量化的速度,并可能引起内存、显存、线程资源不足等情况。因此,建议batch_num*batch_size为16或32。
- 若按照3中的量化配置进行量化后,精度满足要求,则调参结束,否则进行5。
- 手动调整量化配置文件中的quant_enable:
quant_enable可以指定该层是否量化,取值为true时量化该层,取值为false时不量化该层,将该层及配置删除也可不量化该层。通常情况下,量化层数目越少,量化后精度越高。某些层对量化比较敏感,比如说首层、尾层、detphwise卷积层以及参数量偏少的层,量化后精度会有较大的下降,可按照精度情况调整量化层。
- 若按照5中的量化配置进行量化后,精度满足要求,则调参结束,否则进行7。
- 手动调整量化配置文件中的activation_quant_params和weight_quant_params:
- activation_quant_params列表中的参数用于选取待量化数据的范围[left, right],不在该范围的数据将会被截断到范围内。通常情况下,数据分布处于边界附近的数值比较稀疏,均可做截断处理,以提高量化精度。min_percentile (max_percentile)越大,说明截断left(right)越靠近待量化数据的最小值(最大值)。search_range与search_step影响[left, right]的浮动范围,通常情况下,search_range越大、search_step越小,可能获得更高的量化精度,但量化耗时更多。
- weight_quant_params中的channel_wise控制权重量化时每个channel是否采用不同的量化因子,取值为true时,每个channel独立量化,量化因子不同;取值为false时所有channel同时量化,共享同一个量化因子。通常情况下,每个channel独立量化,量化后的精度会比较高,推荐使用。但全连接层和平均下采样层Pooling没有channel,修改该参数不起作用。
- 若按照7中的量化配置进行量化后,精度满足要求,则调参结束,否则表明量化对精度影响很大,不能进行量化,去除量化配置。