专栏算法工具链J6工具链PTQ quant_config参数解读-1

J6工具链PTQ quant_config参数解读-1

求助中
momo(社区版)2024-11-28
6
0

引言

为了更加灵活地支持多种量化配置,J6 PTQ工具链的yaml 校准参数组中新增了quant_config参数,本文将结合应用实例说明此参数的丰富用法。

配置形式

quant_config参数不仅直接支持在yaml中书写配置的dict,还支持配置json文件路径,此json文件由量化配置dict组成。两种方式如下所示:

方式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

model_config为配置整个模型的量化参数,其二级参数包括all_node_type和model_output_type,详细说明如下:

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

node_config为配置某个具体节点的量化参数,其二级参数是onnx模型中算子的name,详细说明如下:

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算子的数量 } }

 

注意事项

  1. 当配置了某个op输入/输出数据类型为int16后,模型转换内部会自动进行op输入输出上下文(context)int16配置的更新和检查。 例如,当配置op_1输入/输出数据类型为int16时,实际上潜在同时指定了op_1的上/下一个op需要支持以int16计算。 对于不支持的场景,hb_compile工具会打印log提示该int16配置组合暂时不被支持并回退到int8计算。
  2. json文件中最后一行的配置不能有逗号,否则工具会报错,如下所示:

错误配置方式:

{ "node_config": { // 配置某个节点的输入数据类型 "MatMul_69": {"qtype": "int16"}, #此行结束不应该有, "MatMul_1": {"qtype": "float32"}, } }

报错信息:

 

算法工具链
征程6技术深度解析
评论0
0/1000