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-TDA4VM:卸载时对象检测 HEAD 输出错误、但可以在不卸载的情况下纠正

Guru**** 2577385 points
Other Parts Discussed in Thread: SK-TDA4VM

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1562028/sk-tda4vm-object-detection-head-output-wrong-with-offload-but-correct-without-offload

器件型号:SK-TDA4VM


工具/软件:

我已经将 YOLOPX 从 PyTorch 转换为 ONNX ,通过 tidl_onnx_model_optimizer 运行它,并使用 onnxrt_ep.py 编译它。

编译后、模型正确输出“通道线“和“可驱动区域“检测数据。

但 在 Docker 和 SK-TDA4VM 上运行时、物体检测输出(基于 YOLOPX)都是错误的。  无论输入如何、输出始终相同。

但是、使用-d 标志禁用卸载会在 Docker 和目标器件上产生正确的结果。

为 Docker 使用 32 位精度编译模型也可提供正确的结果。

因此、我怀疑从浮点到 8 位定点的转换会在某种程度上影响结果。

我附加了卸载和不卸载的物体检测张量输出、以及编译和推理脚本和一些校准图像。

TIDL 工具版本使用了 11_00_08_00

在使用自有脚本之前使用 onnxrt_ep.py 测试模型编译。

我的问题是

1.是否有任何工具可用于调试此类问题?

2.是否有一些编译选项可以用来纠正这种情况?

如果缺少任何信息或文件、请告知我。

e2e.ti.com/.../compile.py.txt

e2e.ti.com/.../infer.py.txt

e2e.ti.com/.../8371.yolopx_5F00_lib.zip

e2e.ti.com/.../common_5F00_utils.py.txt

e2e.ti.com/.../ti_5F00_config_5F00_utils.zip

e2e.ti.com/.../e2e_5F00_debug_5F00_custom_2D00_artifacts.zip

e2e.ti.com/.../debug_5F00_3_5F00_infer.txt

e2e.ti.com/.../debug_5F00_1_5F00_infer.txt

e2e.ti.com/.../debug_5F00_3_5F00_compile.txt

e2e.ti.com/.../debug_5F00_1_5F00_compile.txt

e2e.ti.com/.../debug_5F00_3_5F00_noof_5F00_infer.txt

/cfs-file/__key/communityserver-discussions-components-files/791/yolopx_5F00_optimized.onnx

e2e.ti.com/.../8880.yolopx_5F00_optimized_5F00_osrt_5F00_config.txt

e2e.ti.com/.../calib_2D00_imgs.zip

此致、

