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:AM62x:如何使用自定义 tflite 模型从 TIDL 工具获取工件

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1516777/sk-am62a-lp-am62x-how-to-obtain-artifacts-from-tidl-tool-using-custom-tflite-model

器件型号:SK-AM62A-LP
主题:AM62A7 中讨论的其他器件

工具/软件:

TI 开发大家好、

这是一个基本的自定义模型,我在 tesorfollow/keras 上构建,并将其转换为 tflite 文件。 该模型为非图像模型。

我将 tflite 文件复制到/model/public.内的 edgeai_tidl_tool 目录 我已经在 github.com/.../model_configs.py 中提供了模型配置 、但我不确定是否提供了正确的模型配置。 模型配置如下所示。

“CL-TFL_custom_model":“:create_model_config (
    TASK_TYPE=“Classification",“,</s>、
    Source=dict(
      model_url=“",“,</s>、
    )、
    preproception=dict(
      调整大小=256
      作物=224
      data_layout=“NHWC",“,</s>、
      resize_with_pad=False
      REVERSE_CHANNES=False
    )、
    Session=dict(
      Session_name=“tflitt",“,</s>、
      model_path=os.path.join (models_base_path、“test_model.tflite")“)、
      Input_Mean=[127.5127127.5127.5]
      INPUT_SCALE=[1 / 127.51/127.5、1/127.5]
      Input_optimization=True
    )、
    extra_info=dict (num_images=numImages、num_class=1001)、
  )、
我还使用以下内容更新了 tfl_delegate.py。
以下是 tflite 模型的输入和输出详细信息。 我是否可以询问是否正确设置了 INPUT_MEAN 和 INPUT_SCALE?

e2e.ti.com/.../Test_5F00_tflite.zip

此致、

