基础知识
工具链用户手册中提供了profiler debug工具的使用教程,对于常规流程,大家可参考官方用户手册。本文主要基于一些典型场景进行使用上的介绍。
在出现精度问题时,且排除前后处理问题后,可以使用profiler debug工具进行分析,排查过程中,涉及到几种模型,这里先做说明:
模型 | 说明 | 获取方法 |
float.pt | torch float 模型 | 浮点模型 |
calib.pt | torch calib 模型 | 对插入quant/dequant后的浮点模型使用 prepare 接口 |
qat.pt | torch qat 模型 | 对插入quant/dequant后的浮点模型使用 prepare 接口 |
qat_export.pt
| torch qat export 模型。相比于qat.pt 做了查表算子定点化。 相比于qat.bc,计算逻辑一致,依旧为torch模型,可用gpu推理加速 | qat_pt要先validation和eval,再去pre_export |
qat.bc | 导出产生的 hbir 模型 | |
quantized.bc | 转换产生的 hbir 模型 |
|
profiler debug工具使用场景
当calib精度不符合预期时,可以使用profiler debug工具进行float_model vs calib_model的debug。
当定位精度损失发生在export / convert阶段时,优先尝试高一致性策略。若依旧不行,可以使用profiler debug工具对比:
qat_pt vs pre_export_pt
pre_export_pt vs quantized_bc
下面先介绍高一致性 QAT 策略,再通过一个case介绍profiler debug工具的使用方法。
高一致性 QAT 策略【beta功能】
高一致性策略对查表转定点无影响,主要影响convert前后的一致性
- level0全局开启会对latency有负面影响,大约10~20%,甚至出现过40%的情况
- level2对latency有正面收益,推荐优先使用level2
高一致性策略仅适用于J6EM
- 实现方式未来会进行优化,请大家使用时关注用户手册《QAT-训练部署一致性-高一致性 QAT 策略》章节
高一致性策略封装在 horizon_plugin_pytorch.qat_mode.ConsistencyStrategy 下,可以使用 set_consistency_level 接口设置策略。
当前支持五个等级( 0 - 4 )的策略,等级越高,一致性越好,但 QAT 精度可能受到轻微影响。推荐直接使用 level 2,在绝大多数情况下对 QAT 精度无影响,甚至可以改善因截断误差引起的精度问题,对性能和一致性有正收益。
level2 在convert阶段,linear与conv会有一个scale的误差,其它op是对齐的
level4 在convert阶段,linear与conv也会有一个scale的误差,但概率会降低到万分之几
linear与conv将bias去掉,level4 在convert阶段将没有误差
profiler debug工具用法
calib产生的误差
float精度与可视化正常,calib精度差很多,运行该阶段debug
pre_export 转查表 产生的误差
export 非转查表 产生的误差
convert产生的误差
profiler debug工具实例
标准实例
全流程示例代码如下,注意区分不同阶段的输入是什么、不同debug时的配置参数是什么。
input中存在“task”字符串

在float推理时,给的example_input示例如下:

思考:
float+calib+export阶段需要有task输入,这是为了知道运行哪些任务
进行float vs calib 的debug时,浮点模型结构,需要知道运行哪儿,输入需要加task
进行qat.bc vs quantized.bc的debug时,bc模型结构已确定,bc的输入中不包含task参数,所以输入不能加task

全流程示例代码如下,注意区分不同阶段的输入是什么、不同debug时的配置参数是什么。
后处理添加与去除
debug时如何添加后处理
debug分析时,经常会遇到模型后处理应该怎么办的问题,相关的介绍如下:

如果希望将后处理带在debug工具中,可参考如下写法:


后处理封装为一个class时,对应的示例代码如下:
上述示例对应的产出物中,会有对应后处理的相关信息:


