---
title: 手工调优
description: "执行训练后量化特性的精度如果不满足要求，可以尝试手动调整config.json文件中的参数，本节给出调整的原则，以及参数解释。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/devaids/amct/atlasamct_16_0146.html
sourcePath: /source/zh/canncommercial/900/devaids/amct/atlasamct_16_0146.html
indexId: ba753aa85d543d55d7203c22645cfe30100e3de04a36e2d474c61bf172f1db6965
---
# 手工调优

执行训练后量化特性的精度如果不满足要求，可以尝试手动调整config.json文件中的参数，本节给出调整的原则，以及参数解释。

#### 调优流程

通过create_quant_config接口生成的config.json文件中的默认配置进行量化，若量化后的推理精度不满足要求，则可调整量化配置重复量化，直至精度满足要求。本节详细介绍手动调优流程，调整对象是训练后量化配置文件config.json中的参数，主要涉及3个阶段：

1. 调整校准使用的数据量。
2. 跳过量化某些层。
3. 调整量化算法及参数。

具体步骤如下：

1. 根据create_quant_config接口生成的默认配置进行量化。若精度满足要求，则调参结束，否则进行2。
2. 手动修改batch_num，调整校准使用的数据量。
  batch_num控制量化使用数据的batch数目，可根据batch大小以及量化需要使用的图片数量调整。通常情况下：

  batch_num越大，量化过程中使用的数据样本越多，量化后精度损失越小；但过多的数据并不会带来精度的提升，反而会占用较多的内存，降低量化的速度，并可能引起内存、显存、线程资源不足等情况；因此，建议batch_num*batch_size为16或32（batch_size表示每个batch使用的图片数量）。

3. 若按照2中的量化配置进行量化后，精度满足要求，则调参结束，否则进行4。
4. 手动修改quant_enable，跳过量化某些层。
quant_enable可以指定该层是否量化，取值为true时量化该层，取值为false时不量化该层，将该层的配置删除也可跳过该层量化。
在整网精度不达标的时候需要识别出网络中的量化敏感层（量化后误差显著增大），然后取消对量化敏感层的量化动作，识别量化敏感层有两种方法：

  a. 依据网络模型结构，一般网络中首层、尾层以及参数量偏少的层，量化后精度会有较大的下降。
  b. 通过精度比对工具，逐层比对原始模型和量化后模型输出误差（例如以余弦相似度作为标准，需要相似度达到0.99以上），找到误差较大的层，优先对其进行回退。
5. 若按照4中的量化配置进行量化后，精度满足要求，则调参结束，否则进行6。
6. 手动修改activation_quant_params和weight_quant_params，调整量化算法及参数：
  算法参数意义请参见量化配置文件中的参数说明部分，算法说明请参见压缩算法。

7. 若按照6中的量化配置进行量化后，精度满足要求，则调参结束，否则表明量化对精度影响很大，不能进行量化，去除量化配置。

图1 调参流程


#### 量化配置文件

如果通过create_quant_config接口生成的config.json量化配置文件，推理精度不满足要求，则需要参见该章节不断调整config.json文件中的内容（用户修改JSON文件时，请确保层名唯一），直至精度满足要求，json量化配置文件样例请参见接口中的调用示例部分。

配置文件中参数说明如下：


**表1 version参数说明**

| 作用 | 控制量化配置文件版本号 |
| --- | --- |
| 类型 | int |
| 取值范围 | 1 |
| 参数说明 | 目前仅有一个版本号1。 |
| 推荐配置 | 1 |
| 可选或者必选 | 可选 |


**表2 batch_num参数说明**

| 作用 | 控制量化使用多少个batch的数据。 |
| --- | --- |
| 类型 | int |
| 取值范围 | 大于0 |
| 参数说明 | 如果不配置，则使用默认值1，建议校准集图片数量不超过50张，根据batch的大小batch\_size计算相应的batch\_num数值。 batch\_num\*batch\_size为量化使用的校准集图片数量。 其中batch\_size为每个batch所用的图片数量。 |
| 推荐配置 | 1 |
| 必选或可选 | 可选 |


**表3 activation_offset参数说明**

| 作用 | 控制数据量化是对称量化还是非对称量化。全局配置参数。 若配置文件中同时存在activation\_offset和asymmetric参数，asymmetric参数优先级>activation\_offset参数。 |
| --- | --- |
| 类型 | bool |
| 取值范围 | true或false |
| 参数说明 | true：数据量化时为非对称量化。 false：数据量化时为对称量化。 |
| 推荐配置 | true |
| 必选或可选 | 可选 |


