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-J784S4:有关从 A72触发到 J784S4板上 C7x_1内核的模型推理指南

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1504503/processor-sdk-j784s4-guidance-on-model-inference-triggering-from-a72-to-c7x_1-core-on-j784s4-board

部件号:PROCESSOR-SDK-J784S4

工具/软件:

尊敬的   Santosh Jha  Nikhil Dasan Tarun Mukesh Puvada

我正在开发 J784S4定制板、该定制板目前从 Linux 内核(Cortex-A72)触发模型推理、并使用 TIDL (TI 深度学习)在 C7x_1内核上执行模型推理。 我想澄清一下如何从 A72内核到 C7x_1内核初始化模型推理。

我知道此过程可能涉及处理器间通信(IPC)、但我不清楚模型的触发机制。 具体而言、我正在调查位于./Firmware/SDKs/ti-processor-sdk-09_02_00/ti-processor-sdk-rtos-j784s4-evm-09_02_00_05/vision_apps/out/J784S4/A72/LINUX/release/libtivision_apps.so.9.2.0的共享目标文件是否负责促进此模型触发。 但是、我无法识别编译到此库中的源文件、也无法理解它是如何启动推理过程的。

我们使用 Python 脚本 tflrt_delegate.py 来运行推理、我认为它利用 TFLite 运行时和 TI 的代理人来卸载到 C7x_1内核。

您能否提供以下方面的详细指导:

  1. 在该系统中、模型推理是如何从 Linux A72内核触发到 C7x_1内核的?
  2. libtivision_apps.so.9.2.0库在此过程中发挥着什么作用?
  3. Processor SDK (版本09_02_00_05)中是否有详细说明 IPC 通信和模型卸载机制的特定源文件或文档?
  4. tflrt_delegate.py 脚本如何与底层系统交互以促进 C7x_1内核上的推理?
  5. TIOVX 内核在模型推理方面的作用/责任是什么?它们是否针对 RTOS 实施?

任何见解、代码示例或对相关文档的引用都将非常感谢、以帮助我更好地了解 J784S4平台上的推理工作流程。

感谢您的支持。



