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:精度问题- C7x 与 CPU

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1498774/am62a7-accuracy-issue---c7x-vs-cpu

器件型号:AM62A7

工具/软件:

您好!

在将模型的执行卸载到硬件加速器时、我面临着一个奇怪的精度问题。 我查看了故障排除指南、并使用了模型的 accurity_level 和 tensor_bits 参数、但这对结果产生了轻微的积极影响。 根据我迄今为止所确定的情况、问题似乎与模型应处理的输入数量或输入处理顺序密切相关。

举例说明我的问题、可以考虑我的模型、该模型旨在处理具有4个元数据功能的输入并为其提供标签。 我经常遇到的问题是、考虑到要在硬件加速器上处理的一批 X 输入、只有第一个输入始终由模型正确标记。

下图说明了我的问题:如果我向 CPU 提供一批5个输入、则准确度很少低于98%。 如果我将同一批输入到已卸载的模型中、则只有第一个输入正确标记、而剩余的4个输入将面临精度急剧下降的问题。 如绿色突出显示所示、已卸载模型的第一个输入与 CPU 中针对同一数据集推断的值密切相关。 此行为也可与其他批次值(如20,100等)重复 正如预期的那样、当批号为1时、精度始终与 CPU 相当。

您是否碰巧对可能发生的事情有任何见解? 我查看了其他用户的帖子、但他们的问题似乎与我遇到的问题没有任何共同点。

感谢您的观看!

此致、