**表4 joint_quant参数说明**

| 作用 | 是否进行Eltwise联合量化。 |
| --- | --- |
| 类型 | bool |
| 取值范围 | true或false |
| 参数说明 | true：进行Eltwise联合量化。 false：关闭联合量化功能。 |
| 推荐配置 | false |
| 必选或可选 | 可选 |


**表5 do_fusion参数说明**

| 作用 | 是否开启融合功能。 |
| --- | --- |
| 类型 | bool |
| 取值范围 | true或false |
| 参数说明 | true：开启融合功能。 false：不开启融合功能。 当前仅支持Conv+BN融合。 |
| 推荐配置 | true |
| 可选或必选 | 可选 |


**表6 skip_fusion_layers参数说明**

| 作用 | 跳过可融合的层。 |
| --- | --- |
| 类型 | string |
| 取值范围 | 可融合层的层名。当前仅支持Conv+BN融合。 |
| 参数说明 | 不需要做融合的层。 |
| 推荐配置 | \- |
| 可选或必选 | 可选 |


**表7 layer_config参数说明**

| 作用 | 指定某个网络层的量化配置。 |
| --- | --- |
| 类型 | object |
| 取值范围 | \- |
| 参数说明 | 参数内部包含如下参数： quant\_enable activation\_quant\_params weight\_quant\_params |
| 推荐配置 | \- |
| 必选或可选 | 可选 |


**表8 quant_enable参数说明**

| 作用 | 该层是否做量化。 |
| --- | --- |
| 类型 | bool |
| 取值范围 | true或false |
| 参数说明 | true：量化该层。 false：不量化该层。 |
| 推荐配置 | true |
| 必选或可选 | 可选 |


**表9 dmq_balancer_param参数说明**

| 作用 | DMQ均衡算法中的迁移强度。 |
| --- | --- |
| 类型 | float |
| 取值范围 | [0.2, 0.8] |
| 参数说明 | 代表将activation数据上的量化难度迁移至weight权重的程度，数据分布的离群值越大迁移强度应设置较小。 |
| 推荐配置 | 0.5 |
| 必选或可选 | 可选 |


**表10 activation_quant_params参数说明**

| 作用 | 该层数据量化的参数。 |
| --- | --- |
| 类型 | object |
| 取值范围 | \- |
| 参数说明 | activation\_quant\_params内部包含如下参数，IFMR算法相关参数与HFMG算法相关参数在同一层中不能同时出现： IFMR数据量化算法涉及参数： max\_percentile min\_percentile search\_range search\_step act\_algo num\_bits asymmetric HFMG数据量化算法涉及参数： act\_algo num\_of\_bins num\_bits asymmetric |
| 推荐配置 | \- |
| 必选或可选 | 可选 |


**表11 weight_quant_params参数说明**

| 作用 | 该层权重量化的参数。 |
| --- | --- |
| 类型 | object |
| 取值范围 | \- |
| 参数说明 | 包括如下参数： num\_bits wts\_algo channel\_wise |
| 推荐配置 | \- |
| 必选或可选 | 可选 |


**表12 num_bits参数说明**

| 作用 | 量化位宽。 |
| --- | --- |
| 类型 | int |
| 取值范围 | 8或16 |
| 参数说明 | 当前仅支持配置为8，表示采用INT8量化位宽。 |
| 推荐配置 | \- |
| 必选或可选 | 必选 |


**表13 act_algo参数说明**

| 作用 | 数据量化算法。 |
| --- | --- |
| 类型 | string |
| 取值范围 | ifmr或者hfmg |
| 参数说明 | IFMR数据量化算法：ifmr HFMG数据量化算法：hfmg |
| 推荐配置 | \- |
| 必选或可选 | 可选 |


**表14 asymmetric参数说明**

| 作用 | 控制数据量化是对称量化还是非对称量化。用于控制逐层量化算法的选择。 若配置文件中同时存在activation\_offset和asymmetric参数，asymmetric参数优先级>activation\_offset参数。 |
| --- | --- |
| 类型 | bool |
| 取值范围 | true或false |
| 参数说明 | true：数据量化时为非对称量化。 false：数据量化时为对称量化。 |
| 推荐配置 | true |
| 必选或可选 | 可选 |


**表15 max_percentile参数说明**

