This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM62A7:TI SDK 升级后、模型板上的推理结果变得不准确。

Guru**** 2847400 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1625792/am62a7-after-the-ti-sdk-upgrade-inference-results-on-the-model-board-became-inaccurate

器件型号: AM62A7

将模型从 TI AM62A 10.01.02 迁移到 TI AM62A 11.01.07 时出现问题。 模型推理结果在 10.01.02 版中是正常的、但相同的模型在迁移到 11.01.07 时遇到问题。 问题描述如下:模型推论在 PC 上没有问题、但当部署到电路板进行推理时、输出结果不正确;模型输出值​​要么异常大、要么非常小。

这可能是什么原因造成的?

附加的文件和日志来自工程。

此致、

Longgang
run_python_examples.zip 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Longgang:  

    我们将分析您提供的文件和日志、并返回给您。 听起来主机 — 目标不匹配[1][2]。

    我们通常通过在 PC 和目标上使用等效脚本运行模型来实现这一点、debug_level=3。 然后比较 tidl_trace 文件的/tmp 下的跟踪(通常使用像 md5sum 这样的哈希值)、看看是否存在某个特定的层、在该层的精确度会有所不同。

    请允许我们花些时间对此进行调查

    [1] https://github.com/TexasInstruments/edgeai-tidl-tools/blob/rel_11_01/docs/tidl_osr_debug.md#steps-to-debug-error-scenarios-for-targetevmdevice-execution 

    [2] https://github.com/TexasInstruments/edgeai-tidl-tools/blob/master/docs/debugging.md#incorrect-inference-results 

    BR、

    Reese

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Reese、
    以下是 debug_level=3 之后的日志、可供参考和分析。 谢谢你。
    e2e.ti.com/.../run_5F00_model.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Longgang:

    对于相同的输入、而不是日志、请共享来自 EVM 和 PC 的布线。 运行推理后、您将在/tmp 目录中找到.bin 文件。 无需为此重新编译模型(在运行 TIDL 脚本时删除-c 标志)。 这些 bin 文件是 C7x 上运行的每个层的推理输出。

    请查看 Reese 在上一次答复中分享的第一个和第二个链接。

    需要说明的是、开关使用的输出在 EVM 和 PC 上是否都不准确、或者在 PC 和 EVM 上运行模型时输出是否不同? 如果稍后、请按照我和 Reese 的答复继续操作。

    此致、
    Jay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../FaceKeypoint_5F00_tmp.zip

    根据上述建议、我们执行了以下故障排除:

    使用三种精度方法:32、16 和 8。

    1.配置了三种方法:Tensor_bits = 32、tensor_bits = 16 且 tensor_bits = 8。

    2.运行脚本:

    1.修改了 common_utils.py 中的参数:Tensor_bit = 8、calibration_iterations = 600、debug_level = 4。

    2.事先清除 tmp 目录: python3 onnxrt_ep.py $ncpus -m FaceKeypoints (remove -c ),运行配置,生成新的 tmp 并保存它。

    3.图层激活比较:生成的定点 (*.y) 和浮点 (_float.bin) 输出逐层比较,并保存渲染的图像。

    相关文件已作为附件上传。

    目前尚不清楚相关的操作和方法是否存在任何问题。 如果没有问题、是否有办法确定哪个层的丢弃点导致了精确推理异常? 如果我们精确定位特定的层,我们如何调整结构以保持相应的精度(平台自适应运算符)? 已经提供了有关文件和模式、但目前进展缓慢。 您能否重现此问题并对其进行故障排除? 谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Longgang:

    我认为对调试指南所说的内容存在一些误解。 不应逐个比较浮点输出和定点输出。 正确的测试方法是比较 onnx 模型的浮点数输出和模型量化时的浮点数输出。 这些跟踪(BIN 文件)随后可与该实用程序一起使用[1]

    要正确生成布线、请按照以下步骤操作:
    1.需要为 ONNX 模型中的每个图层添加输出。 使用此文件[2]。 在较新的 TIDL 工具中、您无需单独下载该文件。
    2.像使用这个脚本一样转储张量[3]。 在较新的 TIDL 工具中、这将在禁用卸载机制中进行处理。 目前、我使用的是使用 np.zero 生成的数组。 您可能需要通过实际图像。
    3.像以前一样使用伪影获取迹线,只需要 8 位迹线。 使用相同的图像生成张量。
    4、使用前面提到的实用程序获取比较图[1]。 示例命令:

    streamlit run tidl_debug_scripts/layer_trace_inspector.py -- \
        --traceONNX <tidl_tools_path>/traces/32bit \
        --traceTIDL <tidl_tools_path>/traces/8bit \
        --traceInfo <tidl_tools_path>/model-artifacts/FaceKeypoint/artifacts/tempDir/subgraph_0_tidl_net.bin.layer_info.txt

    现在、我生成了布线、并得到了以下误差图:

    由此我们可以看到数据 id 75 和 176 是主要的离群值。 在它们的图形中也可以看到同样的情况(仅附加 75 个):

    这些点指向以下层:
    1.数据 ID 75: /backbone/layer5/layer5.0/se/global_avgpool/GlobalAveragePool
    2.数据 ID 176: / classification_head/pool/GlobalAveragePool

    您可能需要使用混合精度量化来将一些张量设置为 16 位量化和测试。 您还可以通过将整个模型量化为 16 位进行测试、然后查看精度。 这是一个迭代过程、通常这些就是这些步骤。

    [1] https://github.com/TexasInstruments/edgeai-tidl-tools/tree/11_01_06_00/scripts#inspecting-intermediate-layer-traces 
    [2] https://github.com/TexasInstruments/edgeai-tidl-tools/blob/master/osrt-model-tools/osrt_model_tools/onnx_tools/tidl_onnx_model_utils/onnx_add_intermediate_outputs.py 
     [3] e2e.ti.com/.../dump_5F00_layers.py

    此致、
    Jay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Goyal:

    根据您的建议、我们重新完成了相关工作、但与您的调查结果有偏差。 问题是、将 ONNX 模型的浮点输出与模型量化的 int16 输出进行比较时、从第二层开始就会出现问题。 比较图显示显著的偏差、而图形融合显示​​相应层的以下浮点值:min/maxValue=(0、0)、min/maxTensorValue=(0.000000、0.000000)

    tensorScale=1.000000

    tensorZeroPoint=0

    elementType=TIDL_SinglePrecFlot。 我们最初怀疑这是因为模型没有被量化。 我们不确定此怀疑是否正确。 如果是、配置文件是否有问题? 请帮助我们检查和验证这一点。 请务必注意、我们的 SOC 使用 AM62A。 在从`网站下载的` common_utils.py 文件中、“platform":“:“j7",“,"version"、"version":“:"7.2"“"7.2"。“。</s>“ 是否需要根据我们的 SOC 重新调整这些参数? 如果是、是否有任何相关资源可供参考? 如果是、那将是很好的。 随附相关的验证材料以供您审核。

    另外、如果您已获得正确的验证结果、请将相应的配置文件和其他相关文档打包和副本?如果您可以提供这些文件、这将非常有帮助。
    此致、
    Longgange2e.ti.com/.../am62a_2D00_11.01.06.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Longgang:

    "平台“平台“:“j7",“,"version"、"version":“:"7.2"
    “"7.2"</s>“ “

    没关系。 编译器将针对 AM62A 运行。 如果要验证您正在使用哪个 SOC、可以检查 SOC 环境变量。

    我们最初怀疑这是因为模型没有量化。 我们不确定此怀疑是否正确。 [/报价]

    我认为情况并非如此。 由于子图 bin 文件是在工件/目录中生成的、因此编译器正在运行。

    关于量化、请查看本文档[1]。 我想强调的几点是、请使用非对称量化(量化量化比例_type=4)。 此外、将校准帧数增加到 50、将校准迭代增加到 25。 您可以尝试使用更高的值。 为此、我连接了一个补丁。 这还包括在 onnxrt_ep.py 文件中设置 calib_images 数组以指向正确的图像。 请根据您的要求进行设置。 其中包括我在基础 TIDL 工具之上所做的所有必要更改。 model_config 与您的模型相同、因为我找不到重大问题。

    e2e.ti.com/.../0001_2D00_Add_2D00_Hirain_2D00_models_2D00_to_2D00_repo.patch

    [1] https://github.com/TexasInstruments/edgeai-tidl-tools/blob/master/docs/quantization.md#quantization-options

    此致、
    Jay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Longgang:

    我想指出另一个可能的解决办法。

    在模型工件中,您应该有一个文件 artifacts/tempDir/subgraph_0_tidl_net.bin.svg。  如果此文件在 SDK 10.1 和 11.1 之间相同、并且 SDK 10.1 中的精度结果足以满足您的需求、则可以查看此[1]。 在 SDK 10.1 中以写入模式运行此文件、将文件复制到 11.1 并在读取模式下运行。  不过、这与我之前关于量化比例_SCALE_TYPE = 4 的建议不符

    该选项的目的是存储量化选项、以便 TIDL 编译器不必在重新编译时多次执行相同的工作。 请注意、只有编译后的模型(不仅仅是 ONNX)相同时、此方法才有效。 因此、您需要检查我在上面指向的文件。

    [1] https://github.com/TexasInstruments/edgeai-tidl-tools/blob/master/docs/quantization_proto.md

    此致、
    Jay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Goyal:

    其他信息:

    版本:EdgeAI TIDL Tools 为 11.01.06 版。

    代码更改:随机数字替换为照片。

    有关相关命令和 images.e2e.ti.com/.../2110.issue.zipe2e.ti.com/.../2110.issue.zip、请参阅附件

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Longgang:

    我在您共享的文件中看不到任何可能导致问题的因素。

    请尝试我之前两个答复中的建议。

    此致、
    Jay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Goyal:
    我们在 10.01.02 版上进行了重新测试,发现有问题的图层是一致的,现象也是相似的,除了由于版本变化而相应的图层编号发生了变化。 相关的比较图像和融合图见 attached.e2e.ti.com/.../_FF4E1F770E4E_onnx_938FFA51F95BD46BD37E9C675F00_10_5F00_01_5F00_02_48722C67_.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Longgang:  

    到目前为止、我正在回顾相关主题和进度。 根据原始问题、PC 和 EVM 结果之间存在差异、对吗? 在 PC 上 11.1 的精度是否足够? 或者、无论 PC 或 EVM 如何、SDK 11.1 的精度是否较低(但在 10.1 上已足够)?  

    • 到目前为止、我们似乎正在以后一个问题(精度差 11.1)来解决此问题、而我们可能需要重点关注前一个问题(PC 与 EVM 不匹配)

    如果 PC 和 EVM 之间确实存在精度问题、那么我们要在这些设备上收集布线、并确定哪一层是第一层不匹配位(我想通过 md5sum 或类似的 file-hash 进行检查)。 为此、我们来 tensor_bits=8。 隔离不匹配的图层后、将其添加到拒绝列表中、重新编译网络、然后重新运行测试。 如果多个层导致此类问题、则可能需要进行几次迭代。  

    我们可以拒绝列出某个层或将其标记为 16 位量化、但在某些情况下、EVM 端实现存在错误、需要修复和更新固件。  

    我会注意到:在查看精确的图像时,有时生成的图像很难解释。 我通常说,如果有一个图像显示准确性 — 异常(你已经注意到几个),并且下面的一层显示类似的错误模式,那么该层确实会导致问题。 如果精度立即在下一层恢复、通常可以忽略前一层。 您在 10.1 跟踪中指出了一些、但以下图像看起来很好 --我不担心这些跟踪。  

    BR、
    Reese

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Longgang:

    您能否回复并告诉我们您的问题是否已解决、或者您需要进一步帮助来调试此问题?
    如果需要进一步的帮助,请澄清 Reese 的答复中的要点。

    此致、
    Jay