尽快等待您的答复
提前感谢
Swedha R

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

    尊敬的 Swedha:

    这将需要进行一些研究、以收集答复所需的所有信息。  请在下周初与我联系、我应该完成一些研究。

    Chris

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

    尊敬的 Chris Tsongas

    感谢您的回答。

    等待您的回复、

    Swedha R

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

    您好 Chris TsongasTarun 
    上面简要介绍的有关模型推理查询的任何输入。

    提前感谢、
    Swedha R

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

    尊敬的 Swedha:

    1. tflite 运行时代理是 TI 支持的 tiovx 框架之上的包装器。 它使用 openvx 概念将存储器从 a72分配到共享存储器中、并创建一个 tidl 节点、通过向 c7x 内核发送 IPC Notify 来运行用 FreeRTOS 编写的目标 PROCESS_CALLBACK 函数来触发该节点

    2. libtivision_apps.so.9.2.0库具有 tiovx 框架的 API 定义。

    3、它由 tiovx 框架处理、您可以在$(psdkra)/vision_apps/apps/dl_demos/中看到一些基本的 tidl 演示

    4.正如我所说的、tflite 运行时有一个包装器用于它的初始化、准备、调用 API、并使用 TIDL_create TIDL_invoke 的 tiovx 实现、它会创建 openvx 图形和节点并执行它。

    5.当处理在 c7x 内核中完成时、它运行 FreeRTOS、因此 tiovx 内核在 RTOS 中实现。 tiovx 框架不包括要在主机和目标上注册的内核、以便它可以发送 IPC Notify 以执行内核函数。

    有关所有这些代码的实现、您可以参考$(psdkra)/c7x-mma-tidl/arm-tidl/和$(psdkra)/c7x-mma-tidl/ti_dl/目录。

    此致、
    Gokul

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

    尊敬的 Swedha:

    请在新主题中列出您的其他问题。  请将每个 E2E 主题重点放在一个主题上。

    此致、

    Chris

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

    您好、Chris、
    没问题。

    Gokul S 请尽快答复上述问题

    提前感谢
    Swedha R

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

    尊敬的 Gokul S

    您能否对上述答复和我分享的日志作出答复? 需要快速知道它是什么。

    提前感谢、
    Swedha R

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

    尊敬的 Swedha:

    在没有 Linux 的情况下可能做到这一点、但既没有记录也不鼓励这样做。  由于您刚刚开始使用此工具、请首先按照记录的流程进行操作。   

    此致、

    Chris

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

    尊敬的 Sweda:

    我无法从日志中看出很多内容、但这里是一种更好的调试方法。  列出 outDataNamesList =(TIDLRT 指令)中的输出、例如:

    outDataNamesList ="output_0、output_1"

    假设两个输出张量都是1x3x320x320的两个图像、您使用 int8运行此图像(numParamBits = 8)。  运行后、假设您的输出文件是 tidl_out.bin (这会因您的设置而异)。  然后、您可以使用这个简单的 Python 脚本解析输出。  脚本生成 PNG 文件、但您只需转储张量内容即可。  无需打印输出。    

    如果您对中间层感兴趣、请查看 ONNX 文件并将该名称作为输出列出、然后执行相同的操作。  例如、假设您希望 AvgPool 图层的输出被称为"/custom_bone/AveragePool_2"。 只需查看 ONNX 文件、查找名称、然后将其添加到 outDataNamesList。

    e2e.ti.com/.../binTensorToImage.py

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

    尊敬的 Chris Tsongas
    感谢您的及时回复。 我将对此进行研究。

    但有人认为我不清楚、如何在 A72内核中运行模型脚本、如何使用 tiovx 框架卸载到 c7x_1?
    我想了解这个流程(TIDL-A72 TIOVX、C7X_1)。  

    #创建 TFLite 解释器对象
    解释器= tflite.Interpreter (model_path=tflite_file_path、\
            实验性代表=[tflite.load_delegate ('libtidl_tfl_delegate.so'、delege_options)])
    INPUT_FRAME = FRAME
      interpreter.set_tensor(input_details[0]['index']input_frame)
     
      #调用调用
      start_time = time.time ()
      interpreter.invoke
      stop_time = time.time ()
    这个调用, intrepreter 所有这些 API 的地方没有明确提到。

    您是否有任何文档来了解当前设置(从 a72->c7x_1卸载模型)?

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

    尊敬的 Swedha:

    这不是我的专业领域。  但据我所知、TIDL 模型在 OpenVX 中作为一个节点运行、负责运行可在 C7x/MMA 和 A72内核上运行的节点部分的网络。  这与在器件上运行 TIDL 模型实际上并不相关、仅用于提供信息而已。   我们不支持在 TIDL 之外的 C7x 或 MMA 上运行工作站、因此强烈建议不要这样做。  此外、我不知道有任何关于此方法的文档(概览除外)。

    此致、

    Chirs.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引述 userid="637485" url="~/support/processors-group/processors/f/processors-forum/1504503/processor-sdk-j784s4-guidance-on-model-inference-triggering-from-a72-to-c7x_1-core-on-j784s4-board/5792657 #5792657"]

    尊敬的 Swedha:

    1. tflite 运行时代理是 TI 支持的 tiovx 框架之上的包装器。 它使用 openvx 概念将存储器从 a72分配到共享存储器中、并创建一个 tidl 节点、通过向 c7x 内核发送 IPC Notify 来运行用 FreeRTOS 编写的目标 PROCESS_CALLBACK 函数来触发该节点

    2. libtivision_apps.so.9.2.0库具有 tiovx 框架的 API 定义。

    3、它由 tiovx 框架处理、您可以在$(psdkra)/vision_apps/apps/dl_demos/中看到一些基本的 tidl 演示

    4.正如我所说的、tflite 运行时有一个包装器用于它的初始化、准备、调用 API、并使用 TIDL_create TIDL_invoke 的 tiovx 实现、它会创建 openvx 图形和节点并执行它。

    5.当处理在 c7x 内核中完成时、它运行 FreeRTOS、因此 tiovx 内核在 RTOS 中实现。 tiovx 框架不包括要在主机和目标上注册的内核、以便它可以发送 IPC Notify 以执行内核函数。

    有关所有这些代码的实现、您可以参考$(psdkra)/c7x-mma-tidl/arm-tidl/和$(psdkra)/c7x-mma-tidl/ti_dl/目录。

    [/报价]

    您好、 Gokul SChris Tsongas
    我已经了解了图形的创建方式以及如何使用 $(psdkra)/c7x-mma-tidl/arm-tidl/目录下的代码文件调用图形。

    但我想知道、c7x_1如何获取图形并对其进行处理。 我要查看哪些代码文件?

     ├──ownIpcSendMsg (CPU_id、ipc_payload、……)
    μ│  ├──appIpcSendNotify (vsdk_cpu_id、有效载荷)
    │  │ │ ├──appIpcSendNotifyPort (dest_cpu_id、payload、(uint32_t) obj->prm.tiovx_rpmsg_port_id)-就此、我们从 Linux 一端了解了如何通过发送 graph (node)的描述符来触发/卸载 c7x_1来运行模型推理
    但从这里开始、它将会发生什么? c7x_1是如何处理的?
    int32_t appIpcSendNotifyPort (uint32_t dest_cpu_iduint32_t 有效载荷、uint32_t port_id)
      int32_t 状态=-1
      app_ipc_obj_t *obj =&g_app_ipc_obj;

      /*注意:port_id 在此函数中被取消*/

      if ((dest_cpu_id<APP_ipc_cpu_MAX)&&(obj->TX_FDS[dest_cpu_id]> 0))
      {
        //#ifdef APP_IPC_DEBUG
        appLogPrintf ("IPC:TX:%s ->%s (端口%d) msg = 0x%08x\n"
          appIpcGetCpuName (appIpcGetSelfCpuId ())、
          appIpcGetCpuName (dest_cpu_id)、
          (uint32_t) port_id、
          有效载荷);
        //#endif
        appLogPrintf ("将有效载荷发送到 CPU %d:0x%x\n"、dest_cpu_id、有效载荷);
        状态= 写入(obj->TX_FDS[dest_cpu_id]、&dayload、sizeof (有效载荷));
        if (status < 0 || status!= sizeof (有效载荷))
        {
          appLogPrintf ("IPC:TX:失败:%s ->%s (端口%d) msg = 0x%08x\n"
            appIpcGetCpuName (appIpcGetSelfCpuId ())、
            appIpcGetCpuName (dest_cpu_id)、
            (uint32_t) port_id、
            有效载荷);
        }
        暴露
        {
          状态= 0
        }
      }

      返回状态;
    }

    请就此提供宝贵的意见。

    提前感谢
    Swedha R

     

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

    尊敬的 Chris Tsongas
    感谢您的回答。

    如果可能、请回复以下查询。

    提前感谢、
    Swedha R

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

    尊敬的 Sweda:

    我没有看到任何问题、同样、OpenVX 也不在我的专业领域内;我认为我不能提供比 Gokul 已经做的更多的东西。

    此致、

    Chris

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

    尊敬的 Chris Tsongas
    很抱歉我错误地在下面提到了。 这是你的答复3小时前.  
    是的、我明白。 感谢您的支持。 我将等待戈库尔回答上述问题。

    此致、

    Swedha R

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

    尊敬的 Swedha:

    c7x 内核中有一个 tiovx 任务在等待 IPC 消息。

    任务函数是在$(psdkra)/tiovx/source/framework/vx_target.c  ownTargetTaskMain()中定义的、您可以从此函数跟踪。

    此函数检查从 IPC 接收到的 obj_desc 类型并执行必要的操作。

    此任务对于所有内核都是通用的。

    此致、
    Gokul