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.

[参考译文] TDA4VH-Q1:TIDL 导入和放大器;中流光流模型的量化问题–无效的输出和放大器;QDQ 导入故障

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1509897/tda4vh-q1-tidl-import-quantization-issues-with-neuflow-optical-flow-model-invalid-output-qdq-import-failure

器件型号:TDA4VH-Q1
Thread 中讨论的其他器件:TDA4VHAM69A

工具/软件:

尊敬的 TI 支持:

我正在为部署特征提取器 TDA4VH 消息流 模型 一方 C7x DSP 加速 。 该模型使用以下器件在 CPU 上正常运行:

providers = ["CPUExecutionProvider"]

不过、当切换到:
providers = ["TIDLCompilationProvider", "CPUExecutionProvider"]

I encounter either TIDL compilation errors or the output becomes unusable—either all zeros or NaNs, depending on the setup.

White check mark 工作配置

  • 型号:ONNX (OPset 18)、在 CPU 上运行 FP32

  • 输出:精确

X 失败配置(带 DSP)

我已经使用compile.py(基于)测试了以下编译和量化设置onnxrt_ep.pyedgeai-tidl-tools

  1. QDQ 量化模型 (通过来自 ONNX) quantize_static

    • Xμ s  在编译时失败

    • TIDL 导入错误 :“缺少输入“,拓扑排序失败(见下文)

  2. TIDL 编译期间进行量化

    • Xμ s  在 TIDL 编译时执行 Segfaults (session.run () 与推理模式:0)

    • 带有警告:
      Conv node failure: Name '/custom_backbone/block1_2/conv1/Conv'
      Status Message: Input channels C is not equal to kernel channels * group.
      C: 1 kernel channels: 3 group:

      在发出此警告后、进程段立即发生故障

    • White check marki 求解 Conv 参数 (kernel_size=11、stribution=4、padding=5)、从而允许编译模型。
      但是、输出范围现在很大-3.5e+33 to +2.6e+33 ()、这表明存在量化或数值溢出问题。

QDQ 导入失败详细信息

在尝试编译 QDQ-format 模型(选项 1)时、我收到以下 TIDL 导入错误:

[TIDL Import] [PARSER] ERROR: Layer 53, custom_backbone.block1_dd.conv_block.conv1.weight_DequantizeLinear_Output/duplicated:custom_backbone.block1_dd.conv_block.conv1.weight_DequantizeLinear_Output/duplicated is missing inputs in the network and cannot be topologically sorted. Missing inputs are: 
  -- [tidl_import_common.cpp, 4378]
  Input 0: custom_backbone.block1_dd.conv_block.conv1.weight_DequantizeLinear_Output/duplicated, dataId=116
[TIDL Import]  ERROR: - Failed in function: tidl_optimizeNet -- [tidl_import_core.cpp, 2602]
[TIDL Import]  ERROR: Network Optimization failed - Failed in function: TIDL_runtimesOptimizeNet -- [tidl_runtimes_import_common.cpp, 1287]

TIDL 似乎无法解析重复或重复使用的DequantizeLinear节点、该节点似乎是在 ONNX QDQ 导出期间插入的。

存在许多风险

  • 平台:TDA4VH

  • Python: 3.10.12

  • ONNX opset:18

  • 量化: onnxruntime.quantization.quantize_static

  • TIDL 工具承诺: 1b75e86e79cfddb8f6e181014e6343e89765883d

  • 汇编:根据 edgeai-tidl-tools/onnxrt_ep.py

  • 校准:在两个选项(量化_静态和 TIDL 量化)中使用 100 个测试映像执行

Question 关键问题

  1. 都是已知的 TIDL 量化或导入问题 使用 QDQ 模型(特别是使用重用权重或共享代数线性节点)?

  2. 导致上述导入错误的原因、以及如何构建 QDQ 图形来避免这种情况?

  3. 此内核+跨度组合是否需要在校准中进行特殊处理?

  4. 量化后如此巨大的输出范围是否有一个已知原因?

可用于调试

如果有用、我可以提供以下工件:

  • ONNX 模型

  • 层执行摘要 () tempDir

  • 校准数据+输出示例

如有任何帮助、将不胜感激。 请告诉我您还想查看哪些其他文件或日志。

提前感谢!

