基于前文的精度评估,您可能发现精度的评估结果不及预期。 本章节内容为您介绍,在您通过PTQ链路进行模型转换过程中出现量化精度损失时, 如何通过精度调优工具和功能进行精度调优以减少量化精度损失或协助您定位量化精度损失的原因。
下文所指量化精度调优均指前文所述的量化过程中生成的 calibrated_model.onnx 量化精度调优。
您可通过调整量化方法或者计算精度来进行模型精度的调优,方法参考如下:
可以通过配置不同的校准方法、量化参数搜索方法,或者尝试对独立量化功能进行配置来尝试对模型量化方法进行调整:
校准方法配置
您可以尝试调整模型校准方法,如尝试kl、max等校准方法配置,配置方法可参考 quant_config说明 章节的介绍。
量化参数搜索配置
支持两种不同粒度的校准参数搜索方法:
modelwise_search:在模型层面对量化参数进行搜索,该方法允许一次性配置多种校准方法,通过比较量化前后模型输出的量化损失metric(可配置),找到一个量化损失最小的校准方法。
layerwise_search:在节点层面对量化参数进行搜索,该方法会根据每个节点量化前后模型输出,计算量化损失metric(可配置),为该节点分配量化损失最小的校准方法。
配置方法可参考 quant_config说明 章节的介绍。
独立量化功能配置
开启独立量化模式可以减少计算资源的占用,您可以尝试对per_channel,asymmetric,bias_correction参数进行配置,配置方法可参考 quant_config说明 章节的介绍。
除量化方法的配置外,可尝试对模型算子的计算精度(dtype)进行配置来尝试精度调优,当前支持由model,op_type,op_name三个层面对算子的计算精度进行配置,支持的配置类型包括int8、int16、float16及float32, 配置方法可参考 quant_config说明 章节的介绍。
如您想定位量化精度损失的具体是由哪些算子导致的,我们还为您提供了精度debug工具协助您定位,工具使用方法可参考 精度debug工具 章节的介绍。
基于我们过往对典型模型精度调优过程的经验积累,下方我们为您提供了一个兼顾易用性和实用性的精度调优流程:
调优流程图详细说明如下:
| 调整域 | 阶段目标 | 详细工作说明 | 辅助功能 |
| 默认int8量化模型精度 | 明确int8量化精度是否满足预期。 | 不对量化参数做任何配置,使用默认int8量化进行模型转换,测试模型量化精度,评估是否满足要求。 |
|
| 混合精度量化调优 | 明确模型精度上限是否满足要求,确定后续使用哪种类型的混合精度完成调优。 | 通过quant_config配置all_node_type为int16,尝试将模型中所有节点尽可能配置为int16计算,获取该模型在int16时的精度上限,满足要求后进行int8+int16混合精度调优。 | |
| 通过误差补偿提升全int16精度,修改全int16校准模型中Conv、ConvTranspose算子的权重、MatMul、GridSample、Resize的输入为int16,测试模型精度上限,满足要求后进行全int16精度优化。 | |||
| 通过quant_config配置all_node_type为float16,获取模型精度上限,满足要求后进行int16+float16混合精度调优。 | |||
| 配置all_node_type为float16后,模型精度仍无法满足要求,进行float16+float32混合精度调优。 | |||
| 通过显性指定算子的计算精度,完成混合精度精调。 | int8+int16混合精度调优:使用精度debug工具分析int8校准模型量化损失高的节点,并通过quant_config配置其为高精度int16计算,完成量化精度调优,int8+int16混合精度可以使用all_node_type=int16配置时系统自动选择的校准方法。 | ||
| 全int16精度优化:配置all_node_type为int16后,受硬件约束及推理耗时影响,模型中仍会存在int8量化节点,包括:Conv、ConvTranspose权重、Resize、GridSample以及MatMul的第2个输入。首先通过修改全int16校准模型的方式,将校准节点数据类型从int8改为int16,若精度满足要求,接着在quant_config中配置部分节点输入为ec,实现int8量化损失的补偿,不过配置ec的量化精度会略差于int16。 | |||
| int16+float16混合精度调优:使用精度debug工具分析全int16校准模型量化损失高的节点或者结构,确定最少使用的float16节点,并在quant_config配置其为float16计算,完成量化精度调优。 | |||
| float16+float32混合精度调优:使用精度debug工具分析全float16校准模型量化损失高的节点或者结构,确定最少使用的float32节点,并在quant_config配置其为float32计算。若对推理耗时有要求,可尝试QAT训练。 | |||
如果使用debug工具设置敏感节点为高精度不能有效提升模型精度,可以通过分析模型结构,尝试将量化损失风险较大的典型算子或子结构设为高精度:
|