Giann。

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

    尊敬的 Giann:

    嗯、我不知道为什么会这样。 对于普通的 CNN 模型,使用批次维度(" N'表示 NCHW 格式)的处理方式是,全局层(如 GEMM、GlobalAvgPool 等)可能难以处理,因为批次沿宽度维度平铺,而不是对批次具有完全独立的维度。

    但是、您提供的输入仅使用了2个维度(从某种意义上讲、是硬件)。 我们不经常看到像这样简单的分类器——相反,它通常是更复杂的 CNN

    您还能在您的工件/tempDir 中发布其他 SVG 吗? 我想看看每张张量的尺寸。  

    使用 tensor_bits=32根本不会改变这种行为? 在您的模型的第一个行之后、所有行(在您的案例中、批次)都是这样的?

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

    尊敬的 Giann:

    感谢您的详细介绍。 一直很感激! 问题很明显。 所有其他批次/行的输出看起来是随机的

    在调试精度问题时、通常最好在 PC 端处理并使用仿真工具(与在 EVM 上运行的 Python 代码相同)。  

    • 仅 PC 支持 Tensor_Bits = 32、并且此参考模式用于使用浮点数学执行基准。 在此背景下不会运行校准、也不会在 EVM 上运行校准。
    • Tensor_bits=16是一种独立模式、进行16位定点计算(包括从浮点->固定的校准)。

    如果您愿意分享您的模型版本(随机权重可以),我们可以看看。  

    否则、很难知道此处的确切原因、因此我们需要更深入地了解。 我们首先在 PC 上测试该基准模式(tensor_bits=32) 并检查输出。 如果这不正确、则会出现功能错误、并将其视为错误。  

    BR、
    Reese

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

    嗨、Reese!

    我记得在 PC 上用32位测试它、结果稍好一些。

    我将附加一个包含以下文件和文件夹的 zip 文件:

    e2e.ti.com/.../e2e_5F00_accuracy.zip

    • 数据: 此文件夹位于 osrt_python/ort/文件夹内、包含要推断的输入;
    • onnxrt_ep_mlp5.py: 我的用例的自定义编译脚本、位于 osrt_python/ort/文件夹内;
    • mLP_Pytorch_static5.onnx mLP_Pytorch_static5_label_map.json: 用于测试目的的模型和用于检查准确性的标签。 这两个文件都位于 Docker 的 edgeai-tidl-tools/models/public 文件夹中;

    您可能比我更熟悉该过程、但:

    # to compile using my custom compilation script
    /home/root/examples/osrt_python/ort# python3 onnxrt_ep_mlp5.py -m mlp_pytorch_static5 -c
    
    # to infer simulating the c7x processor and check the accuracy
    /home/root/examples/osrt_python/ort# python3 onnxrt_ep_mlp5.py -m mlp_pytorch_static5
    
    # to infer simulating the cpu and check the accuracy
    /home/root/examples/osrt_python/ort# python3 onnxrt_ep_mlp5.py -m mlp_pytorch_static5 -d

    如果我能提供任何帮助、或者看到您不确定的东西、请告诉我。

    感谢您的帮助!

    此致、

    Giann。

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

    您好 Giann

    我记得在 PC 上用32位进行了测试、结果略好一些。

    稍好一点、但仍然错了、对吧? 这是一个 轻微的错误 非常错  (即第一个批次后不可用)、就像您之前显示的一样?

    32位模式应是参考/基线、因此如果不正确、则会建议参考实现中出现问题、这也会影响任何硬件优化/加速实现。  

    [引述 userid="633019" url="~/support/processors-group/processors/f/processors-forum/1498774/am62a7-accuracy-issue---c7x-vs-cpu/5770579 #5770579"]

    e2e_accuracy.zip

    • 数据: 此文件夹位于 osrt_python/ort/文件夹内、包含要推断的输入;
    • onnxrt_ep_mlp5.py: 我的用例的自定义编译脚本、位于 osrt_python/ort/文件夹内;
    • mLP_Pytorch_static5.onnx mLP_Pytorch_static5_label_map.json: 用于测试目的的模型和用于检查准确性的标签。 这两个文件都位于 Docker 的 edgeai-tidl-tools/models/public 文件夹中;
    [/报价]

    感谢您提供此内容。 请稍等几天、在此处提供更新。 如果我对所提供的脚本或数据有一些疑问、我会尽快告诉您。

    • 请确认 edgeai-tidl-tools 上的 SDK 版本和/或标签。 该10_01_00_04/10.1 SDK 是什么?

    正如提醒一样、我很可能会确认这是一个参考实现问题、它将被记录为一个错误、并需要一些时间来解决。  

    BR、
    Reese

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

    你好 Reese!

    稍好一点、但仍然错误、对吧? 这是一个 轻微的错误 非常错  (即第一个批次后不可用)、就像您之前显示的一样?

    没错。 ‘m、我认为、我回顾的"目标更好的结果"可能只是结果随机性的产物。 我重复打了两次、这次32位的精度约为52%。

    请确认 edgeai-tidl-tools 上的 SDK 版本和/或标签。 这个10_01_00_04/10.1 SDK 是吗?

    我当时使用版本10_00_08_00在板上编译和测试东西。 但我会分配一些时间来从头开始测试版本10_01_00_04的东西,并返回给你。

    正如我所说的、很可能我确认这是一个参考实施问题、它将被记录为一个错误、并需要时间来解决。  [/报价]

    不用担心、我理解这些事情需要时间。 我最后发布此问题的部分原因是为了确保我没有错过任何关键步骤、还可以帮助发现其中一个难以跟踪的错误。

    感谢您一如既往的大力支持。

    此致、

    Giann。

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

    尊敬的 Giann:

    我应该提前问过、你能给我提供你用来做这个的 model_config 条目吗? 我想您可能也修改了一些后处理代码(common_utils.py?) 这也非常有帮助。

    也许最简单的事情是 tarball 你的 examples/osrt_python 目录 ,并共享这样所有的源代码是一致的

    BR、
    Reese

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

    您好 Reese、

    是的、这里是:

        "mlp_pytorch_static5": create_model_config(
            source=AttrDict(
                infer_shape=True,
            ),
            preprocess=AttrDict(
                resize=None,
                crop=None,
                data_layout="NCHW",
                resize_with_pad=False,
                reverse_channels=False,
            ),
            session=AttrDict(
                session_name="onnxrt",
                model_path=os.path.join(models_base_path, "mlp_pytorch_static5.onnx"),
                input_optimization=True,
            ),
            task_type="other",
            extra_info=AttrDict(num_rows=180, num_classes=5)
        ),

    其中 models_base_path 是多少

    models_base_path = '../../../models/public/'

    也许最简单的事情是压缩您的 examples/osrt_python 目录并共享、 这样所有源代码都是一致的

    让我先清理文件夹、然后再将其发送给您。 现在有几个文件,我一直在使用测试材料,我认为这将是一个有点过于分散发送它的原样。

    如果需要更多信息、请告知我。

    此致、

    Giann。

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

    尊敬的 Giann:

    我能够破解代码并生成我需要的内容。  

    我使用参考模型更深入地了解了模型在每个阶段的中间输出、并且原始假设是正确的。

    数据的第一个块/批/行在整个网络中都很好(数据的第一个1/5、适用于您的案例)。 在每一层之间传递的其余数据是完全错误的。 根本原因不清楚、但确实是在发生浮点基准模式。 因此、量化后、预计精度会进一步下降。 我需要向开发团队提出这个问题。  

    我尝试了使用 deny_list 来防止 TIDL 加速一些层。 仍然存在误差、但同样值得注意的是、从 argmax 的角度来看、输出现在至少是正确的、请参阅下面不同条件下的输出数据

    [[ output ]] argmax class (1-indexed)
    
    [[ -19.854969      6.298686     18.908436    -76.92346    -201.2036    ] 3 
     [  15.466614     50.259216     12.97859    -112.03983    -198.6063    ] 2
     [   6.253457     -8.780747     -4.716157     -4.1485167   -19.801765  ] 1
     [ -58.118713    -43.002296      2.1930084     8.446512     21.171597  ] 5
     [   9.201027     10.682446     -0.30513966  -25.332159    -43.82667   ]] 2
    ^^ tensor_bits = 32
    
    
    [[ -19.854958      6.2986827    18.908432    -76.92345    -201.20358   ]  3
     [ -12.10481      46.394966     25.568953   -125.3672     -245.01732   ]  2
     [ -26.210058      0.28695372   10.868061    -37.725567    -79.95061   ]  3
     [ -78.44962     -51.275146     11.368432     17.634438      4.835573  ]  4
     [   6.612872     32.4673        7.5877786   -74.13031    -119.98943   ]] 3
    CPU offload
    
    
    [[ -19.854969     6.298686    18.908436   -76.92346   -201.2036   ] 3
     [ -10.618736    44.752426    24.46529   -123.04369   -241.65892  ] 2
     [ -23.809456     0.9467592    9.758838   -38.54927    -78.231735 ] 3
     [ -78.99292    -52.33345     10.288101    16.722866     8.058851 ] 4
     [   8.462003    31.874058     6.7729435  -70.71581   -115.059006 ]] 3
    tensor_bits = 32, deny first two layers
    'deny_list:layer_name': '/network/network.0/Gemm, /network/network.1/Relu'

    请注意、我在10.1 SDK (对于 edgeai-tidl-tools、为10_01_04_00标签/发布)上测试了此内容、因此此版本以及10.0中存在错误

    BR、
    Reese