密钥

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

    Hi Key、

    我认为你上传的文件是坏的,不知何故。 您能尝试重新附加这些文件吗?

    通常、对于非视觉模型、它需要您编写一些代码进行预处理和后处理。 model_configs 和数据预/后处理为视觉模型构建。

    平均值/刻度假设您有一个带 3 个通道的 3D(通道,高度,宽度 (CHW)) 输入、其中平均值和刻度是要应用于 H、W 尺寸中每个值(像素)的值。  

    您的模型的输入/输出是什么样子的?  

    对于非图像型号、您可能会发现 jupyter 笔记本电脑(下面随附免责声明)更简单。 与 osrt_python/tfl 文件相比、这些文件携带的代码/行李更少--这种行李对于基于图像的模型非常有用... 对于其他类型来说不是太多。  

    • https://github.com/TexasInstruments/edgeai-tidl-tools/blob/master/examples/jupyter_notebooks/custom-model-tfl.ipynb (用于 TFLite 型号)
      • 您将需要编写预处理函数、提供一些您自己的校准数据、并(可选)为使用这些伪影进行推理的后续单元编写后处理函数
    • 免责声明:我发现 jupyter 一般在运行时间较长的单元上可能不稳定,导致内核崩溃。 有时、我会在我们的工具(编译期间)以及过去的非 TI 笔记本(资源使用量/运行时较高)中看到这种情况。 如果是这种情况、我建议将代码提取到独立的 python 脚本中

    BR、
    Reese

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

    您好 Reese、

    我能够在 x86 PC 上构建并执行自定义模型的推理。 是否有任何可以学习如何在目标器件上进行推理的指南? 据我所知、在目标设备上运行部署需要模型工件。

    此致、
    密钥

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

    您好:  

    有关在目标器件上运行的信息、请参阅下面链接的文档。 如您所说、您需要在 PC 上编译产生的模型工件。  

    对于端到端应用、请参阅 Edge AI SDK 文档:

    BR、
    Reese

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

    您好 Reese、

    这是否意味着我需要将 EDGEAI TIDL 工具克隆到 EVM 板上并像在 PC 上那样运行推理?

    此致、
    密钥

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

    Hi Key、

    是的。 您应该克隆目标上的存储库、但无需运行安装脚本。 我们在 EVM 上运行的 SDK 已安装所有依赖项。 可能需要在 EVM 上获取 setup_env.sh 脚本。  

    从 PC、您需要将模型/和模型工件/目录传输到 EVM 到新克隆的 edgeai-tidl-tools 中

    EVM 上应使用 PC 上的相同推理脚本。  

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

    您好 Reese、

    我想提出并阐明如何生成模型工件。 下图是我在 PC 上通过自定义编译和推理脚本生成的工件。 正确吗?

    在 EVM SDK 上、当我运行 setup_env.sh 时、找不到 tidl_tools 目录。

    当我运行推理脚本时,推理工作正常;但有几个错误指示。 “那有什么问题吗?

    此致、
    密钥

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

    Hello Key、

    模型工件(来自文件夹结构)看起来正常。 已解析您的模型以创建名为“3"的“的子图

    不过、当我看到“1 个节点“被委派给 TIDL 的消息时、我会担心。 您的网络是否只有一层? 我预计不会、因此可能会出现编译错误。  

    推理中的错误是个问题、是的。 尝试以下设置、然后重新运行推理(建议先重新启动,以防前一个错误具有持久的副作用):

    • 导出 TIDL_RT_DEBUG=1
    • /opt/vx_app_arm_remote_log.out 和#在后台运行
    • 在 examples/osrt_python/common_utils.py 中设置 debug_level=2、以获得更详细的输出、并通过上面的日志记录实用程序查看其他消息

    我想我对 setup_env.sh 的看法是错误的--这是一个新终端环境中的 PC。 我对错误的建议表示歉意。 我相信您只需要设置 SO=am62a 环境变量。  

    BR、
    Reese

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

    您好 Reese、

    此自定义模型包含 1 层 (Conv2D)、因为我想测试它是否正常工作。  

    我无法获取  vx_app_arm_remote_log.out。 我在 WSL 和主目录上设置 tidl 工具。 我已经在自定义编译和推理文件中设置 debug_level=2。 在遵循了建议的设置(导出 TIDL_RT_DEBUG=1 和 DEBUG_LEVEL=2)后、我上传了日志文件。  

    e2e.ti.com/.../inference_5F00_log.log

    此致、

    密钥

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

    Hi Key、

    它、用于测试的单层网络。 这是合理的--只是需要确保这是预期的、而不是模型解析错误的结果。  

    这看起来您在这里的 WSL / PC 上运行、对吧? 这里的日志看起来是正确的--我看不到任何问题。  

    但您在 EVM 上似乎有不同的体验。 您能否在 EVM 上为您的模型生成具有相同配置的日志?

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

    您好 Reese、

    这是 EVM 上推理的日志文件。

    运行良好。 您在日志文件中是否注意到任何内容?

    e2e.ti.com/.../8306.output.log

    此致、

    密钥

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

    Hi Key、

    此日志肯定包含错误--模型未能正确初始化。 它看起来仍然在这里运行推理、TIDL 栈继续显示类似的 TIOVX / Vx_zone_error 消息、指示模型实际上并未运行。 我怀疑最终输出数据实际上是垃圾的。

    因此、我们发现、相同的模型工件正在利用 TIDL 仿真的 PC 上正常工作、但无法在目标上初始化。 日志 并不 指示与存储器相关的问题、这是通过 PC 端仿真进行推理与在目标进行推理之间的常见差异来源。

    因此、我们需要确定为什么只能看到 EVM/目标端故障。 如果您为我提供模型工件目录以及您正在使用的任何脚本、可能会有所帮助。  请:

    • 重置 EVM --请执行完整的下电上电操作!
    • 登录后立即在 EVM 后台运行`/opt/vx_app_arm_remote_log.out &`。 这在寻找仅针对目标的问题时尤其重要
    • 再次为此模型运行您的应用程序--只需 2-3 次迭代即可。  
      • 以 DEBUG_LEVEL=2(或 DEBUG_LEVEL=5 以实现最大详细程度)运行
      • 导出 TIDL_RT_DEBUG=1

    BR、
    Reese

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

    您好 Reese、

    我已经按照你的建议做了;然而,我仍然看到相同的信息。  

     vx_app_arm_remote_log 文件中的消息位于 zip 文件中。 模型工件、tflite 模型和推理脚本附加在 zip 文件中。 请看一下、并告诉我您的意见。

    e2e.ti.com/.../5826.custom.zip

    此致、
    密钥

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

    您好 Reese、

    我从已安装 SDK 的学院收到了 EVM am62a7。 该 EVM 上已安装版本为 10.00.xx.xx。 是否需要在 10.1 版上运行所有 tidl 工具和 SDK?

    在我本地 PC 上使用 tidl 工具版本 10.00.xx.xx 编译模型后、推理正常运行、没有 TIDL 图错误、就像您展示的那样。

    此致、

    密钥

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

    Hi Key、

    是的、SDK、tidl 工具和模型工件必须都适用于同一个 SDK。

    我通常会在输出日志中看到更清晰的消息、指示某些版本不匹配。 这将从 vx_app_arm_remote_log.out 实用程序显示、并且必须在后台运行、然后才能使用 debug_level=2 开始推理。  

    相关常见问题解答: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1455079/faq-edge-ai-studio-is-sdk-version-important-for-edge-ai-and-ti-deep-learning-tidl-with-c7x-on-am6xa-socs-am62a-am67a-am68a-am68pa-am69a 

    • 可以升级 EVM/SDK 安装 、以使用 10.0 上的 10.1 兼容工具(具有向后兼容特性)。 如有必要、我可以详细了解这一点、但建议使用 10.1 SDK 重新安装。  

    BR、
    Reese

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

    您好 Reese、

    感谢您提供有用的信息。  

    我编译了自定义模型、收到几条错误消息。 请查看以下文件。 取决于尺寸。


    e2e.ti.com/.../2110.log_5F00_message.txt

    此致、
    密钥

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

    您好:

    是的、我看到了与我有关的内容:

    >54: [TIDL Import]警告:在[]中大于 (2048*2048) 的大小不是最佳

    >96: [TIDL 导入]【解析器】不支持:所有张量维度必须大于零。 对于 tensor SEQUENCE_1/flatten_1/Reshape_6、id 8 - Dim 4 为 0 -[tidl_import_common_model_check.cpp、2310]

     >97: [TIDL Import]警告:[SEQUENTIAL_1/DENDY_1/MatMul;SEQUENTIAL_1/RE_LU_2_1/Relu;SEQUENTIAL_1/DENDY_1/BiasAdd]中大于 (2048*2048) 的大小不是最佳的

    看起来您有一个非常大的 MatMul (>2048^2)。 这是正确的吗?

    否则、我怀疑整形维度为 0 会使我们的模型解析器混淆。 如果不需要维度、则应省略该值(例如,3 个维度值而不是 4 个维度值、例如[1,256,256,0]应该是[1,256,256])。 有时、形状解析不正确、并且假定的值比模型实际使用的值大得多。 这会导致张量尺寸非常大、并显示类似上述错误。  

    此处的编译日志确认问题处于编译阶段、并与解析模型的方式有关。  

     您的模型实际上有这么大的 MatMul 吗? 如果是、则需要将其修整为更小的尺寸、以便 TIDL 导入和运行模型  

    BR、
    Reese

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

    您好 Reese、

    我修改模型的尺寸、它没有显示之前的消息。
    然而,我在 tidl 编译期间收到了另一个关于校准的警告。  
    在将 tflite 模型导入 tidl 工具之前、我将 keras (float32) 量化为 tflite (int8)。 我在编译 tflite 模型时看到一条警告、如下面的 txt 文件所示。

    e2e.ti.com/.../4786.log.txt

    这是 执行推理脚本时的消息日志。 它表明其中一个节点未卸载到 c7x。  

    e2e.ti.com/.../1832.output.log

    此致、

    密钥

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

    您好:

    您有一个不受支持的图层:  

    ----------------------------------------------------------------------------------------------------------------------------------------------
    | Node |                    Node Name                    |                                      Reason                                       |
    ----------------------------------------------------------------------------------------------------------------------------------------------
    | MEAN | functional_31_1/global_average_pooling2d_1/Mean | 3x3,2x2s,1x1 with stride 1 and stride 2 (both horizontal and vertical dimensions) |
    ----------------------------------------------------------------------------------------------------------------------------------------------

    这种情况下可能不支持图层配置、例如大型平均池内核。 以下存储库的文档中列出了支持的层配置:  

    顾名思义、您的泳池是否是全球平均水平的泳池?

    其他警告与校准不足有关。 这看起来像是来自第二个子图。 这可能意味着第一个子图+非卸载节点产生的一些数据不足以完成第二个子图的校准输入数据。  

    我的建议是将不受支持的 Mean 图层修改为受支持的版本。 对于较大的内核大小(例如 9x9)、标准做法是修改网络架构、使其通过一系列较小的内核大小来实现。  我们通常使用 ONNX 网络中的大型 maxpool 来实现此目的:

    BR、
    Reese

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

    您好 Reese、

    错误与我将 pool_size 设置为 (3、3) 且将步幅大小保留为空的最大池步幅有关。 一旦我将泳池大小和跨度设置为 (2 ),它就能很好地工作。 我对从 keras 模型到 onnx 模型的转换还有另一个担忧。 有一个库可以完成工作。 这是一个很好的考虑因素吗?

    我使用 Pytorch 尝试转换和量化为 int8。 但是、 每一层的比例输出以浮点形式显示、一些零点位于 int32 中、如下面的 txt 文件所示。 我的量化是否正确?

    e2e.ti.com/.../0435.log.txt

    此致、
    密钥

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

    Hi Key、

    很高兴知道池层更改工作:)  

    [引用 userid=“630556" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1516777/sk-am62a-lp-am62x-how-to-obtain-artifacts-from-tidl-tool-using-custom-tflite-model/5862530 #5862530“]我对从 keras 模型到 onnx 模型的转换还有另一个担忧。 有一个库可以完成工作。 这是一个很好的考虑因素吗?

    一般来说是这样的工具是好的,但我发现模型导出从一种格式到另一种格式可以增加一些奇怪的层,技术上实现相同的功能,但在一种奇怪的方式。 对于简单的网络、这很可能没问题、当然值得尝试。  

    我发现 onnxsim (onnx-simulator) 适合清理网络、尤其是在导出/格式更改后。 当某些尺寸(如“批次“)不是固定尺寸、而是使用更多运算符/图层来处理此类动态尺寸时、这尤其有用。  

    您还可以了解的另一个工具是 TI 自己针对 ONNX 模型的模型优化脚本。 这可以应用一系列规则来查找 ONNX 模型中的常见情形,我们可以用更容易解析/加速的替代方案替换某些层/配置。  

    我使用 pytorch 尝试转换和量化 int8。 但是、 每一层的比例输出以浮点形式显示、一些零点位于 int32 中、如下面的 txt 文件所示。 我的量化是否正确?

    量化比例将是 float32、是的。 我倾向于说零点应该是整数、int8 与 int32 的数据类型在这个阶段是可以的。  

    我们的量化工具支持 ONNX QDQ 和 TFlite 量化模型。 您需要将 PyTorch 模型导出为 ONNX QDQ 格式。  

    以下是我们的量化感知培训 (QAT) 文档:  

    BR、
    Reese

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

    您好 Reese、

    QAT 是否优于 PTQ? 目前、我正在使用 PTQ 进行量化。

    我还担心 tflite 模型在使用 TIDL 工具的以下函数进行编译和推理期间的基准测试输出。 我想检查有多少时间卸载到 C7x 上;但是、它返回 0。 当我尝试在推理期间检查子图形 ID 时、没有(_proc_end、_proc_start 等)。 它如下图所示。 在量化或编译过程中、我是否错过了重要内容?

    DEF get_benchmark_output(解释器):
      '''
      返回基准数据

      :param 解释器:运行时会话
      :返回:复制时间
      :返回:总时间
      返回:处理时间
      :返回:写入时间
      :返回:读取时间
      '''
      benchmark_dict = interpreter.get_TI_benchmark_data ()
      PROC_TIME = COPY_TIME = 0
      CP_IN_TIME = CP_OUT_TIME = 0
      子图形 IDs =[]
      对于 benchmark_dict.keys() 中的 stat:
        打印(状态)
        如果 stat 中的“proc_start":“:
          subgraphIds.append (int (re.sub(“[^0-9]““",“,stat、stat)))
      对于 I IN 范围 (len (subgraphIds)):
        PROC_TIME +=(
          Benchmark_dict[“bottage_"<xmt-block0>“ ts + str (subgraphIds[i])+“_proc_end"]</s>“
          - benchmark_dict[“bench_dict"<xmt-block0>“ ts:subgraph_“+ str (subgraphIds[i])+“_proc_start"]</s>“
        )
        CP_IN_TIME +=(
          Benchmark_dict[“subgraph_"<xmt-block0>“ ts + str (subgraphIds[i])+“_copy_in_end"]</s>“
          - benchmark_dict[“subgraph_"+<xmt-block0>“ ts str (subgraphIds[i])+“_copy_in_start"]</s>“
        )
        CP_OUT_TIME +=(
          Benchmark_dict[“bottage_"<xmt-block0>“ ts + str (subgraphIds[i])+“_copy_out_end"]</s>“
          - benchmark_dict[“subgraph_"+<xmt-block0>“ ts str (subgraphIds[i])+“_copy_out_start"]</s>“
        )
        COPY_TIME += CP_IN_TIME + CP_OUT_TIME
      打印 (proc_time)
      Write_Total = bench_dict[“DDR:READ_END“]- bench_dict[“DDR:READ_START“]
      READ_TOTAL = benched_dict[“DDR:write_end“]- benched_dict[“DDR:write_start“]
      totaltime = bench_dict[“benchmark_dict["run_end"]<xmt-block0>“ ts“ ts - benchmark_dict[“benchmark_dict["run_start"]<xmt-block1>“ ts“ ts

      copy_time = copy_time、如果 len (subgraphIds)== 1、则为 0
      返回 COPY_TIME、totaltime、proc_time、write_total / 1000000、READ_TOTAL / 1000000
    此致、
    密钥
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Hi Key、

    QAT 优先于 PTQ 吗? 目前、我正在使用 PTQ 进行量化。
    [/报价]

    在努力与利益之间取得平衡

    由于训练/反向传播在循环中、QAT 通常预计可提供更高的精度、但这需要付出更多努力。

    PTQ 对于训练良好的模型通常足够好(误差的 1-2%)、这意味着架构遵循如下所示的链接中所示的指导原则:

    我想检查将多少时间卸载到 C7x 上;但是、它返回 0。 [/报价]

    因此、get_TI_benchmark_data() 给出的字典的值只有 0? 您是在目标 SOC 上还是在 PC 上运行?

    • 如果您在目标上、请提供推理命令的打印输出。 我们至少应该看到如下所示的内容:
      •  子图形数量:1 个节点中委派了 1 个节点

    我们可以通过仿真在 PC 上提供位精确输出、但不能进行精度估算。 C7xMMA 仿真器具有位精确度、但不具有周期精确度。  

    BR、
    Reese

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

    您好 Reese、

    我在 PC 上运行它来查看性能基准测试。  get_TI_benchmark_data () 给出 (run_start、run_end、read_start、read_end、write_start、 和 write_end) 仅在编译和推理以及卸载时间 0 期间可用。 我曾尝试使用 TIDL Tools (MobileNet、即 Inception) 的模型、并显示总运行时间和卸载时间。 下图是 mobilenetv1(子图和基准输出)上的推理列表。  

    此致、
    密钥

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

    Hi Key、

    好的、这是预期的行为

    get_TI_benchmark_data() 将返回正确格式的数据字典、但由于该工具在 PC 上的周期不精确、因此它将返回不表示可实现的性能的数据。 要获取性能信息、您需要在目标上运行该程序。

    它仍然可以为 PC 上的相同接口收集此运行时信息、但这将是 PC 的 CPU 时间。 这将比目标加速器慢得多

    BR、
    Reese

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

    您好 Reese、

    感谢您的指导和反馈。
    我将结束这一主题,因为我已经实现了我的要求。 如果我遇到另一个问题、我将打开一个新主题。

    此致、

    密钥