Charanjit Singh

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

    Charanjit,

    请包含一个到 ONNX 模型的良好链接。  提供的链接无法正常工作。

    此致、

    Chris

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

    您好、Chris、

    链接被错误地粘贴。 (编辑:-再次尝试它导致相同,http://e2e.ti.com/ 在发布时被删除)

    Onnx 已优化

    HTTP:// e2e.ti.com /cfs-file/__key/communityserver-discussions-components-files/791/yolopx.onnx

    我希望您可以通过单击突出显示的链接将其打开(也不起作用)

    此致、

    Charanjit

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

    尊敬的 Charanjit:

    太奇怪了。 以前在 E2E 上从未见过这种情况。 您可以尝试将其添加为 zip 文件并共享吗?  

    还是旧 E2E 具有相同的模型?

    此致、

    Christina

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

    尊敬的 Christina:

    这绝对是奇怪的。  

    这就是为什么我发布了中间带空格的链接、这样零件就不会被删除。 我想,由于任何原因,网站省略了 URL 并直接指向服务器的位置。

    我也无法附加 zip 版本、因为文件仍然太大。 也不确定它是如何经历的最后一次。

    可以 在 CFS-file 之前粘贴“">">https://e2e.ti.com"</s>“ “并尝试一下?  

    /cfs-file/__key/communityserver-discussions-components-files/791/yolopx_5F00_optimized.onnx

    此致、  

    Charanjit

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

    尊敬的 Charanjit:

    我只能通过复制和粘贴方法下载它。 一旦我的测试取得一些进展、我就会更新您。

    感谢您的耐心。

    此致、

    Christina

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

    尊敬的 Charanjit:

    您是否尝试过不将输出转换回浮点? 如所示、将输出保留为 8 位整数/16 位整数并看到差异?

    就您的两个问题而言:

    2. 是否有一些编译选项可用于纠正这种情况?

    在编译方面、我尝试使用层跟踪通过 TIDLRT 流程而不是 OSRT 流程(您使用的方式)运行模型。 如果您可以使用 OSRT 流进行层跟踪、并与浮点/定点进行比较、这将是一种很好的并行检查。 分析完成后、可能需要设置特定的模式/配置。  

    另一种可能是您如何训练模型。 输入的范围是多少? 是否从 0-1 对值进行了训练?  

    此致、

    Christina Kuruvilla  

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

    尊敬的 Christina:

    感谢您的回复和链接。 我将通读本文档以了解使用层迹线的过程及其含义。

    您是否尝试过不将输出转换回浮点? 如所示、保留输出为 8 位 int/16 位 int 并看到差异?

    1.我该怎么做?

    使用自定义工件时、onnx_session.run 的结果已提供以下值

    det_out type: <class 'numpy.ndarray'>
    det out shape: (1, 5040, 6)
    det_out[0][0]: [4.9375 4.9375 9.875  9.875  0.     0.    ]
    det_out[0][0][0] type: <class 'numpy.float32'>

    因此、在我这边不转换任何内容的模型返回一个 NumPy 数组、其中元素为 NumPy 浮点数。

    在编译方面、我尝试使用层跟踪通过 TIDLRT 流程而不是 OSRT 流程(您使用的方式)运行模型

    2.请您详细说明这两个流之间的区别是什么?

    OSRT 是否意味着只使用 CPUExecutionProvider 而不使用 TIDLExecutionProvider? 这是否与 使用“no offload“变体相同? 我发现没有明确的消息来源显示两者之间的区别,并变得困惑。

    3.能否请您向我说明 OSRT 与 TIDLRT 流程之间的差异。 我只记得已阅读关于 TIDL 卸载后的 OSRT 的内容。

    另一个可能是您如何训练模型。 输入的范围是多少? 是否从 0-1 对值进行了训练?  [/报价]

    我使用了预先训练的重量、因此我必须检查使用了什么(如果此信息完全可用)。 但是,如果所有其他措施失败,我可以尝试训练自己

    4、输入范围对输出有什么影响?

    感谢您耐心地回答我并消除我的疑虑。

    此致、

    Charanjit

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

    在常见实用程序中、data_convert = 3

    这会将输入和输出设置为具有格式转换。 我建议通过设置为 0 来完全禁用它、或者仅使用具有转换的输入格式将其设置为 1

    2. 您能否详细说明这两个流程之间的区别?

     目前、您无需在终端流程中执行 TIDLRT。 这两个流程都使用 TIDLExecutionProvider、但 OSRT(在 Github 上找到的流程)允许在 ARM 内核上运行任何不支持的运算符、因此用户仍然可以运行 TIDL 在器件上不支持的层。 但是、对于 TIDLRT 流程、必须支持模型中的所有层才能正常运行。 在 SDK 8.5 开始、我们不再分享 TIDLRT 流程指南、建议客户运行 OSRT 流程、因为它允许委派到 ARM、但作为仔细检查、我们仍然使用它(我发现使用它稍微简单/更快)进行验证、因为 TIDLRT 仍然受支持。  

    3. 能否请我为 OSRT 与 TIDLRT 流程之间的差异提供一些解释? 我只记得已经阅读了关于 TIDL 卸载的 OSRT 的内容。

    如果您想查看有关这方面的更多文档、可以在此处找到: software-dl.ti.com/.../md_tidl_overview.html

    不过,这是为了你自己的好奇心,我只是让你知道我是如何测试我的 TIDLRT 流程消除了 OSRT 流程可能引入的一些额外变量、因此我能够更轻松地进行精确定位。  

    4. 输入范围对输出有什么影响?

    这可能会影响对一些额外的量化和归一化 参数的需求。 我问的原因是,我看到你有标准化的平均值和尺度写在你的编译和推断脚本,但你的模型配置有不同的平均值和尺度。 我想知道哪一个是适合您的数据的范围。

    此致、

    Christina

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

    尊敬的 Christina:

    在常用实用程序中、有 data_convert = 3

    在所述的 common_utils.py 中、该部分上方的注释指出、仅当 ACCURATION_LEVEL 设置为 9 时、该选项才会被激活。 这就是为什么我没有改变这些行中的任何内容。

        # below options will be read only if accuracy_level = 9, else will be discarded.... for accuracy_level = 0/1, these are preset internally
        "advanced_options:activation_clipping": activation_clipping,
        "advanced_options:weight_clipping": weight_clipping,
        "advanced_options:bias_calibration": bias_calibration,
        "advanced_options:add_data_convert_ops": data_convert,
        "advanced_options:channel_wise_quantization": channel_wise_quantization,
    

    感谢您解释流程之间的差异。 虽然我曾经通读过 TIDLRT 流程、知道我没有使用该流程、但也多次提及、导致我认为我错过了一些东西。

    这可能会影响对一些额外量化和标准化 参数的需求。 我问的原因是,我看到你有标准化的平均值和尺度写在你的编译和推断脚本,但你的模型配置有不同的平均值和尺度。 我想知道哪一个是适合您的数据的范围。

    现在、您提到这一点、我记得这些值已经归一化为 0-1 范围、因此使用的归一化值的差异也已归一化。 模型配置由 Chris Tsongas 为我生成 、并使用 TI 示例中使用的标准均值和比例。 我确实需要一些时间来了解差异是什么以及原因。 但当我运行 onnxrt_ep.py 脚本时、`input_data`在 0-255 范围内、并按照 common_uitls.py 中使用的值进行标准化、最终结果是在将它们传递到模型之前给出相同的输入值。  

    我甚至通过用两种方法打印输入值来测试这一点。

    我今天的问题是:

    今天、我已生成 DEBUG_LEVEL 设置为 4 的跟踪。

    1.是否必须通过设置 debug_level=4 进行编译、或者只使用 debug_level=4 运行推理就足够了?

    2.我在/tmp 中的跟踪文件有 7 个字段,而不是文档中提到的 5 个字段。 如何解释这些?

    # From the edgeai tools page
    
    Trace names will be like tidl_traceAAAA_BBBBB_CCCCC_DDDDDxEEEEE.y,
    
        AAAA is dataId, BBBBB is batch number, CCCCC is channel number, DDDDD is width and EEEEE is height.
        For example a trace name tidl_trace0072_00001_00256_00010x00014.y indicates the traces of layer with dataId = 72, batch = 1, channels = 256, height = 14 and width = 10.

    # My ls output in /tmp of docker
    
    tidl_trace_subgraph_0_0000_0001_0001_00001_00003_00640x00384_float.bin  tidl_trace_subgraph_0_0200_0001_0001_00001_00256_00020x00012_float.bin  tidl_trace_subgraph_0_0399_0001_0001_00001_00001_00080x00048_float.bin
    tidl_trace_subgraph_0_0001_0001_0001_00001_00001_00002x05040.y          tidl_trace_subgraph_0_0201_0001_0001_00001_00256_00020x00012.y          tidl_trace_subgraph_0_0400_0001_0001_00001_00001_15360x00001.y
    tidl_trace_subgraph_0_0001_0001_0001_00001_00001_00002x05040_float.bin  tidl_trace_subgraph_0_0201_0001_0001_00001_00256_00020x00012_float.bin  tidl_trace_subgraph_0_0400_0001_0001_00001_00001_15360x00001_float.bin
    tidl_trace_subgraph_0_0002_0001_0001_00001_00001_00002x05040.y          tidl_trace_subgraph_0_0202_0001_0001_00001_00256_00020x00012.y          tidl_trace_subgraph_0_0401_0001_0001_00001_00001_00001x00032.y
    tidl_trace_subgraph_0_0002_0001_0001_00001_00001_00002x05040_float.bin  tidl_trace_subgraph_0_0202_0001_0001_00001_00256_00020x00012_float.bin  tidl_trace_subgraph_0_0401_0001_0001_00001_00001_00001x00032_float.bin
    tidl_trace_subgraph_0_0003_0001_0001_00001_05040_00003x00002_float.bin  tidl_trace_subgraph_0_0203_0001_0001_00001_00256_00020x00012.y          tidl_trace_subgraph_0_0402_0001_0001_00001_00008_00640x00384.y
    

    3.为什么某些 ID 只与 float.bin 一起使用、而不与.y 一起使用? 这是否意味着在运行定点图时不会生成这些值?  

    请参阅/注意  上面 ls 输出中的 tidl_trace_subgraph_0_0000_0001_0001_00001_00003_00640x00384_float.bin 和 tidl_trace_subgraph_0_0003_0001_0001_00001_05040_00003x00002_float.bin。

    4、文档中提到了以下内容、但我不清楚其含义

        User can generate these traces for floating/16-bit and 8-bit by setting tensor_bits during model inference and compare them. Some sample scripts/functions are listed below for reference :
    
    Script 1 : Layer level activation comparisons :
    
    User can generate following plots to compare floating point output generated from OSRT without TIDL/c7x offload and with TIDL/c7x offload.
    
        Plot 1 : Histogram of absolute difference. Plot with most of values closer to zero indicates the two tensors are similar
        Plot 2 : TIDL fixed point inference output plotted against TIDL Floating inference output. Plot with most points around a 45 degree line indicates two tensors are similar
        Plot 3 : TIDL Floating inference output and TIDL fixed point inference output plotted in the same plot.
    
    Typically no single plot is enough to conclude the difference and each gives certain way to compare the two outputs.
    

     我认为 tensor_bits 仅在编译时相关、不适用于推理。

    5.如何使用这些迹线? 它们是否传递到脚本 1 中提到的函数?

    User can generate following plots to compare floating point output generated from OSRT without TIDL/c7x offload and with TIDL/c7x offload.

    6.这听起来我需要得到数字输出(也许作为一个 NP 数组?) 。 或者如何比较输出?

    TIA。

    此致、

    Charanjit

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我是否必须通过设置 debug_level=4 进行编译、或者如果我只是以 debug_level=4 运行推理、这是否足够?

    使用 DEBUG_LEVEL = 4 进行编译时、可提供编译中的调试信息、但对于跟踪、您应该只需要在 DEBUG_LEVEL = 4 时设置推理。 如果你不是太麻烦,我只会做两件事来改变它。

    /tmp 中的我的跟踪文件有 7 个字段、而不是文档中提到的 5 个字段。 如何解释这些内容?

    没关系。 第一组 (4) 仍然是 dataID。 其他的通常遵循相同的、但会根据 ONNX 具有的维度数量添加。 要进行分类、请使用第一组 4。 例如、从您的列表中、这两个器件会配对。  

    tidl_trace_subgraph_0_0001_0001_00001_00001_00001_00002x05040.y  
    tidl_trace_subgraph_0_0001_0001_0001_00001_00001_00002x05040_float.bin

    [引述 userid=“606083" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1562028/sk-tda4vm-object-detection-head-output-wrong-with-offload-but-correct-without-offload/6023843。] 为什么某些 ID 仅包含 float.bin 而不包含.y? 这是否意味着在运行定点图时不会生成这些值?  [/报价]

    是的、有时只会生成 float.bin。 它也取决于层。 某些层的实现方式不输出跟踪、或者仅使用一种类型(例如在本例中,在 float.bin 上创建了此示例)。 通过简单地查看后续的层走线、仍然可以查看这些层是否可能导致问题、因为这些层之后也会出现任何不匹配情况。  

     我认为 tensor_bits 仅在编译时相关、不适用于推理。

    在这种情况下,它表示它将浮点与 16 位或 8 位(取决于设置的)进行比较。 tensor_bits 确实需要在编译和推理上保持一致。  

    [引述 userid=“606083" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1562028/sk-tda4vm-object-detection-head-output-wrong-with-offload-but-correct-without-offload/6023843

    如何使用这些迹线? 它们是否传递到脚本 1 中提到的函数?

    [/报价]

    我认为这个讨论的只是在 ARM 内核上运行、方法是在  onnxrt_ep.py 上运行时设置标志-d。 您可以比较这些布线、以便在没有 TIDL 与 TIDL 的情况下进行比较

    6. 这听起来我需要得到数字输出(可能是 NP 数组?) 。 或者如何比较输出

    您谈论的是哪种输出? 最终输出还是跟踪输出? 我创建 jupyter 笔记本或 python 脚本来将输出转换为数字。 那么就会产生绝对误差、其他图也是如此。 如果我不明白这一点、请告诉我。

    希望这对您有所帮助、

    Christina Kuruvilla

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

    尊敬的 Christina:

    感谢您的回答。

    关于我上一个答复中的问题 5 和 6、我应该在这些问题之间留出更多的空间。

    方框中的案文应该是针对问题编号的 6.

    “用户可以生成以下图、以比较 OSRT 生成的浮点输出、而无需在 TIDL_c7x 卸载、TIDL_c7x 卸载。“ ->问题 6、将使用-d 运行的答案、并使用给出的示例函数比较输出张量。

    但问题 5 是如何使用跟踪文件? 由于这些是二进制文件、我不了解如何执行和比较它们。

    因此、我需要更多有关如何利用这些布线进行调试的信息。

    此致、

    Charanjit

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

    尊敬的 Charanjit:

    希望通过图片进行解释是可行的。 这是我通常如何使用跟踪文件进行比较的屏幕截图。 我在 jupyter 笔记本中运行它们、并将输出进行比较。 有时需要一个比例因子(在本例中是这样)、但这可以通过查看 SVG 文件找到。  

    这是我比较最简单的方法。 在本例中、我分别生成了 ONNXRT 数据以进行比较和绘制。 看到这一点后、您可以调整图形以查看您想要看到的信息。  

    如果您仍需要对此进行任何说明、请告诉我。

    此致、

    Christina

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

    尊敬的 Christina:

    让我先尝试到这里,如果我有任何其他问题,我会告诉你。

    1.关于 ONNXRT 数据,这只是运行推理的模型输出,另存为 NPY 数组并写入文件吗?

    2. SVG 图形中的比例因子在哪里? 目前、我正在移动中调整数值。

    谢谢、

    Charanjit

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

    这是使用 https://github.com/TexasInstruments/edgeai-tidl-tools/blob/master/docs/tidl_osr_debug.md#script-1--layer-level-activation-comparisons-中给出的代码片段生成的

    我还没有找到任何关系不是线性的图形。 我想如果两者之间有某种关系、图形将显示它。

    问题 1: 您是否有一些数据不匹配并显示在图表中的示例?  

    问题 2: 物体检测头的输出是否可能不同、而车道线和可驾驶区域头的输出是否不同?

    此致、

    Charanjit

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

    您是否能够将其与设置-d 时获得的迹线进行比较? 还是启用了 32 位时呢?

    关于第 1 季度的答案:

    我目前不能分享任何示例、但通常、如果在同一平台上完成、具有相同设置的固定和浮点将输出相同的结果(在本例中,我假设的是 PC)。 我通常进行调试时、首先检查 PC 和器件之间的一致性(通常是一致的)、然后转向 TIDL 与 ONNXRT。 在您的情况下、我会比较您所说的 32 位运行的.y(如果未创建这些文件,可能是 float.bin)与相同层的 8 位.y。

    如果它们不一致,这就是我们确定是否存在错误的方式。  

    问题 2:

    是的、这取决于进入对象 Det 标题以及某些层的数据。 您是否已将任何数据添加到对象目标标题中、而这些数据可能与输入数据的比例不同?  

    此致、

    Christina

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

    您好、

    您是否能够将其与设置-d 时获得的跟踪进行比较? 或者当您启用了 32 位时?

    我认为由 debug_level=4 生成的 float.bin 跟踪已经是 32 位或等效于-d 布线是在 tensor_bits=8 和 DEBUG_LEVEL=4 的情况下生成的。

    问题 1: 这是否意味着我单独编译并生成 8 位、32 位和-d 的跟踪、然后将 8 位的.y 结果与 32 位的.y 结果进行比较?

    问题 2: 并将.y 迹线与 float.bin 迹线进行相同位的比较?

    一些反馈:

      在我看来、文档中对使用哪些选项会有所帮助而产生的结果做了一些更明确的解释。

    例如、生成的 迹线实际上与哪些迹线相对应、并举例说明要将哪些迹线与哪些其他迹线进行比较。

    我认为我的第二个答复掩盖了我原来的答复、原来的答复仍然没有回答。

    [引述 userid=“606083" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1562028/sk-tda4vm-object-detection-head-output-wrong-with-offload-but-correct-without-offload/6029146

    1.关于 ONNXRT 数据,这只是运行推理的模型输出,另存为 NPY 数组并写入文件吗?

    2. SVG 图形中的比例因子在哪里? 目前、我正在移动中调整数值。

    [/报价]

    在平均时间、我将生成 32 位和-d 的跟踪、并在得到您的确认(如果有必要)后开始比较它们。

    谢谢您、

    Charanjit

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

    尊敬的 Charanjit:

    -d 是 float.bin 文件的名称、但设置 32 int 不等于-d、因为它仍会通过 TIDL。 由于您提到 TIDL 是 32 int 与 TIDL 是正确的(如果我理解错了,请纠正我的错误)、因此下一步应该是将它与 8 int 进行比较。  

    但是,有时 float.bin 不一致(有些没有创建,等等),因此我建议单独执行-d 并进行比较。 如果-d 和 32 int 是等效且正确的、那么我建议将 32 int 用于比较、因为它会通过 TIDL。  

    是的、我们缺少与此相关的文档、但它仍然是一个有用的工具。 我当前正在尝试添加到此文档(很可能是常见问题解答)、以便更容易理解和使用。  

    关于 ONNXRT 数据、就是运行推理时的模型输出、保存为 NPY 数组并写入文件?

    是的、这在 edgeai-tidl-tools 之外没有 TIDL 参与/。 这只是为了从其他比较中消除所有依赖性因素。 我发现这对于确定特定层的准确性很有用。  

    在 SVG 图形中、我在哪里可以看到比例因子? 目前我正在移动中调整数值。

    通常、当您将鼠标悬停在各个层上时、可以看到 TIDL 使用该层的所有信息。 这只是我的一个测试用例的一个示例。  

    在这种情况下, tensorScale = 1 (朝向底部),这是你可以看到的比例。

    此致、

    Christina

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

    尊敬的 Christina:

    由于您提到 TIDL 32 int 是正确的(如果我理解错了,请纠正我的错误)、因此接下来的步骤是将它与 8 int 进行比较。  [/报价]

    是、32 位推理生成了正确的结果。 用于比较的是使用 32 位伪影生成的迹线。

    不过我注意到的是 8 位编译与 32 位编译的图形不同。 我的意思是、dataId 不一定是两者之间匹配的。

    是的、我们的文档在这方面缺乏、但它仍然是一个有用的工具。

    我完全同意你的说法。 仅可视化就提供了图层正确工作的保证级别。 我的评论不应被视为批评,而应被视为可能会使他人更容易使用的东西。 文档中更加清晰和结构化肯定会减少可能出现的问题。

    是的、这是在 edgeai-tidl-tools 之外没有 TIDL 参与/的情况。 这只是为了从其他比较中消除所有依赖性因素。 我发现这对于确定特定层的准确性很有用。  [/报价]

    为了检查正确性、我也会尝试生成这些函数。

    通常情况下、当您将鼠标悬停在各个图层上时、您可以看到 TIDL 用于该图层的所有信息。 这只是我的一个测试用例的一个示例。  [/报价]

    感谢您向我展示比例值。 我已经通过将鼠标悬停在图形上时显示的大量信息中看到了这些内容。

    不过、我有一个问题是在上述讨论中提出的。

    问题 1: 是否为特定输入图像(例如,可能是为推理而传递的图像中的最后一幅图像)生成了跟踪? 或者、这些迹线值是模型权重和偏置吗?

    我比较了 32 位浮点与 8 位浮点跟踪的输出、并获得了 8 位 float.bin 的值、这些值类似于前面的回复中提到的错误输出值。 这使我认为、输出可能是校准图像中大约 20 幅图像的单个图像。 如果是这种情况、我认为我最好只使用一个映像进行调试、以便只比较该映像的输出值。

    此致、

    Charanjit

    P.S.您是否能够在您的最终找到问题?

    [/quote][/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不过我注意到、8 位编译与 32 位编译的图形不同。 我的意思是、dataId 不一定在两者之间匹配。

    您能给我举一个例子吗? 我想确保这不是问题。

    q1. 是否为特定输入图像(例如,可能是为推理而传递的图像中的最后一幅图像)生成了跟踪? 或者、这些迹线值是模型权重还是偏置?

    这应该是具有模型权重和偏置的迹线值。 我将看看我是否能够仔细检查这一点,因为我是根据我自己的意见得出这个结论的。  

    但是、在调试方面、我确实支持使用 1 个映像、因为这通常也是我所做的。 我总是喜欢首先从最小数量的变量开始,然后建立我的方式,以确保任何可能的 bug 可能被发现与保证。  

    在运行您的模型和隔离方面、遗憾的是、由于带宽的原因、我还没有时间完成它。 我将查看我是否可以并行工作、并在下周完成。  

    此致、

    Christina

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

    将 tensor_bits 设置为 32 来生成的图形

    将 tensor_bits 设置为 8 来生成的图形

    您能给我举一个例子吗? 我想确保这不是问题。

    以上就是一个例子。

    我目前正在逐层查看图、可以找到图 1 中的数据(布线 8 位与布线 32 位) 不处于 45 度角的图。 但是、这些层的最终输出确实提供了正确的推理结果。 我将拍摄这些内容的屏幕截图、并在此处发布以供您参考。

    这应该是具有模型权重和偏差的跟踪值。 我将看看我是否能够仔细检查这一点,因为我是根据我自己的意见得出这个结论的。  [/报价]

    我已经看到了由模型在其中一条曲线的数据输出中输出的值、这意味着它们不是权重值、而是推理值。 因此、很高兴得到有关这方面的确认。

    你是对的,我应该尽量减少测试的模糊性。 因此、我将仅使用一个映像运行测试/调试输出和跟踪、以使其具有可比性。

    谢谢。此致、

    Charanjit

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

    尊敬的 Charanjit:

    我认为、与 32 位相比、8 位图可能还有一些额外的数据转换层。 这不应该是一个问题、只是与两者之间的实现有关。

    图 1(迹线 8 位与迹线 32 位) 不是 45 度角。 但是、这些层的最终输出确实提供了正确的推理结果。 我将拍摄这些内容的屏幕截图、并在此处发布以供您参考。

    是的、这些层将是确定实现方式不同原因的一个层。  

    仍在等待听到 Dev 团队的迹线值、因此我将在收到确认后进行更新。

    此致、

    Christina

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

    尊敬的 Charanjit:

    我能够仔细检查迹线值。 每个图像的迹线不同、仅转储激活、因此迹线适用于特定图像。  

    另外、我还需要说明_float.bin 文件是 浮点跟踪、图层转储具有去量化值(量化值基于零点和缩放进行去量化,然后转储)、而不是我错误地说过的-d。

    此致、

    Christina

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

    尊敬的 Christina:

    我能够再次检查跟踪值。 每个图像的迹线不同、仅转储激活、因此迹线适用于特定图像。  [/报价]

    感谢您的确认。 我将拍摄一张图像、用于测试重现性和可比性。

    另外、我需要澄清 、_float.bin 文件是图层转储具有去量化值的浮点跟踪(量化值基于零点和缩放进行去量化,然后转储)、而不是我错误地说过的-d。

    现在、缩放为浮点值的定点值之间几乎没有差异。

    我的问题是:

    问题 1: 为了获得任何有意义的见解、我必须将 8 位模型生成的去量化浮点值与 32 位迹线中生成的浮点值进行比较。 对吗?

    我编写了一些脚本、帮助我将 8 位生成的所有迹线与 32 位生成的所有迹线进行比较、对特定输出头进行筛选并跟踪该头前面的所有层、甚至绘制特定头特有的所有层。

    所以我只绘制了一些图层、这些图层完全是检测头的一部分、因为这就是问题所在。

    大多数层的值之间具有大约 45 度角的图、但有些层分布更多。

    我在下面附上几句、希望你们能够解释应该寻找什么、或者换言之、如何正确地解释。

      

      

      

      

      

    (绘图标题应采用相同的格式,带有错误直方图的标题已上载并删除,但我想它们已缓存,并且在尝试再次上传时未更新)

    问题 2: 如果我想隔离层以测试对输出的影响、该如何操作?

    问题 3 图层可能不能正常运行的迹象是什么? 垂直图是否表示图层无法正常工作?

    谢谢。此致、

    Charanjit

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

    你好 Charanjit

    [报价 userid=“606083" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1562028/sk-tda4vm-object-detection-head-output-wrong-with-offload-but-correct-without-offload/6045688 ]   

    以该层为例、如您所见、此处可能存在量化问题、因为 8 位和 32 位没有 45 度。  

    对于你上面的那些,他们看起来比较好和预期,认为他们不是一个完美的 45 度,他们仍然相关。 此外、请确保刻度对于这些也是准确的。 垂直有直线的图层可能指向一个错误,所以我将在我的最后完成测试,以确认,以便我可以提交一个 Jira。  

    q2. 如果我想隔离层以测试对输出的影响、我该如何操作?

    检查该情况的最佳方法是将该层添加到拒绝列表中、以便其在 TIDL 之外运行。  github.com/.../README.md

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

    尊敬的 Christina:

    这听起来更接近于解决问题。 我之前在 ScatterND 节点上使用过拒绝列表,因为我认为问题可能与该层有关,尽管它没有完全解决问题。 我将把没有任何东西在 45 度角的层放在拒绝列表中一个然后一起尝试和隔离错误的层。

    如果您需要任何脚本来根据输出头分割图层、或自动绘制 32 位和 8 位的跟踪、请告诉我。 尽管我想您可能有更好的工具可供您使用。

    在平均时间、我将检查使用单个图像生成迹线是否会发生任何变化、因为我怀疑在运行新图像时迹线会被覆盖、但不确定并想要消除这种模糊性

    谢谢。此致、

    Charanjit

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

    感谢您的更新 Charanjit。

    是、请让我知道它是如何与拒绝列表中的其他图层一起在您的最后进行的。 我有一个只能用于检查的内部工具,但我希望看到你的脚本,特别是根据输出头分割层的脚本,因为我们的内部工具不会这样做。  

    我还会随时更新我的调查结果,一旦我有足够的信息来提交一个 Jira。

    此致、

    Christina

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

    您好、

    有没有办法我可以提供你的脚本,而不公开向公众显示?

    我现在不愿意在这里粘贴它们、但仍想与您分享它们、因为您可能能够提供一些见解和改进建议。

    此致、

    Charanjit

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

    您好、

    我想问是否可以像这样只拒绝一个层

    compile_options['deny_list'] = "model.2/cls_convs.2/cls_convs.2.1/act/Mul"
     

    可疑图层使用 MUL 操作、但如果我将 MUL 放在拒绝列表中、则所有 MUL 操作都会受到影响、并且模型根本不会编译。 在 SVG 图形中、操作对应于 EltWise。

    谢谢、

    Charanjit

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

    尊敬的 Charanjit:

    如果可能、您可以将其发送到我的电子邮件 (c-kuruvilla@ti.com)。  

    我想问是否只能拒绝像
    这样的单层

    是的、您可以使用它的名称拒绝单个图层、但您需要按如下所示添加标记

    deny_list 与  deny_list:layer_type 具有相同的功能、因此只需将其更改为 layer_name。 只需确保将其显示在 model/LayerInfo 工件中的全名放置

    此致、

    Christina

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

    尊敬的 Christina:

    我只是你的脚本通过电子邮件.

    我今天要尝试使用 deny_list:layer_name。

    为了确认我是否理解正确、我做了以下操作

    compile_options(deny_list:layer_name) = 'model.2/cls_convs.2/cls_convs.2.1/act/Mul'

    对吗?

    谢谢、

    Charanjit

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

    您好、

    我尝试了 deny_list:layer_name 但它没有把任何东西放在 deny 列表中。

    您能给我举一个例子、说明它适用于您吗?  

    也许使用 onnxrt_ep.py 脚本已经支持的模型、这样我就可以对其进行开箱即用的测试。

    例如中的任何层  

    python3 onnxrt_ep.py -c -m cl-ort-resnet18-v1

    已添加以拒绝列表并在结束时工作

    谢谢。此致、

    Charanjit

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

    是的、我会再次检查是否有我在告知您时错过的内容、明天会向您发送一个包含拒绝列表的 modelzoo 示例。

    此致、

    Christina

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

    尊敬的 Christina:

    我的脚本中运行了 deny_list:layer_name。 问题是,我没有开始前的模式名称“/",“,这显然是关键。  

    我还没有测试所有层、所以我仍然不知道哪个层出了问题。 或者它是否是多层的组合。

    此外,我成功地使用 16 位校准编译模型,并在 Docker 中看到边界框,然而工件不能在 TDA 上工作。 我已经创建了一个关于这个问题的新帖子。  

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

    尊敬的 Charanjit:  

    感谢您告诉我。 新线程完成后、我们可以回到该线程。

    此致、

    Christina