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.

[参考译文] TMS320F28P559SG-Q1:在 NPU 上部署 Tflite

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1613753/tms320f28p559sg-q1-deploying-tflite-on-npu

器件型号: TMS320F28P559SG-Q1

尊敬的专家:

我正在尝试探索 TMS320F28P559 LaunchPad、特别是 NPU。 我可以看到、使用边缘 AI 模型编写器从最终与 Code Composer Studio 工程集成的数据中生成文件。

我想知道我们是否可以使用.tflite 文件、该文件是使用 Python tensorflow 建模和生成的。

如果它可以是锥形,我是否可以知道如何在 Python Tesnorflow 上实现这一点的逐步过程? 此外、请告诉我用于实现这一目标的工具。

谢谢、

Rajesh。

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

    嗨、Rajesh

    如果可以使用.tflite 文件、我来与编译器团队交谈。 我会在得到答案后立即回复您。

    谢谢你  

    Amir Hussain

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

    嗨、Rajesh


    TI 编译器仅支持 TI-NPU 的 PyTorch/ONNX 流程。

    谢谢你  

    Amir Hussain

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

    感谢您的回复 Hussain!


    请分享说明分步过程(将 Pytorch/ONNX 与 TMS320F8P55 NPU 集成)的文档。

    谢谢、

    Rajesh。

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

    嗨、Rajesh

    数字电源 SDK 中提供了相关文档。 您可以使用下面的链接下载最新的 SDK
    https://www.ti.com/tool/C2000WARE-DIGITALPOWER-SDK#downloads
    下载后、请在以下目录中找到相关文档和固件

    C:\ti\c2000ware-digital-power-sdk\solutions\tida_010955

    您还可以在下面找到相关电路板的详细信息

    https://www.ti.com/tool/TIDA-010955

    谢谢你  

    Amir Hussain

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

    亲爱的埃米尔、

    我也介绍了示例和文档。 视频介绍了如何使用边缘 AI 验证项目、我想我已经理解了。

    说到我的问题、我正尝试使用 F28P55 实现一个简单的问题。

    目标:

    NPU 进行正常电弧和异常电弧检测

    2. CPU 中断管理,包括 NPU

    除 NPU 相关之外、还实现了其他目标 、即 CPU 计时器、ADC、PWM 等 Re NPU、NPU 部分已经完成、例如、 使用 EdgeAI 生成伪影并将其复制到工程中。 下一个重要部分是将这些工件集成到工程中并最终集成到 NPU 上、我认为这部分没有在文档中明确说明、这可能不是您分享的工程的目标。

    如果您能更清楚地解释如何初始化 NPU 以及如何 将数据传输到 NPU、这将非常有用。  

    TI 共享的工程让人有点不知所措、因为它包含太多文件、如 FFT、HAL、模型选择、检测、数据 采集等、手册中没有对这些文件进行说明。 我可以理解这些文件与您的目标相关,但我的目标太简单了 — 将 1D 数据传输到 NPU 并 等待 NPU 中断!

    我正在共享我的 projecte2e.ti.com/.../6471.pwm_5F00_p55.zip 、并且复制了 EdgeAI 生成的工件。

    我试图 在定义和包括后调用 main.c 源文件上的 tvmgen_default_run() 函数

    #include "tvmgen_default.h"
    
    struct tvmgen_default_inputs inputs;
    struct tvmgen_default_outputs outputs;

    然后尝试使用向 NPU 发送数据  

            for(m = 0; m < 256;m++)
            {
                input_buffer[m] = 2;
                inputs.onnx__Add_0 = input_buffer;
            }
    
            tvmgen_default_run(&inputs, &outputs);


     使用这条线时、  tvmgen_default_run (&inputs、&outputs)、  编译器抛出内存不足错误、然后添加了以下行以将内存分配给 NPU,并且该错误已被忽略:)   
                         .rodata.tvm     : > FLASH_BANK3  // Place read-only TVM data in FLASH
                         .bss.noinit.tvm : > RAMGS3, type=NOINIT  // Place uninitialized TVM BSS in SRAM (NOINIT prevents zero-init overhead)

    但是、仍然存在的错误很少
    误差 1:
    未解析的符号 Interrupt_disable、首先在./artifacts/mod.a 中引用 PWM_P55 C/C++问题
    误差 2:

    说明资源路径位置类型
    未解析的符号 Interrupt_enable、首先在./artifacts/mod.a 中引用 PWM_P55 C/C++问题

    即使这些错误已经解决、我也不知道 NPU 是否能够被调用并成功满足目标。

    请解释或分享介绍如何初始化数据并将数据传输到 NPU 的精确文档。

    此外,我在 工件文件中看到 TI_NPU_INIT () 函数,但它不会直接指向任何函数。

    希望您理解我的问题。

    请帮助我解决这个问题!

    谢谢、

    Rajesh。

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

    嗨、Rajesh

    我知道您想 将 1D 数据传输到 NPU 并 等待 NPU 中断!

    当前工程不使用 NPU 中断。 此外、 我们无意让客户直接对 NPU 进行编程、而是使用我们的边缘 AI 工具 https://dev.ti.com/edgeaistudio/ 在 C2000 器件的 NPU 上对推理引擎进行建模/部署。

    谢谢你  

    Amir Hussain

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

    亲爱的埃米尔!
     
    正如我在之前的消息中提到的 (  使用 EdgeAI 生成伪影)、  明确表示我已使用边缘 AI 生成工件以对 NPU 进行编程。 因此、我认为、再次提供边缘 AI 链接是可行的 没有帮助 最大优点。 根据提供的文档中的说明、将边缘 AI 生成的模型复制到工程中。

    我的问题或我的意图不是直接对 NPU 进行编程、我只想用命令调用 NPU   tvmgen_default_run (&inputs、&outputs); 正如文件 tvmgen_defaults 所说的那样!

    命令   tvmgen_default_run 中清楚地提到了 tvmgen_defaults.h 由生成 边缘 AI 下面显示的示例供您参考

    /*****************************************************************************/
    /* Copyright (c) 2025 Texas Instruments Incorporated                         */
    /* http://www.ti.com/                                                        */
    /*                                                                           */
    /*  Redistribution and  use in source  and binary forms, with  or without    */
    /*  modification,  are permitted provided  that the  following conditions    */
    /*  are met:                                                                 */
    /*                                                                           */
    /*     Redistributions  of source  code must  retain the  above copyright    */
    /*     notice, this list of conditions and the following disclaimer.         */
    /*                                                                           */
    /*     Redistributions in binary form  must reproduce the above copyright    */
    /*     notice, this  list of conditions  and the following  disclaimer in    */
    /*     the  documentation  and/or   other  materials  provided  with  the    */
    /*     distribution.                                                         */
    /*                                                                           */
    /*     Neither the  name of Texas Instruments Incorporated  nor the names    */
    /*     of its  contributors may  be used to  endorse or  promote products    */
    /*     derived  from   this  software  without   specific  prior  written    */
    /*     permission.                                                           */
    /*                                                                           */
    /*  THIS SOFTWARE  IS PROVIDED BY THE COPYRIGHT  HOLDERS AND CONTRIBUTORS    */
    /*  "AS IS"  AND ANY  EXPRESS OR IMPLIED  WARRANTIES, INCLUDING,  BUT NOT    */
    /*  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR    */
    /*  A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT    */
    /*  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,    */
    /*  SPECIAL,  EXEMPLARY,  OR CONSEQUENTIAL  DAMAGES  (INCLUDING, BUT  NOT    */
    /*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,    */
    /*  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY    */
    /*  THEORY OF  LIABILITY, WHETHER IN CONTRACT, STRICT  LIABILITY, OR TORT    */
    /*  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE    */
    /*  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.     */
    /*                                                                           */
    /*****************************************************************************/
    /*
     * Generated by TI MCU NNC 2.1.0
     * cross-compiler: C:\ti\ti_cgt_c2000_22.6.2.LTS\bin\cl2000
     * cross-compiler-opts: --abi=eabi -O3 --opt_for_speed=5 --c99 -v28 -ml -mt --gen_func_subsections --float_support=fpu32 -IC:\ti\ti_cgt_c2000_22.6.2.LTS\include -IC:\ti\C2000Ware_5_04_00_00\driverlib\f28p55x\driverlib -IC:\ti\C2000Ware_5_04_00_00\device_support\f28p55x\common\include -I. -Iartifacts --obj_directory=.
     * input model file: C:\Users\rks68146\EdgeAIRoot\8d7ddb4dd46ce1e8\projects\7382ba70\train\20260211-121643\output\training_quantization\model.onnx
     * module name: default
     */
    
    #ifndef TVMGEN_DEFAULT_H_
    #define TVMGEN_DEFAULT_H_
    #include <stdint.h>
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    /* Symbol defined when running model on TI NPU hardware accelerator */
    #define TVMGEN_DEFAULT_TI_NPU
    #ifdef TVMGEN_DEFAULT_TI_NPU_SOFT
    	#error Conflicting definition for where model should run.
    #endif
    
    /* The generated model library expects the following inputs/outputs:
     * Inputs:
     *    Tensor[(1, 1, 256, 1), int8]
     * Outputs:
     *    Tensor[(1, 2), int8]
     */
    
    /* Input feature normalization parameters:
     *   input_int = clip(((int32_t)((input_float + bias) * scale)) >> shift, min, max)
     *   where (min, max) = (-128, 127) if int8 type, (0, 255) if uint8 type
     */
    #define TVMGEN_DEFAULT_BIAS_LEN 1
    #define TVMGEN_DEFAULT_SCALE_LEN 1
    #define TVMGEN_DEFAULT_SHIFT_LEN 1
    extern const float tvmgen_default_bias_data[] __attribute__((weak)) = {8.099171};
    extern const int32_t tvmgen_default_scale_data[] __attribute__((weak)) = {154};
    extern const int32_t tvmgen_default_shift_data[] __attribute__((weak)) = {7};
    
    
    /* TI NPU hardware accelerator initialization */
    extern void TI_NPU_init();
    
    /* Flag for model execution completion on TI NPU hardware accelerator */
    extern volatile int32_t tvmgen_default_finished;
    
    
    /*!
     * \brief Input tensor pointers for TVM module "default" 
     */
    struct tvmgen_default_inputs {
      void* onnx__Add_0;
    };
    
    /*!
     * \brief Output tensor pointers for TVM module "default" 
     */
    struct tvmgen_default_outputs {
      void* output;
    };
    
    /*!
     * \brief entrypoint function for TVM module "default"
     * \param inputs Input tensors for the module 
     * \param outputs Output tensors for the module 
     */
    int32_t tvmgen_default_run(
      struct tvmgen_default_inputs* inputs,
      struct tvmgen_default_outputs* outputs
    );
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif // TVMGEN_DEFAULT_H_
    

    上述代码 1 中有 3 个重要部分。 初始化;2. 输入和输出 3.调用 NPU 4. 等待完成。  

    初始化:  

    TI_NPU_INIT ();

    2、输入和输出:  

    结构 tvmgen_default_inputs{
    void* onnx__add_0;
    };
    结构 tvmgen_default_outputs{
    Void*输出;
    };

    调用 NPU
    tvmgen_default_run (
    结构 tvmgen_default_Inputs*输入、
    结构 tvmgen_default_outputs*输出
    );

    4.等待完成
    tvmgen_default_finished;

    另请参阅  * TMS320F28P55x 实时微控制器技术参考手册(修订版 C)、 ON 第 108 页 下表清楚地显示 int 9.16  是 NPU 中断、当然可以使用矢量表寄存器启用它。 但是、NPU 不适用于 PieVectTable 结构。 因此、我不明白为什么我们无法 通过调用边缘 AI 生成的函数并等待 CPU 的 NPU 中断来调用 NPU!  我认为 Delaney Woodward 是正确的人来评论这个 Wink

    如果我的理解有误、请告诉我、并说明我需要在哪里纠正该程序才能正常工作。

    谢谢、

    Rajesh。

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

    嗨、Rajesh

    请留出一些时间来 找到回答您的问题的最佳人选。

    谢谢你  

    Amir Hussain

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

    尊敬的 Rajesh:

    您的理解是正确的。 如果您指定要在编译阶段使用任一训练工具将模型工件编译到 NPU、“TI_NPU_INIT ()“函数将处理 NPU 中断初始化、NPU 上的计算完成由“tvmgen_default_finished"标志“标志指示。

    谢谢、

    Jiaxin

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

    您好 Jiaxin!
    感谢您的回答。  

    因此、检查' tvmgen_default_finished“   高/低向我显示“ if ( tvmgen_default_finished =1/0)“ 。 在这种情况下、不是让 CPU 保持空闲状态 并等待标志吗? 这破坏了中断的目的!  

    谢谢、

    Rajesh。

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

    尊敬的 Rajesh:

    调用 NPU 后、CPU 将释放用于其他任务。 该标志只是标记 NPU 的完成。 工作方案与 CLA 类似。

    谢谢、

    Jiaxin

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

    亲爱的嘉信

    据我所知、NPU 是与任何其他外设一样的独立硬件、但是我在中断 ISR 向量结构中看不到 NPU 的 ISR 与 CLA 类似。

    谢谢、

    Rajesh。

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

    尊敬的 Rajesh:

    我明白了你的观点。 NPU 是一种闭合 IP、用户无法访问该级别。 低端逻辑由硬件本身自动处理。

    谢谢、

    Jiaxin

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

    尊敬的 Jiaxin:
    明白了! 我无法访问 NPU 的中断。

    但是、在 TMS320F28P55x 实时微控制器技术参考手册(修订版 C)的第 108 页上 、中断表明确显示了 NPU INT9.16. 我不明白为什么它显示在表中, 如果我没有访问它.  只是出于好奇心而问。

    谢谢、

    Rajesh。

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

    亲爱的嘉信!

    是否有任何更新?

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

    尊敬的 Rajesh:

    很抱歉晚回复。 是的、您是对的。 我将与团队讨论、我们可能会在以下修订中将其删除。

    谢谢、

    Jiaxin