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.

[参考译文] AM62A7:onnx 的张量输出的大小与 ti 仿真的大小输出不一致。

Guru**** 2482225 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1448141/am62a7-the-size-of-the-tensor-output-by-onnx-was-inconsistent-with-the-size-output-by-ti-simulation

器件型号:AM62A7

工具与软件:

仿真模型时看到的波形相同。 py、我使用 d-m 时效果很好、张量输出的大小为(21、6)。 然而,当我使用- d ,我发现模型的输出是(300, 6),没有过滤 NMS。 但是、当我执行以导出为导向的程序时、我添加了 export_nms 选项。 然后、我上传了这两个结果的 tensors、这些结果保存在 OCD2_608pc-d - m.txt 和 OCD2_608pc-m 中 .txt 文件中。 最后、我还上传了 onnx、ti 仿真和电路板端 tiovx 执行结果的图片、其中三个是 py_ovx。 ut_oCD2_608pc-d - m.jpg、py_out_oCD2_608pc-m jpg 和 board.jpg,可以发现 Onxruntime 的效果是正常的,而仿真和电路板的副作用是不正确的。 你能帮助分析原因这,非常感谢

祝你一切顺利

zhuangyihaoe2e.ti.com/.../2577.1205-experiment.zip

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

    Zhuang、您好!

    感谢您将其移至另一个主题! 对于具有类似查询的未来开发人员来说、跟踪和查找将更容易。

    是的、我可以看到、-d 的输出不同(在 CPU 上运行、不从 TI 的软件卸载/处理)、而没有参数(将使用 TIDL 的执行提供器)。  

    TIDL 默认使用8位量化。 这里会有一些固有的精度损失、我们尽量减少这种损失。 看到浮点模型的微小变化是正常现象、模型的当前任务是减少这些变化。 第一步、我建议将 common_utils.py 中的 tensor_bits 设置为16以启用16位量化。 通常、精度损失可以忽略不计。 然后、我们可以使用"output_feature_16bit_names_list"设置在所选层上使用16位模式、在其他任何位置使用8位模式。 这样、我们可以平衡性能和精度损失。

    300x vs 21x 框听起来很正常。 当我们编译对象检测模型时,有一个设置,用于设置作为元体系结构的一部分保留多少个框。  此设置也可以通过编译期间传递到 ONNXRuntime TIDLExecutionProvider 的'elegate_options'来控制。 在后处理过程中、通过应用置信阈值可以忽略这些附加框。

    BR、
    Reese

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

    您好 Reese、 我按照您的建议将张量位设置为16、这提高了模型的检测性能。 然而、总时间消耗显著增加、从最初的35ms 增加到105ms、这是不可接受的。 如前所述、只有一些层设置为16位。 根据您的建议、张量位设置为8、并填充后处理节点之前的三个转换值以输出_feature_16bit_names_list 和 params_16bit_names_list、但量化精度再次降低。 输出_feature_16bit_names_list 和 params_16bit_names_list 似乎不起作用。 我是否正确设置了它们

    BR

    Zhuangyihao

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

    您好!

    感谢您的尝试--这是预期的结果(更好的准确性、更低的性能)。  

    根据您的建议、张量位设为8、并填充后处理节点前的三个 conv 值、用于输出_feature_16bit_names_list 和 params_16bit_names_list、但量化准确度再次降低。 输出_feature_16bit_names_list 和 params_16bit_names_list 似乎不起作用。 我是否正确设置了它们[/QUOT]

    现在的精度是否与以前相同、只是8位而没有16位层? 如果是、则可能会错误地应用此设置

    您能否共享这两个 输出_feature_16bit_names_list 和 params_16bit_names_list 设置的设置?

    • 如果您使用的是"Outputing _feature_16bit_names_list"而不是"output_feature_16bit_names_list"(第二个是正确的)、则不会应用该设置。  
    • "output_feature_16bit_names_list"中的值是包含逗号分隔的单个字符串 、其中包含希望为16位的中间密度。
      • 例如、名为"A"的 Conv 图层的输入可能名为"X"、输出可能名为"Y"。 您的 output_feature_16bit_names_list 将包含"Y"  
    • 同样、"params_16bit_names_list" 应该使用层输出(从上面的行"Y"开始)、然后提供给该层的参数/恒定权重也应为16位。

    如果您不确定是否正确应用了该设置、请在浏览器中打开 artifes/tempDir 中的子图 SVG 文件。 如果将鼠标悬停在某个节点上、该节点应包含更多信息

    BR、
    Reese