维多利亚

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

    您好、Victoria、

    这篇文章的精彩细节。  您正在运行哪个版本的 TIDL?  您能否提供 QDQ 模型、 用于导入/运行的命令行和配置文件。  第一步是复制您的结果(或错误)、我们可以从中进行调试。

    此致、
    Chris

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

    您好、Chris、

    感谢您的快速响应。

    我正在 AM69A 平台上使用 TIDL Tools 版本 10.1.0.0(分支:Rel_10_01、提交:1b75e86e79cfddb8f6e181014e6343e89765883d)。

    我将附加以下文件以帮助您复制我的设置:

    QDQ ONNX 模型 –我正在编译的预量化模型。

    compile.py 脚本–包含模型导入逻辑和 TIDL 委派配置。 优化器步骤当前被注释掉以用于调试目的、但如果需要、可以随时启用和优化它。 该脚本支持在编译期间使用两种输入模式:如果提供了 test_img_path、它会使用真实的光流映像对、否则会返回到生成具有正确形状和值范围的虚拟 float32 输入。 由于模型已经被量化 (QDQ)、因此虚拟输入应该足以进行编译。

    如果您需要任何其他信息、请告诉我。

    再次感谢、
    维多利亚

    e2e.ti.com/.../tidl_5F00_debug_5F00_files.zip

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

    您好、Victoria、

    看看您的模型、这看起来并不正确。 DequantizeLinear 节点没有输入。   这在模型中是预期的吗?

    CUSTOM_BRONEW.block1_dd.conv_block.CONV1.Weight_DefenceLinear

    此致、

    Chris

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

    您好、Chris、

    感谢您的意见。

    关于DequantizeLinear节点似乎没有输入的观察:当输入是量化权重初始化值时,这在 ONNX 中是预期的。 在 Netron 中,初始化程序显示为隐式输入,而不是连接的节点,但该模型在结构上是有效的。

    关于 TIDL 导入期间的错误:

    [TIDL Import] [PARSER] ERROR: Layer 53, ... is missing inputs in the network and cannot be topologically sorted.

    我已经对此进行了进一步调查、并创建了一个最小的示例来确定问题。 错误在以下情况下被触发
    Conv在 CPU 上执行一个节点、但DequantizeLinear在中放置了一个下行节点(连接到 Conv)
    TIDL 子图。 在这种情况下,模型无法编译与上面提到的拓扑排序错误。

    但是、如果DequantizeLinear节点也在 CPU 上执行、编译会成功。 这表明当 TIDL 尝试处理DequantizeLinear引用 CPU 执行权重的节点时会发生该问题Conv

    我附上了两个示例图来说明这一点:

    我附加了一个combined.png显示这两种配置的组合图像 ():

    • 顶部 :工作配置 (CPU 上的 Conv 和 DequantizeLinear)

    • 底部 :失败的配置 (TIDL 子图中的 DequantizeLinear)

    总之、当在 CPU 和 DSP 子图之间拆分重复或共享节点时、TIDL 似乎当前很难处理这些节点。 如果这有助于调试、我可以共享最小 ONNX 模型。

    也就是说、虽然本示例突出了一个具体问题、但它不能解决整个模型中的问题。 简单地强制DequantizeLinear在 CPU 上运行并不是通用解决方案。 这似乎暴露了一个更广泛问题的一部分、因此肯定需要进一步调查。

    此致、
    维多利亚

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

    您好、Victoria、

    TIDL 可能存在一个问题、我可以让 Jira  向开发团队进行修复。  同时、您是否可以尝试将违规图层放在拒绝列表中进行验证?  我想确保 在添加 Jira 之前有一个适用于您的应用的解决方法并验证您的理论。

    谢谢、

    Chris

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

    您好、Chris、

    感谢您的建议。

    是的、我可以删除所有德量化图层、这似乎是问题的根源、尤其是当它们以重复形式出现时。 但是、这样做会导致其余的大部分节点在单独的 TIDL 块中进行隔离。 这使得 TIDL 块的数量迅速增加、因此大多数模型最终都在 CPU 上执行。

    如前所述、使用 FP32 进行 CPU 执行编译没有任何问题、但遗憾的是、它不符合我的推理时间要求。 因此、虽然变通办法在技术上起作用、但对于我的应用程序的性能目标来说、这是不可行的。

    请告诉我您希望如何继续。

    此致、
    维多利亚

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

    您好、Victoria、

    您能给我发送最小的 ONNX 模型来演示吗?  我需要向开发团队展示此信息。   

    此致、

    Chris

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

    您好、Chris、

    是的、我可以发送重现问题的最小 ONNX 模型、供开发团队查看。

    我使用 ONNX 的对模型进行量化、解决了部分问题quantize_staticDedicatedQDQPair=True。 这可以防止在多个消费者之间共享 DequanzeLinear 节点、而 TIDL 无法处理该节点。 但是、此设置不适用于由初始化值权重创建的去量化节点、该初始化值权重仍可以有多个使用者。 发生这种情况时、我收到以下 TIDL 错误:

    [TIDL Import] [PARSER] ERROR: Unable to merge Dequantize - /custom_backbone/block1_1/relu_2/LeakyRelu_output_0_DequantizeLinear_Output_1 upwards - DQ without initializer? -- [tidl_import_common.cpp, 7103]

    为了演示这两种情况、我附加了两个最少的型号:

    1. QDQMODEL_debug1.onnx

      • 按原样成功编译。

      • 如果我拒绝/custom_backbone/block1_1/conv2/Conv、则失败、带有拓扑排序错误。

      • 如果我同时拒绝、则再次编译/custom_backbone/block1_1/conv2.weight_DequantizeLinear

    2. QDQMODEL_debug2.onnx

      • 用量化DedicatedQDQPair=True

      • 在出现“DQ without initializer?“时失败 由于共享去量化线性节点未绑定到初始化器导致的错误。

    让我知道这是否有助于验证行为和权变措施。 我感谢你的帮助提出一个 Jira 为此,并高兴地提供任何其他需要的。

    此致、
    维多利亚

    e2e.ti.com/.../QDQmodel_5F00_debug.zip

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

    您好、Victoria、

    我可以将这两个模型导入为常规模型(非 QDQ)。  您能给我发送您的导入和推理配置文件、而不是我尝试一堆不同的 TIDL 配置吗?

    谢谢、

    Chris

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

    您好、Chris、

    感谢您的更新。

    只需阐明背景:我的目标是编译和部署量化 (QDQ) 模型、因为它旨在于需要量化的硬件上运行。 虽然我知道将模型导入常规(非 QDQ)模型可能可行、但这与预期部署不一致。

    在我之前分享的编译脚本中、包括所有导入和编译参数。 除了这些文件之外、我没有单独的导入或推理配置文件。 此外、此时推理配置并不相关、我目前主要负责在桌面上的本地测试期间解决导入/编译问题。

    您能否帮助澄清哪些原因可能导致与缺少输入和未使用初始化值的去量化节点相关的错误? 如果能深入了解如何编译量化模型、将不胜感激。

    再次感谢您的帮助。

    此致、
    维多利亚

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

    您好、Victoria、

    对迟来的答复表示歉意。  我所说的导入配置文件是指 import.txt 文件(如果您使用的是 TIDLRT)或 model_configs.py 中的条目(如果您使用的是 OSRT)。   我想看到的是、您如何尝试将 TIDL 导入。  由于缺少图像文件和路径故障、您发送的 compile.py 脚本无法正常工作。  我希望消除所有可变因素、因此我希望使用 开发团队的 TIDL 工具进行测试。


    FileNotFoundError:[errno 2]没有此类文件或目录:“/home/emibr12/neuflow/low/00001_img1.ppm “
    ************** 在 TIDL_subgraphRtDelete ************中

    此致、

    Chris  

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

    您好、Victoria、

    我能够复制玩具 QDQ 模型的问题。   我为此问题输入了一个 Jira: TIDLP-7827。  开发团队已被分配到该团队。

    此致、

    Chris

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

    您好、Victoria、

    我为您的模型提供了一个可能的解决方案。  我能够使用您的编译脚本进行测试、直到加载图像为止。 但是、由于我没有该过程所需的.ppm 文件、因此它无法正常工作。

    要修复模型、您首先需要克隆 https://github.com/daquexian/onnx-simplifier

    CD 到 onnx-simplier

    onnxsim QDQmodel.onnx QDQmodel_simp.onnx

    然后、修改编译脚本以使用新的简化模型名称。  

    此致、

    Chris

    e2e.ti.com/.../2112.compile.txt