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.

[参考译文] PROCESSOR-SDK-AM68A:ONNX Runtime 模型在 SDK 10.0中的 Docker 中不起作用

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1462335/processor-sdk-am68a-onnx-runtime-models-do-not-work-in-docker-in-sdk-10-0

器件型号:PROCESSOR-SDK-AM68A

工具与软件:

我正在尝试在 SDK10中启动示例 edgeai gstreamer 应用、但我遇到了一个问题。 使用 https://www.ti.com/tool/PROCESSOR-SDK-AM68A 中的默认预编译映像时、 可以通过访问/opt/edgeai-gst-apps/apps_python 并使用 python3 app_edgeai.py ./configs/启动系统并尝试演示应用 .yaml、一切都按预期运行。

但是、当我构建准备好的 Docker (通过 docker_build.sh 在/opt/edgeai-get-apps/docker 中调用./Docker)、然后运行该 Docker 时、并非所有模型都能正常工作。 例如、我可以运行 TFL-CL-0000-mobileNetV1-mlperf、但不能运行 ONR-CL-6360-regNetx-200mf。 似乎问题在于所有使用 onnxruntime 启动的模型,与所有这些模型一样,我得到以下输出:

[docker] root@am68-sk:/opt/edgeai-gst-apps/apps_python python3 app_edgeai.py ../configs/image_classification.yaml

libtidl_onnxrt_EP 已加载0x154c95a0

分段故障(已转储内核)

