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.

[参考译文] AM69A:为目标构建 TIDL 工具

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1521111/am69a-building-tidl-tool-for-target

器件型号:AM69A

工具/软件:

我目前正在使用 SDK 版本10_01_00_04为 TIDL 实施自定义运算符。 我已经使用以下命令成功创建了一个自定义运算符、并为 PC 构建了 TIDL 工具:

make tidl_pc_tools -j

这将在生成工具SDK/tidl_tools.tar.gz。 一切似乎都能在 PC 上正常运行:我用自己定制的版本替换了 EdgeAI 中的 TIDL 工具、编译了一个包含自定义运算符的 ONNX 模型、并成功运行推理。

在尝试为构建 TIDL 工具时、会出现该问题 目标板 。 我使用以下命令来构建运行时工具:

make tidl_rt

然后、我更换了板上的以下库:

  • SDK/c7x-mma-tidl/arm-tidl/onnxrt_ep/out/J784S4/A72/LINUX/release/libtidl_onnxrt_EP.so.1.0

  • SDK/c7x-mma-tidl/arm-tidl/rt/out/J784S4/A72/LINUX/release/libvx_tidl_rt.so.1.0

不过、 libvx_tidl_rt.so与为 PC 构建的版本不同、专为目标构建不包含与自定义运算符相关的任何符号。

我的问题是:

  1. make tidl_rt为目标构建 TIDL 工具的正确方法是什么?

  2. 在为目标构建时、如何确保包括自定义操作员实施?

  3. 为了支持自定义运算符修改、需要将哪些库复制到电路板上?

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

    您好;

    感谢您问这个问题。  

    "make tidl_rt"将 使用 SDK 安装程序中提供的预构建库构建源代码。 假设您正在目标板上构建一些与 TIDL 相关的应用、如果是、通常还必须通过执行"make vision_apps"来构建 Vision 应用。   

    不确定您添加或修改的内容。 但是、要更新 OSRT 组件和 C7X 固件、您必须在目标板上执行构建/制作任务。 在构建硬件时、请确保设置与硬件匹配的 SOC 参数。 以下链接提供了执行这些任务的详细信息

    https://github.com/TexasInstruments/edgeai-tidl-tools/blob/master/docs/update_target.md

    此致

    Wen Li

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

    我想为我前面关于自定义运算符的问题提供更多背景信息。

    Ceil通过以下MaxPool示例实现了自定义运算符、并对以下文件进行了修改:

    • utils/tidlModelImport/tidl_onnxRtImport_core.cpp
      →将新运算符添加到 individualSupportedOnnxOps

    • custom/tidl_custom_import.c
      →更新了TIDL_MapCustomParamsOnnx()TIDL_getCustomLayerOutputTensorScale()、和 TIDL_tfOutReshapeCustomLayer()

    • custom/tidl_custom.c
      →已修改 TIDL_customLayerProcess()

    • custom/makefile
      →添加了新的源文件和头文件

    • custom/ceil/tidl_custom_ceil.c
      →已实现 TIDL_customCeilProcess()

    • custom/tidsp/ceil/(C7x 实现源文件和头文件):
      →μ s tidl_custom_ceil_ixX_oxX.c
      →μ s tidl_custom_ceil_ixX_oxX.h
      →μ s tidl_custom_ceil_ixX_oxX_c7x.c
      →μ s tidl_custom_ceil_ixX_oxX_priv.h

    使用该自定义运算符的推理在 PC 上正常工作。 然后我将编译的库(libtidl_onnxrt_EP.so.1.0libvx_tidl_rt.so.1.0)和编译的 ONNX 模型工件复制到目标板上。 然而、在目标上运行推理时、尽管加载了模型并创建了子图、但输出完全为零。

    libtidl_onnxrt_EP loaded 0x10a91a30 
    Final number of subgraphs created are : 1, - Offloaded Nodes - 1, Total Nodes - 1 
    APP: Init ... !!!
      6879.102931 s: MEM: Init ... !!!
      6879.102973 s: MEM: Initialized DMA HEAP (fd=5) !!!
      6879.103103 s: MEM: Init ... Done !!!
      6879.103121 s: IPC: Init ... !!!
      6879.128557 s: IPC: Init ... Done !!!
    REMOTE_SERVICE: Init ... !!!
    REMOTE_SERVICE: Init ... Done !!!
      6879.136605 s: GTC Frequency = 200 MHz
    APP: Init ... Done !!!
      6879.136697 s:  VX_ZONE_INFO: Globally Enabled VX_ZONE_ERROR
      6879.136709 s:  VX_ZONE_INFO: Globally Enabled VX_ZONE_WARNING
      6879.136718 s:  VX_ZONE_INFO: Globally Enabled VX_ZONE_INFO
      6879.137400 s:  VX_ZONE_INFO: [tivxPlatformCreateTargetId:134] Added target MPU-0 
      6879.137534 s:  VX_ZONE_INFO: [tivxPlatformCreateTargetId:134] Added target MPU-1 
      6879.137636 s:  VX_ZONE_INFO: [tivxPlatformCreateTargetId:134] Added target MPU-2 
      6879.137720 s:  VX_ZONE_INFO: [tivxPlatformCreateTargetId:134] Added target MPU-3 
      6879.137731 s:  VX_ZONE_INFO: [tivxInitLocal:126] Initialization Done !!!
      6879.137743 s:  VX_ZONE_INFO: Globally Disabled VX_ZONE_INFO
    INPUT: = [[ -1.1   2.2  -3.3  -4.4   5.5  -6.6   7.7  -8.8  -9.9 -10. ]]
    Model Output:  [array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32)]
    APP: Deinit ... !!!
    REMOTE_SERVICE: Deinit ... !!!
    REMOTE_SERVICE: Deinit ... Done !!!
      6879.188237 s: IPC: Deinit ... !!!
      6879.189250 s: IPC: DeInit ... Done !!!
      6879.189281 s: MEM: Deinit ... !!!
      6879.189294 s: DDR_SHARED_MEM: Alloc's: 7 alloc's of 1887976 bytes 
      6879.189302 s: DDR_SHARED_MEM: Free's : 7 free's  of 1887976 bytes 
      6879.189309 s: DDR_SHARED_MEM: Open's : 0 allocs  of 0 bytes 
      6879.189320 s: MEM: Deinit ... Done !!!
    APP: Deinit ... Done !!!
    

    我的问题是:

    1. 确保自定义操作员更改完全反映在目标上的正确流程是什么?

    2. TIDL 运行时预计会在哪里找到自定义运算符在目标上的实现、该运行时如何为已受支持的运算符定位并调用相应的逻辑?

    3. 在不依赖 SDK 中提供的预编译库的情况下、构建 TIDL 运行时和自定义操作符为目标提供支持的正确过程是什么? 具体而言、我们如何确保 从源代码全面重建所有相关组件?