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.

[参考译文] SK-AM62A-LP:ONNX 的编译将精度降至零

Guru**** 2483375 points
Other Parts Discussed in Thread: SK-AM62A-LP

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1545493/sk-am62a-lp-compilation-of-onnx-drops-accuracy-to-zero

器件型号:SK-AM62A-LP


工具/软件:

我目前正在使用适用于 SK-AM62A-LP 的 SDK 10.1。 我正在尝试使用 edgeai-tensorlab 中的 r10.1 分支来训练和编译 yolox-nano-lite 模型。 我的数据集遵循标准的 COCO 格式。 我尝试了两种相同的方法-  

1.使用 edgeai-mmdetection 进行模型训练、使用 edgeai-benchmark 进行模型编译。 我将经过训练的 Pytorch 权重转换为 ONNX、然后编译它生成工件以进行推理。

2.将 edgeai-modelmaker 的 config-detection.yaml 与 run_modelmaker.py 脚本配合使用 、以 COCO 格式存储在我的数据集上。

对于第一种使用 edgeai-mmdetection 的方法、我可以使用 tools/train.py 获取经过训练的模型以及相应的 ONNX 和 proto 文件。 我参考了 edgeai-benchmark 中提到的用于编译模型的教程、但  在编译模型后得到 map = 0。 我保持 tensor_bits = 32、因此无需校准、我们可以直接编译模型。

e2e.ti.com/.../edgai_5F00_benchmark_5F00_compilation_5F00_run.log

在第二种方法中、我使用了 edgeai-modelmaker 并修改了默认的 config_detection.yaml 以使用我的 COCO 格式数据集。 在这种情况下、编译完成时会出现错误、例如“Invalid Layer Name /multi_level_conv_cls.0/Conv_output_0“。 附加相同的编译日志-

e2e.ti.com/.../modelmaler_5F00_compilation_5F00_run.log

我已经验证我能够从 ONNX 格式的模型中获得预测、并且它的地图不是零。 但是、在尝试编译模型以在 SK-AM62A-LP SOC 上进行推理时、我遇到了上述问题。 我上传了我认为传达此问题所需的日志。  是否需要任何附加文件进行调试?请告诉我。 请提出潜在问题和解决方案。

