专栏算法工具链【J6工具链部署实用技巧-4】J6 工具链QAT 链路输出一致性问题验证教程

【J6工具链部署实用技巧-4】J6 工具链QAT 链路输出一致性问题验证教程

momo(社区版)2024-12-24
237
0

【J6工具链部署实用技巧-1】如何修改bc和hbm模型的输入输出名称和顺序

【J6工具链部署实用技巧-2】如何读取和修改模型的desc信息

1. 引言

在模型部署工作中,当出现hbm模型精度不符合预期的情况时,需要做精度一致性的验证,即QAT模型、bc、hbm模型的输出精度一致性。精度一致性一直都是相对繁琐的工作,而且相对于 J5 工具链,J6 工具链的 QAT 链路有着显著的不同,且其复杂程度更高。这些差异直接导致了在精度一致性验证的流程上存在着部分区别。精度一致性验证在实际应用中至关重要,它关系到产品的性能和质量。为了帮助相关人员更好地理解和掌握这一流程,本文将结合J6工具链QAT链路具体实例,详细演示完整的精度一致性验证流程,包括各个关键环节的操作步骤、注意事项以及可能出现的问题及解决办法。

2. J6 QAT模型转换流程简介

下图中对比了 J6 工具链PTQ/ QAT模型转换流程,J6 工具链 QAT模型转换可以简单描述为以下步骤:

  1. 步骤 1:完成QAT。结合 J6工具链用户手册完成模型的 calibration/量化训练,并验证伪量化模型的精度;
  2. 步骤:2:export出伪量化bc。加载训练好的伪量化模型权重,使用from horizon_plugin_pytorch.quantization.hbdk4 import export接口导出qat.bc(伪量化 bc),在此过程中可以自定义model name,input&output name以及 desc信息;
  3. 步骤 3:适应性修改伪量化bc。这部分主要涉及对 qat.bc插入pyramid/resizer、归一化、transpose等预处理节点,详情请参考J6工具链用户手册【模型部署实践指导】章节;
  4. 步骤 4:convert。将qat.bc量化为定点 bc(quantized.bc);
  5. 步骤 5:节点删除。此阶段可以选择性删除模型首尾部分Quantize、Dequantize、Reshape、Transpose、Cast节点,并在部署代码中进行适配;
  6. 步骤 6:compile。将删除过节点的quantized.bc编译出上板部署的 hbm模型。
  7. 步骤 7:板端部署。基于 UCP,将 hbm模型部署到板端。

以上为 J6 工具链 QAT链路的基本情况,可以预见,当出现精度一致性问题时,以上步骤都需要排查。下面将进行一致性验证的流程的详细阐述。

3.一致性验证流程

 

3.1 输入数据/模型确认

在正式开始精度一致性验证流程前,务必确认 hbm模型及其输入数据是否符合预期。

3.2 板端部署代码问题排查

使用 UCP提供的 hrt_model_exec infer工具推理 hbm模型:
  1. 如果推理结果无误,说明是部署代码有误,通常情况下后处理代码出现问题的可能性较大,底软出现问题的概率较小;

  2. 如果推理结果有误,则排查是否是工具链缺陷或者模型本身精度的问题。

示例代码:

hbm模型是由quantized.bc使用编译器的 compile接口编译而来,理论上精度是完全一致的。如果 hbm模型精度有误,则需要排查是 compile接口的问题还是 quantized.bc本身的精度问题。

3.3 hb_verifier一致性验证

使用hb_verifier工具验证quantized.bc和hbm的一致性。有以下几点需要注意:
  1. 强烈建议使用真实数据作为hb_verifier工具的输入,这样可以更准确地验证一致性;
  2. 如果验证未通过,说明是compile接口的问题;
  3. 如果验证通过,则进行下一步quantized.bc的精度验证。

脚本使用示例:

3.4 quantized.bc精度验证

正常情况下,quantized.bc和 hbm的输出是完全一致的,这里使用 python api进行quantized.bc模型的单帧推理可视化。

这里也可以调用工具链封装的 python/UCP接口在测试集上验证quantized.bc的 metric精度。

  1. 如果hb_verifier一致性验证通过,但是quantized.bc的可视化精度/metric指标较差,那么确定是模型本身的精度问题,建议继续进行下一步 qat.bc的精度验证。

相关示例代码如下:

3.5 qat.bc精度验证

quantized.bc是通过调用编译器的convert接口,对qat.bc进行定点化操作而得到的,需要注意的是,这一过程是有损的。也就是说,在这个转换过程中,可能会导致一定程度的精度损失。当发现quantized.bc的精度不符合预期时,我们首先要做的就是验证qat.bc的精度。这是因为qat.bc是quantized.bc的源头,如果qat.bc本身的精度就存在问题,那么无论后续如何处理quantized.bc,都无法达到预期的精度要求。所以,对qat.bc精度的验证是解决quantized.bc精度问题的关键步骤。

  1. 如果quantized.bc精度异常,而 qat.bc精度正常,则说明是 convert定点化引起的量化误差较大,需要提交地平线技术人员分析;
  2. 如果quantized.bc和 qat.bc精度都异常,则说明是export出的 qat.bc精度有问题,后续进行排查是 export接口问题还是 qat model精度的问题。

3.6 qat 模型精度验证

qat.bc 是对完成量化训练的 qat 模型进行 export 而来。如果 qat 模型精度不符合预期,需要排查是 export 接口还是 qat 本身就具有精度问题。
  1. 如果 qat模型精度正常,而qat.bc精度异常:
    • 首先,要检查 export时qat model的状态、加载的权重是否正确;

    • 然后,使用 QAT的精度 debug工具,对比qat model和 qat.bc的逐层相似度等信息,定位引起误差的算子;

    • 确定引起误差的算子后,提交地平线技术人员进行分析处理。

  2. 如果 qat模型精度异常,那么就直接参考工具链用户手册进行 QAT模型的精度调优。具体章节如下:

 

算法工具链
社区征文征程6技术深度解析官方教程
评论0
0/1000