编译模型时可以通过quant_config进行量化参数的配置,支持在model_config、op_config、node_config三个层面配置模型量化参数:
model_config:配置模型总体的量化参数,key是自定义名称。
op_config:配置某类算子的量化参数,key是算子的类型。
node_config:配置某个具体节点的量化参数,key是节点的名字。
配置时三个层面存在优先级关系,配置粒度越小优先级越高,即优先级model_config < op_config < node_config,当某个节点同时被多个维度配置时,优先级高的维度最终生效。
由于模型量化编译过程内部会对部分算子进行拆分融合等优化处理,因此可能会导致出现个别拆分算子名称无法和原始模型算子名称完全一致的情况。对于此类算子,在配置node_config时,算子名称应参考过程中生成的optimized_float_model.onnx模型中对应的算子名称。
支持配置 int8/int16/float16
三种计算精度数据类型,关于这三种数据类型的具体说明如下:
int8:大部分算子的默认量化类型,一般无需您主动进行配置。
int16:请参考下方 int16配置说明。
float16:配置为float16类型时,工具内部将仅配置该算子为float16计算精度类型。
对于float16数据类型:
我们不会对float16计算算子上下文算子进行计算广播更新。
不同计算平台对float16算子的支持范围不同,具体支持范围请参考 工具链算子支持约束列表。
如果您将不支持float16计算的算子配置为float16计算,我们会将其回退成float32类型进行计算。
一级参数 | 二级参数 | 参数类型 | 是否必填 | 说明 |
model_config | all_node_type | String | Optional | 一次性将模型中所有节点的输入设为指定类型,可选配置int16、float16。 |
model_output_type | String | Optional | 将模型的输出tensor设为指定类型,可选配置int8、int16。 |
一级参数 | 二级参数 | 三级参数 | 参数类型 | 是否必填 | 说明 |
op_config | NodeKind | qtype | String | Optional | 配置某一类型的节点的输入数据类型,可选配置int8、int16、float16、float32。 |
一级参数 | 二级参数 | 三级参数 | 参数类型 | 是否必填 | 说明 |
node_config | NodeName | qtype | String | Optional | 配置指定名称的节点的输入数据类型,可选配置int8、int16、float16、float32。 |
input0 | String | Optional | 配置指定名称的节点的第0个输入数据类型,可选配置int8、int16、float16、float32、ec。 | ||
input1 | String | Optional | 配置指定名称的节点的第1个输入数据类型,可选配置int8、int16、float16、float32、ec。 |
qtype, input0, input1均可以用来指定节点的输入数据类型。qtype通常用来指定节点的全部输入数据类型, input0/1用来指定节点的第0/1个输入的数据类型,并且input0/1优先级高于qtype。
ec全称为error compensate, 是一种通过创建相同算子来补偿特定算子int8量化精度损失的方案。当前仅支持如下算子, 其他算子配置不生效。
Conv和ConvTranspose算子的权重输入(通过node_config的三级参数input1指定)。
MatMul算子的任一输入(通过node_config的三级参数input0或input1指定)。
GridSample和Resize算子的第0个输入(通过node_config的三级参数input0指定)。
支持配置多种校准方法如kl、max等校准阈值统计方法,对于每种校准方法,也支持灵活控制该方法的具体超参配置(如果没有配置则使用默认参数),此外允许您配置一些如per_channel、asymmetric、bias_correction等独立量化功能。
若quant_config不进行任何配置,则默认会尝试多种校准方法并选择其中量化损失最小的校准方法。
一级参数 | 二级参数 | 三级参数 | 参数类型 | 是否必填 | 说明 |
model_config | activation | calibration_type | String/List[String] | Optional | 激活校准方法,可选配置kl、max,支持设置一个包含多组不同校准方法的List。 |
num_bin | Int/List[Int] | Optional | kl校准参数,要求num_bin > 128,默认值为1024,支持设置一个包含多组不同num_bin值的List。 | ||
max_num_bin | Int | Optional | kl校准参数,要求max_num_bin >= num_bin,默认值为16384。 | ||
max_percentile | Float/List[Float] | Optional | max校准参数,参数范围为[0.5, 1.0],默认值为1.0,支持设置一个包含多组不同max_percentile值的List。 | ||
per_channel | Bool/List[Bool] | Optional | per-channel量化开启与否,可选配置false、true,默认值为false,支持设置一个同时包含per-channel开启和关闭的List。 | ||
asymmetric | Bool/List[Bool] | Optional | 非对称量化开启与否,可选配置false、true,默认值为false,支持设置一个同时包含非对称开启和关闭的List。 |
一级参数 | 二级参数 | 三级参数 | 四级参数 | 参数类型 | 是否必填 | 说明 |
model_config | weight | bias_correction | num_sample | Int | Optional | 偏差校正的样本数量,要求num_sample >= 1,默认值为1。 |
metric | String | Optional | 偏差校正的模型误差度量方法,可选参数cosine-similarity、mse、mae、mre、sqnr以及chebyshev,默认值cosine-similarity。 |
支持两种不同粒度的校准参数搜索方法:
modelwise_search:在模型层面对量化参数进行搜索,该方法允许一次性配置多种校准方法,通过比较量化前后模型输出的量化损失metric(可配置),找到一个量化损失最小的校准方法。
layerwise_search:在节点层面对量化参数进行搜索,该方法会根据每个节点量化前后模型输出,计算量化损失metric(可配置),为该节点分配量化损失最小的校准方法。
如果配置了多个校准方法,会默认启动modelwise搜索,从多个候选校准模型中找出最优的量化模型;并从中找出最优的校准方法如果配置了layerwise参数,则启动layerwise搜索方法,逐层搜索最优的量化参数。
一级参数 | 二级参数 | 三级参数 | 参数类型 | 是否必填 | 说明 |
model_config | modelwise_search | metric | String | Optional | modelwise搜索的模型误差度量方法,可选参数cosine-similarity、mse、mae、mre、sqnr以及chebyshev,默认值cosine-similarity。 |
一级参数 | 二级参数 | 三级参数 | 参数类型 | 是否必填 | 说明 |
model_config | layerwise_search | metric | String | Optional | layerwise搜索的模型误差度量方法,可选参数cosine-similarity、mse、mae、mre、sqnr以及chebyshev,默认值cosine-similarity。 |
如下所示为quant_config的json模板配置示例,包含所有可配置选项,您可参考此模板进行配置。
在模型转换的过程中,模型中的大部分算子都会被量化到int8进行计算,而通过配置 quant_config
参数,
可以详细指定某个op的输入/输出数据类型为int16计算(具体支持的算子范围可参考 工具链算子支持约束列表,基本原理如下:
在您配置了某个op输入/输出数据类型为int16后,模型转换内部会自动进行op输入输出上下文(context)int16配置的更新和检查。 例如,当配置op_1输入/输出数据类型为int16时,实际上潜在同时指定了op_1的上/下一个op需要支持以int16计算。 对于不支持的场景,模型转换工具会打印log提示该int16配置组合暂时不被支持并回退到int8计算。