对于 SDK 版本10.00和10.01、使用 apps_cpp 而不是 apps_python 时、我也观察到相同的行为。 是否有某种解决方法允许我从 Docker 启动 ONR 模型?

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

    您好!

    感谢您提供信息。  您能否告诉我是否某些模型在 Docker 环境中失败或全部失败?  我问这个问题是因为如果 所有型号都出现故障、则说明设置有问题。  如果只有几个失败、则可能存在不受支持的图层。   我不确定为什么同一版本的主机和 Docker 之间会有增量、但安装脚本可能存在问题。

    您能否在 edgeai-tidl-tools 中设置 Git 状态、并将输出发送给我以复制您的确切环境?  

    此致、

    Chris

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

    通过我尝试过的方法、这些模型可以正常工作
    - TVM-CL-3090-mobileNetV2-tv
    - TFL-CL-0000-mobileNetV1-mlperf
    - TFL-OD-2020-ssdLite-mobDet-DSP-coco-320x320
    - TVM-OD-5120-ssdLite-mobDet-DSP-coco-320x320

    它们不能:
    - ONR-OD-8420-yolox-s-lite-mmdet-widerface-640x640
    - ONR-CL-6360-regNetx-200mf
    - ONR-KD-7060-人体姿势-yolox-s-640x640
    - ONR-OD-8200-yolox-nano-lite-mmdet-coco-416x416

    对于 ONR、每次都是相同的内核转储。 我还包括使用 ONR-CL-6360-regNetx-200mf 从 apps_cpp 运行 app_edgeai 后 gdb 的反向跟踪:

    e2e.ti.com/.../2437.ort_5F00_core_5F00_dump_5F00_backtrace.txt

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

    尊敬的 Denys:

    "git status"的输出是什么?

    Chris

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

    Chris、您好!
    您需要从哪个存储库获取信息? 我使用预编译映像(www.ti.com/tool/PROCESSOR-SDK-AM68A)、因此/opt/edgeai-gst-apps 中的任何位置都没有.git 目录

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

    您是在器件还是主机上运行它?

    Chris

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

    不同的接口

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

    好的、我的下一个问题是、为什么要在设备上运行 Docker?  它用于在主机上形成隔离的环境。  设备上的环境是固定的(即您在 SD 卡上安装的任何环境)。  其中会出现一个问题、那就是 ONNX 模型是否已经在器件上编译过。 您能否向我发送指向您正在运行的图像(.wic.zx 文件)的链接? 我将查看一下。

    Chris

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

    我使用的是 Docker、因为文档中的建议是: https://software-dl.ti.com/jacinto7/esd/processor-sdk-linux-am68a/10_01_00/exports/edgeai-docs/common/docker_environment.html

    这是一个方便的开发环境、我可以在其中使用 apt 安装其他软件包、因此我不会受 Yocto 提供的软件包的限制。 我也有 Docker 正常工作与版本08.06.01和09.02.00相同的 SDK。

    我使用此处的.wic.xz 映像: https://www.ti.com/tool/download/docker-AM68A/10.00.00.00.08、 而要构建、我按照文档中的说明使用 docker_build.sh 进行构建、使用 docker_run.sh 运行并在 PROCESSOR-SDK-LINUX 内运行 setup_script.sh。

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

    好的、公平的、但为什么在目标上这样做呢?  它很慢而且容易出错。  这是他的指示的节选。   

    注释

    使用提供的 Dockerfile 在目标上构建 Docker 映像需要大约15-20分钟才能完成、并具有良好的互联网连接。 在目标上构建 Docker 容器可能会很慢且资源受限。 提供的 Dockerfile 将在目标上构建而不会出现任何问题、但如果您添加更多软件包或从源构建组件、内存不足可能是一个常见问题。 作为替代方案、我们强烈建议尝试 QEMU 构建以在 PC 上交叉编译 ARM64架构的映像、然后将编译后的映像加载到目标上。

    其背景是它可以工作、但在主机上构建隔离的 Docker 环境是更好/更快的想法。  我认为如果您没有 Linux 22.04系统的访问权限、而想使用 Docker 容器。  但在这种情况下、在大多数情况下、TIDL 不允许在目标上编译、因此您仍需要在主机上执行该操作。   

    Chris

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

    感谢您的澄清。 我知道、在设备上构建 Docker 可能非常耗时或需要大量内存、但在本例中、它可以作为起点、因此无需执行任何其他设置。 我还假设在设备上构建的 Docker 映像或在其他系统上使用 QEMU 之间没有区别。

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

    通常、编译(导入/量化任何当前流行语)和测试模型的最佳位置是在主机上。  正常流程为:

    1.找到一个模型(最好从模型动物园)

    2.在主机上训练(在 TIDL 之外或使用预先训练的模型)

    3.在主机上编译它 ( python3 ./ onnxrt_ep.py -c -m  模型)

    4.在主机上测试模型。   cd 到 edgeai-tidl-tools/examples/osrt_python/ort 并在器件上运行推理( python3 ./onnxrt_ep.py -m  模型)

    5.将模型工件/和模型/复制到设备

    6、 在器件上运行推理( 使用.out 文件或 OSRT python 运行)

    您通常会在主机上得到比器件上更好的错误消息。   主机上的仿真效果不错、但临界情况可能取决于硬件的配置方式(人们可以想到已配置的存储器大小)。   

    Chris

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

    感谢您的回答。 但我现在的主要目标是不编译模型、而是在器件上运行模型。 我在使用自定义模型的 Docker 中遇到同样的问题、在该模型中、我在"libtidl_onnxrt_ep loaded"后获得了 Segmentation Fault、但模型在 Docker 环境之外运行良好。 正如我在问题描述中提到的、我设法重现了 model_zoo 中所有 ONR 模型的问题。

    所以基本上问题是 model_zoo 中的任何 ONR 模型都可以在设备上的 Docker 外部运行、但不能在设备上准备好的 Docker 容器内运行。 这会使我在需要时的开发变得非常复杂、例如 ROS、它仅在 Docker 内部提供、而在 Yocto 中不提供。

    我想设备主机文件系统上的库和设备上的 Docker 容器内的库之间存在一些差异、但不幸的是、我无法确定问题的确切原因。

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

    尊敬的 Denys:

    我已经向开发团队发布了一个问题。  除非开发团队提前回答、否则我应该在1/27之前在 CCB 中给出答案。   

    此致、

    Chris

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

    Chris、您好!

    我找到了可帮助您确定问题的其他信息。 似乎当我从主机文件系统(/usr/lib/libonnxruntime.so.1.14.0 +10000005)中将 in-docker /usr/lib/libonnxruntime.so (和 libonnxruntime.SO.1.14.0+10000000)替换为库、并在 Docker 内部重新编译 apps_cpp 时:
     $ CD /opt/edgeai-gst-apps/apps_cpp/build
     $ rm -r *
     $ cmake .
     $制造
    、所有的 ONR 模型在启动/opt/edgeai-gst-apps/apps_cpp/bin/Release/app_edgeai.时开始工作 但是、该库替换仍然不会影响 apps_python