专栏算法工具链【J6】profiler debug工具用法与高一致性策略

【J6】profiler debug工具用法与高一致性策略

Jade-self2025-10-10
98
0

基础知识

工具链用户手册中提供了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功能】

 

注意
  1. 高一致性策略对查表转定点无影响,主要影响convert前后的一致性

  2. level0全局开启会对latency有负面影响,大约10~20%,甚至出现过40%的情况
  3. level2对latency有正面收益,推荐优先使用level2
  4. 高一致性策略仅适用于J6EM

  5. 实现方式未来会进行优化,请大家使用时关注用户手册《QAT-训练部署一致性-高一致性 QAT 策略》章节

高一致性策略封装在 horizon_plugin_pytorch.qat_mode.ConsistencyStrategy 下,可以使用 set_consistency_level 接口设置策略。

当前支持五个等级( 0 - 4 )的策略,等级越高,一致性越好,但 QAT 精度可能受到轻微影响。推荐直接使用 level 2,在绝大多数情况下对 QAT 精度无影响,甚至可以改善因截断误差引起的精度问题,对性能和一致性有正收益。

对于未使用高一致性策略得到的 QAT 模型,如果希望不重训获得一致性更高的定点模型,可以在prepare export模型前设置一致性策略等级为 0(不重训的情况下只有level 0有效,level 1 - 4 需要设置等级后重训模型)。

level2 在convert阶段,linear与conv会有一个scale的误差,其它op是对齐的

level4 在convert阶段,linear与conv也会有一个scale的误差,但概率会降低到万分之几

linear与conv将bias去掉,level4 在convert阶段将没有误差

 

profiler debug工具用法

calib产生的误差

float精度与可视化正常,calib精度差很多,运行该阶段debug

pre_export 转查表 产生的误差

qat_pt精度与可视化正常,pre_export_pt 精度 与 可视化不正常,运行该阶段的debug

export 非转查表 产生的误差

pre_export_pt精度与可视化正常,qat_bc 可视化不正常,运行该阶段的debug

convert产生的误差

pre_export_pt精度与可视化正常,qat_bc可视化正常,quantized.bc精度与可视化不正常,运行该阶段的debug

profiler debug工具实例

标准实例

全流程示例代码如下,注意区分不同阶段的输入是什么、不同debug时的配置参数是什么。

input中存在“task”字符串

模型输入形式 inputs:dict[str, tensor] + task:list[str],task只用于决定模型forward走什么任务,实际并不会作为最终部署的输入

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

思考:

  1. float+calib+export阶段需要有task输入,这是为了知道运行哪些任务

  2. 进行float vs calib 的debug时,浮点模型结构,需要知道运行哪儿,输入需要加task

  3. 进行qat.bc vs quantized.bc的debug时,bc模型结构已确定,bc的输入中不包含task参数,所以输入不能加task

全流程示例代码如下,注意区分不同阶段的输入是什么、不同debug时的配置参数是什么。

后处理添加与去除

debug时如何添加后处理

debug分析时,经常会遇到模型后处理应该怎么办的问题,相关的介绍如下:

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

 

后处理封装为一个class时,对应的示例代码如下:

上述示例对应的产出物中,会有对应后处理的相关信息:

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