谢谢你

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

    您好、Akash、

    对于 modelmaker 的第二种方法、您能否提供您的 YAML 配置文件?

    我注意到您的日志有一些奇怪的事情、这让我想知道您是否使用“lite"模型“模型版本、如“yolox_nano_lite"。“。 这些与典型的 mmdetection 版本的模型有几个图层更改,其中一个是用一系列相互馈入的 3x3 替换大型 maxpool。 这就是为什么您会看到多个子图和多条直线、例如:  

    -------------------------------------------------------------------------------
    |          Core           |      No. of Nodes       |   Number of Subgraphs   |
    -------------------------------------------------------------------------------
    | C7x                     |                     265 |                       2 |
    | CPU                     |                       5 |                       x |
    -------------------------------------------------------------------------------
    ------------------------------------------------------------------------------------------------------------------------
    |   Node    | Node Name |                                            Reason                                            |
    ------------------------------------------------------------------------------------------------------------------------
    | Reshape   | 5         | Subgraph does not have any compute node                                                      |
    | Transpose | 6         | For firmware version < 10_01_04_00, only permutes are suported when number of dimensions > 4 |
    | MaxPool   | 79        | Kernel size (13x13) with stride (1x1) not supported                                          |
    | MaxPool   | 78        | Kernel size (9x9) with stride (1x1) not supported                                            |
    | MaxPool   | 77        | Kernel size (5x5) with stride (1x1) not supported                                            |

    您是否更改了与此模型相关的任何 mmdetection 来源? 这种情况通常不应发生  

    这些行类似于:  

    Invalid Layer Name  /multi_level_conv_obj.2/Conv_output_0
    Invalid Layer Name  /multi_level_conv_reg.2/Conv_output_0
    Invalid Layer Name  /multi_level_conv_cls.2/Conv_output_0
    Invalid Layer Name  /multi_level_conv_obj.1/Conv_output_0
    Invalid Layer Name  /multi_level_conv_reg.1/Conv_output_0
    Invalid Layer Name  /multi_level_conv_cls.1/Conv_output_0
    Invalid Layer Name  /multi_level_conv_obj.0/Conv_output_0
    Invalid Layer Name  /multi_level_conv_reg.0/Conv_output_0
    Invalid Layer Name  /multi_level_conv_cls.0/Conv_output_0

    之所以出现、是因为模型中的最后一个 Conv 层被指定为在 16 位模式下运行以提高准确性(并减少框位置抖动)、但 ONNX 模型中不存在这些层名称。 图层名称在 edgeai-modelmaker 的几个位置[1]中指定。 我已经看到、tensorlab /相关依赖项的最新版本产生了一个 model.onnx、它不使用相同的图层名称(通常被一个数字标识符所取代)。

    • 奇怪的是、如果 tensor_bits 设置为 32、这部分解析器甚至会运行。 如果不是在 8 位模式中、我希望它不引用该设置。

    模型运行时、您能否打印输出? 它们是否以任何方式有效? 出现 0mA 的另一个原因是、 验证数据集不包括代表性数据、或者尺寸太小以至于缺少几次检测会导致最坏情况下的准确性。  

    [1] https://github.com/search?q=repo%3ATexasInstruments%2Fedgeai-tensorlab+multi_level_conv_obj.2&type=code

    BR、
    Reese

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

    尊敬的 Akash:

     一周前、我们在分行 r10.1 中得到了一些与此相关的修复。
    只是为了确认,你能检查你是否已经与 r10.1 分支的最新.

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

    尊敬的 Akash:

    我将回应 Rekib 的注释、以确保您提取最新的 10.1 分支提交

    这些配置对我来说很普通。 您还说过、在 CPU 上经过训练的 ONNX 模型通常表现正常、我从编译日志中可以看到、大约有 100 个样本可用于基准测试。

    • 我很想知道是否正确读取和处理了此验证集、以及标签是否良好。
    • 我想知道输出检测也是什么样的。 它们是否都是无效/无效检测、或者它们实际上是否与图像中的内容匹配?

    仍然可以看出、maxpool 图层未正确替换为级联的 3x3 maxpool。 这似乎与问题有关

    • 与其他“lite"模型“模型一样、您可以正确 设置“convert_to_lite_model = dict (model_surgy=1)“
    • 我们是否到达了这个部分,在这里我们识别了模型优化的设置,并生成了替换词典[1][2]?  这将在汇编之前进行、并且应在培训之前进行  

    [1] https://github.com/TexasInstruments/edgeai-tensorlab/blob/c7a97e43b760522f3d4e443780a19a895a1ce1b7/edgeai-mmdetection/mmdet/utils/model_optimization.py#L94C21-L94C42 

    [2] https://github.com/TexasInstruments/edgeai-tensorlab/blob/c7a97e43b760522f3d4e443780a19a895a1ce1b7/edgeai-mmdetection/tools/train.py#L182 

    BR、
    Reese

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

    尊敬的 Reese:

    我开始尝试 Rekib 的建议,并包括对 edgeai-tensorlab 的 r10.1 分支所做的最新修复。 我能够训练模型并使用 tensor_bits =32 进行编译、并在编译后使用 edgeai-modelmaker 在编译日志中获得精度系数。 也就是说、日志仍然包含 “Invalid Layer Name /multi_level_conv_cls.0/Conv_output_0“消息。 编译完成后、我能够在 outputs 文件夹中获得推理输出 、如下面的屏幕截图所示、我假设是来自编译后模型、它确实成功地证明了该模型能够执行检测任务。

    e2e.ti.com/.../modelmaker_5F00_compilation_5F00_run.log

    我还尝试使用编译的模型对 SOC 执行推理、但使用以下日志失败。  e2e.ti.com/.../infer_5F00_20250801.log

    用于推理的 SOC 配置如下:  

    EVM - SK-AM62A-LP

    SDK 版本 —  10.01.00.05(使用 BalenaEtcher 刷写)

    SDK 发布日期 —  2025 年 1 月 15 日

    SDK md5sum - dea8a075d8cabd0f207c23200672a9e5.

    如果还有更新版本的 SDK、请告知我、因为 r10.1 分支中的修复程序不到一个月、而我当前使用的 SDK 是 2025 年 1 月。 在我的开发环境中成功的推理和编译使我相信编译是成功的、现在的问题可能出在 SDK 上用于在 SOC 上执行推理。 期待听到您的想法!

    Akash

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

    尊敬的 Akash:

    这是前进的进步! 我们来了解一下仍在发生的情况:

    、表示日志仍包含 “Invalid Layer Name /multi_level_conv_cls.0/Conv_output_0“消息。

    我认为这类似于另一个主题[0]中涵盖的一些内容。 有一种名为“advanced_options:output_feature_16bit_names_list“的设置可以将层设置为在 16 位模式下运行以提高精度。 当图层包含在此列表中但在模型中未找到时、会发生您看到的错误。 如果未找到图层、则将使用默认的 tensor_bits 设置。 这个特定的编译设置是在 modelmaker 中指定的--对于你的模型、我相信这是在[1]。  

    • 我会注意到、对于 tensor_bits=32、此 16 位设置不会进行任何有意义的更改、您可以放心地忽略该错误。  一旦 tensor_bits=8、就更重要了。 主要效果是方框坐标更加抖动。

    我已经注意到、较新的火炬版本将导出一个 ONNX 模型 、它使用的图层名称与我们过去所验证的不同。 模型架构相同,但图层名称不同,因此预设的 16 位图层名称与导出的 ONNX 模型不匹配。 这些特定层是馈入单次触发检测头的最后一个 Conv 层[2]

    [报价 userid=“658004" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1545493/sk-am62a-lp-compilation-of-onnx-drops-accuracy-to-zero/5957739

    我还尝试使用编译的模型对 SOC 执行推理、但使用以下日志失败。  

    [/报价]

    这是因为您要编译 32 位模式、此模式用作在 PC 上进行精度评估的参考。 目标 SoC [3]不支持该模式。 您需要使用 tensor_bits=8 或 16 编译模型才能在 SoC 上运行。  

    [0]  SK-AM62A-LP:[edgeai-modelmaker]奇怪的编译 run.log 打印输出 

    [1] https://github.com/TexasInstruments/edgeai-tensorlab/blob/main/edgeai-modelmaker/edgeai_modelmaker/ai_modules/vision/training/edgeai_mmdetection/detection.py#L285

    [2]https://github.com/TexasInstruments/edgeai-tidl-tools/blob/master/docs/tidl_fsg_od_meta_arch.md#onnx-ssd 

     [3] https://github.com/TexasInstruments/edgeai-tidl-tools/blob/master/docs/tidl_osr_debug.md#steps-to-debug-functional-mismatch-and-accuracy-in-host-emulation 

    BR、
    Reese

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

    尊敬的 Reese:

    我能够编译我的模型 tensor_bits=8/16、在这两种情况下、与编译时在 Outputs 文件夹中生成的可视化效果相比、我都观察到 SoC 上的推理精度非常差。 在对 SoC 执行推理时、精度明显更差、正如我在零预测旁边所看到的那样、即使设定了 0.2 等低可信度阈值也是如此。

    我注意到 edgeai-tensorlab 存储库的 r11.0 版本,我已经使用相同的测试了我的模型。 在最新的 r11 版本中、modelmaker 完成训练、但无法使用以下错误代码和 logs.e2e.ti.com/.../v11_5F00_modelmaker_5F00_attempt1.log 编译模型

    在深入了解后,我发现编译文件夹确实丢失了一些文件,而不仅仅是工件.yaml。 编译文件夹中的 run.log 会显示以下内容:  

    e2e.ti.com/.../8547.run.log

    在设置我用于开发的 Docker 环境时、edgeai-benchmark 无法专门下载适用于 AM62A SoC 的 tidl_tools、而它适用于其他 SoC。 提供的安装脚本中用于下载的 URL 是:  

    http://software-dl.ti.com/jacinto7/esd/tidl-tools/11_00_08_00/TIDL_TOOLS/AM62A/tidl_tools_gpu.tar.gz -->此 URL 似乎不起作用。

    我希望得到及时的答复、因为这似乎是对我的快速修复。 任何包含  AM62A v11_00_08_00 的 tidl_tools_gpu.tar.gz 的公共 URL 都是完美的。

    我知道您的团队仍在开发 edgeai-tensorlab 存储库并对其进行 bug 修复、因此我还建议添加一些测试用例以确保提供的所有 URL 都正常工作。

    此致、

    Akash

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

    您好、Akash、

    AM62A 没有 11.0 SDK 版本。 因此、用于牵引/应用 tidl_tools 路径下载的自动化代码未找到适用于此特定 SoC 的工具。  

    正确;很遗憾、它不存在。  

    而是 11_00_07_00 版本、该版本可产生向后兼容 10.1 SDK 的模型工件。  

    edgeai-tidl-tools (update_target.md)[0]中介绍了将 11_00_07_00 的更改应用到 10.1 SDK 的方法。 您可以下载此版本的 tidl-tools、并将其放置在相同的 tools/AM62A/tidl_tools 位置、然后尝试从此位置进行编译。 在使用生成的工件之前、您需要遵循文档[0]以了解如何更新目标。  

     [0] https://github.com/TexasInstruments/edgeai-tidl-tools/blob/11_00_07_00/docs/update_target.md 

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

    您好 Reese、

    我看到 AM62A 的 SDK 版本、似乎是 11.0 SDK 版本、如以下屏幕截图所示-  

    请说明我应该为上述最新的 AM62A SDK 使用 edgeai-tensorlab 的版本/分支来训练我的模型。

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

    尊敬的 Akash:

    这是 11.01 SDK。  我们的版本字符串遵循每个版本组件两个字符的约定、因此 11.1 和 11.01 的含义相同。 句点是重要的分隔符。  

    edgeai-tensorlab 通常滞后于 SDK 发布几周。 AM62A 的版本早于其他 Edge AI/ADAS 处理器。 只有在 Edge AI 类别中的所有设备都准备就绪后、tensorlab 才会更新。 11.1 TIDL 工具也不 适用于 AM62A。

    我的建议是与 r11.0 分支进行培训。 但是、您应首先将 tools/AM62A/tidl_tools(之前未设置)替换为 11.00.07 tidl  工具或 10.01.04 工具、并立即将其与 10.1 SDK 一起使用。

    BR、
    Reese