| 作用 | IFMR数据量化算法中，最大值搜索位置参数。 |
| --- | --- |
| 类型 | float |
| 取值范围 | (0.5,1] |
| 参数说明 | 在从大到小排序的一组数中，决定取第多少大的数，比如有100个数，1.0表示取第100\-100\*1.0=0，对应的就是第一个大的数。 对待量化的数据做截断处理时，该值越大，说明截断的上边界越接近待量化数据的最大值。 |
| 推荐配置 | 0.999999 |
| 必选或可选 | 可选 |


**表16 min_percentile参数说明**

| 作用 | IFMR数据量化算法中，最小值搜索位置参数。 |
| --- | --- |
| 类型 | float |
| 取值范围 | (0.5,1] |
| 参数说明 | 在从小到大排序的一组数中，决定取第多少小的数，比如有100个数，1.0表示取第100\-100\*1.0=0，对应的就是第一个小的数。 对待量化的数据做截断处理时，该值越大，说明截断的下边界越接近待量化数据的最小值。 |
| 推荐配置 | 0.999999 |
| 必选或可选 | 可选 |


**表17 search_range参数说明**

| 作用 | IFMR数据量化算法中，控制量化因子的搜索范围[search\_range\_start, search\_range\_end]。 |
| --- | --- |
| 类型 | list，列表中两个元素类型为float。 |
| 取值范围 | 0<search\_range\_start<search\_range\_end |
| 参数说明 | 控制截断的上边界的浮动范围。 search\_range\_start：决定搜索开始的位置。 search\_range\_end：决定搜索结束的位置。 |
| 推荐配置 | [0.7,1.3] |
| 必选或可选 | 可选 |


**表18 search_step参数说明**

| 作用 | IFMR数据量化算法中，控制量化因子的搜索步长。 |
| --- | --- |
| 类型 | float |
| 取值范围 | (0, (search\_range\_end\-search\_range\_start)] |
| 参数说明 | 控制截断的上边界的浮动范围步长，值越小，浮动步长越小。 |
| 推荐配置 | 0.01 |
| 必选或可选 | 可选 |


**表19 num_of_bins参数说明**

| 作用 | HFMG数据量化算法用于调整直方图的bin（直方图中的一个最小单位直方图形）数目。 |
| --- | --- |
| 类型 | unsigned int |
| 取值范围 | {1024, 2048, 4096, 8192} |
| 参数说明 | num\_of\_bins数值越大，直方图拟合原始数据分布的能力越强，可能获得更佳的量化效果，但训练后量化过程的耗时也会更长。 |
| 推荐配置 | 4096 |
| 必选或可选 | HFMG算法量化场景下，该参数可选。 |


**表20 wts_algo参数说明**

| 作用 | 权重量化算法 |
| --- | --- |
| 类型 | string |
| 取值范围 | arq\_quantize |
| 参数说明 | ARQ权重量化算法：arq\_quantize |
| 推荐配置 | \- |
| 必选或可选 | 可选 |


**表21 channel_wise搜索相关参数说明**

| 作用 | ARQ权重量化算法中，是否对每个channel采用不同的量化因子。 |
| --- | --- |
| 类型 | bool |
| 取值范围 | true或false |
| 参数说明 | true：每个channel独立量化，量化因子不同。 false：所有channel同时量化，共享量化因子。 |
| 推荐配置 | true |
| 必选或可选 | 可选 |


**表22 tensor_quantize参数说明**

| 作用 | 指定某个网络层的量化配置。 |
| --- | --- |
| 类型 | object |
| 取值范围 | \- |
| 参数说明 | 参数内部包含如下参数： layer\_name input\_index activation\_quant\_params |
| 推荐配置 | \- |
| 必选或可选 | 可选 |


**表23 layer_name参数说明**

| 作用 | 需要对节点输入Tensor进行训练后量化的节点名称。 |
| --- | --- |
| 类型 | string |
| 取值范围 | \- |
| 参数说明 | 当前仅支持对MaxPool算子的输入Tensor进行量化。 |
| 推荐配置 | \- |
| 必选或可选 | 必选 |


**表24 input_index参数说明**

| 作用 | 需要对节点输入Tensor进行训练后量化的节点的输入索引。 |
| --- | --- |
| 类型 | uint32 |
| 取值范围 | \- |
| 参数说明 | 节点的输入索引。 |
| 推荐配置 | \- |
| 必选或可选 | 必选 |
