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:topk 索引 (int64)->ADD 会在仿真器/DSP 上产生错误/零结果

Guru**** 2529560 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1565102/processor-sdk-j784s4-topk-indices-int64---add-yields-wrong-zero-result-on-emulator-dsp

部件号:PROCESSOR-SDK-J784S4


工具/软件:

您好:

 

我将 J784s4 与 RTOS SDK 10_01_00_04 和 TIDL 版本 10_01_00_01 配合使用。 我的 ONNX 版本是 1.15.0。 我有一个包含 TopK 节点和 ADD 节点的微型模型。  
ADD 节点将 TopK 的索引输出作为输入并使用 int64 类型的常量。

该模型有 3 个输出: TopK 的值和指数输出,以及 ADD 的输出。

当我对仿真器运行推理时、TopK 输出正确、但 ADD 输出错误。
在 DSP 上、TopK 输出也是正确的、但 ADD 输出变为全零。  


对于 TopK、我在 DSP 和参考实现中使用了 TIDL_refTopK。  
在为索引添加切片节点后、我添加了一个整形节点以将元素类型更改为浮动、然后添加一个与身份节点类似的切片节点、因为 DSP 不支持将不同类型的整形作为 TopK 的最后一个节点。

经过一些调试后、我发现 ADD 节点始终将其输入作为 int16(浮点)、并生成 int16 输出。 即使将其输入作为浮点、它仍会生成 int16 输出。 这会导致错误的结果、因为输入范围(32 位)和输出范围(16 位)不匹配。 这似乎是我在 DSP 上看到零并在仿真器上看到错误结果的原因。

    

您能否确认这是否为预期行为?  
对于一种解决方法、您是否有任何建议 、该解决方法将允许节点正确地使用 int32 或 int64 格式的输入、并在 int32 或 int64(而不是 int16)中生成其输出? 目标是在不降低精度的情况下保留索引值、因为将它们减少到 int16 会导致截断/溢出、并导致仿真器和 DSP 上出现错误结果。
如何 处理要 在 TIDL 支持的更高宽度整数类型中执行的索引?
解决此问题的建议解决方法是什么?

 

您可以在此处找到模型:e2e.ti.com/.../add_5F00_topk.zip

 在这里您可以找到模型工件(在仿真器的编译和推理中): e2e.ti.com/.../add_5F00_topk_5F00_artifacts.zip

提前感谢。

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

    尊敬的 Ghassen:

    我们在即将发布的 TopK 中提供了一些修复。 但我将仔细检查此问题是否在最新版本中得到修复。  

    我将在调查更多内容后更新。 由于问题最初似乎是由于添加层造成的、因此我必须验证是否需要仔细检查。  

    此致、

    Christina

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

    尊敬的 Christina:

    我的 TopK 工作正常:它生成值和索引。 问题在于、当这些索引馈送到任何 EltWise 节点时、TIDL 的逻辑会出现。 TopK 将生成有效索引作为独立输出,但当我将它们输入到 EltWise (Add) 时,EltWise 节点将它们视为零,并在仿真器上产生错误的输出,在 DSP 上产生全零。
    我认为这是因为 TopK 生成浮点索引,而 EltWise 节点执行为 int16 这样,索引就会减少/被视为 int16 ,这就是为什么我会得到零。

    对于一种解决方法、您是否有任何建议 、该解决方法将允许节点正确地使用 int32 或 int64 格式的输入、并在 int32 或 int64(而不是 int16)中生成其输出? 目标是在不降低精度的情况下保留索引值、因为将它们减少到 int16 会导致截断/溢出、并导致仿真器和 DSP 上出现错误结果。

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

    尊敬的 Ghassen:

    您用于运行此模型的模型配置是什么?  

    对于 TopK、索引值始终存储为 int32 位、大多数其他层在 int16 或 int8(如果设置)中执行。 通常在 TopK 之后,我们会看到一个收集层,它可以正确地采用 int32 索引。  

    当我试图理解你的模型更好的建议,我想问在指数后面的原因是什么。 您是否尝试使用 Slice 和 ADD 实现收集层功能?  

    另外、只是为了确认、您是否看到 ONNXRT 输出了正确的行为?

    此致、

    Christina