引言
配置形式
方式1:
quant_config: './quant_config.json'
方式2:
quant_config: { // 配置模型层面的参数 "model_config": { // 一次性配置所有节点的输入数据类型 "all_node_type": "int16"/"float16", // 配置模型输出的数据类型 "model_output_type": "int8"/"int16", } }
但是,如果量化配置较为复杂,在 yaml 中直接写 dict 的方式 2 会显得冗长,建议直接采用方式 1 于 json 文件中进行配置。
quant_config参数解析及配置示例
支持三个粒度的量化配置
quant_config支持在model_config、op_config、node_config三个粒度进行模型量化参数的配置,优先级为
node_config>op_config>model_config。
这3个粒度的详解如下:
model_config

json配置示例:
{ // 配置模型层面的参数 "model_config": { // 一次性配置所有节点的输入数据类型为int1 "all_node_type": "int16", // 配置模型输出的数据类型为int8/int16 "model_output_type": "int16", } }
op_config
op_config为配置某类算子的量化参数,其二级参数是算子的类型,Conv,MatMul等,详细说明如下:

json配置示例:
{ // 配置算子类型层面的参数 "op_config": { // 配置模型中所有conv节点的输入数据类型为int16 "Conv": {"qtype": "int16"}, // 配置模型中所有matmul节点的输入数据类型为int8 "MatMul": {"qtype": "int8"} } }
node_config

json配置示例:
{ // 配置算子类型层面的参数 "node_config": { // 配置某个节点的输入数据类型 "MatMul_69": {"qtype": "int16"}, "MatMul_1": {"qtype": "float32"} }
应用场景示例
在量化精度调优中,假设存在这样一个模型,即满足以下条件:
全int16量化精度符合预期;
工具默认的全int8精度不符合预期;
在全int8量化下使用精度debug工具后,发现部分算子对激活非常敏感;
在这样的场景下,我们就可以按照敏感度排序,将部分算子配置为int16,那么可以这样配置json文件,如下所示:
{ // 配置算子类型层面的参数 "node_config": { // 配置敏感节点的输入数据类型为int16 "MatMul_69": {"qtype": "int16"}, "MatMul_60": {"qtype": "float32"}, "Conv_5": {"qtype": "int16"}, "Conv_35": {"qtype": "float32"} #当精度仍然不满足预期时,可以适当增加int16算子的数量 } }
注意事项
- 当配置了某个op输入/输出数据类型为int16后,模型转换内部会自动进行op输入输出上下文(context)int16配置的更新和检查。 例如,当配置op_1输入/输出数据类型为int16时,实际上潜在同时指定了op_1的上/下一个op需要支持以int16计算。 对于不支持的场景,hb_compile工具会打印log提示该int16配置组合暂时不被支持并回退到int8计算。
json文件中最后一行的配置不能有逗号,否则工具会报错,如下所示:
错误配置方式:
{ "node_config": { // 配置某个节点的输入数据类型 "MatMul_69": {"qtype": "int16"}, #此行结束不应该有, "MatMul_1": {"qtype": "float32"}, } }
报错信息:

