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.

[参考译文] TDA4AEN-Q1:DeepLab ONNX 模型编译问题--deepwise conv

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1648776/tda4aen-q1-deeplab-onnx-model-compilation-issue----deepwise-conv

器件型号: TDA4AEN-Q1

您好、 我遇到了问题。 使用从 TI 官方 GitHub 存储库下载的 ONNX 模型执行定量编译时、会发生以下错误。 我以前已经成功地使用同一个 ONNX 模型完成了定量编译,但现在我不断收到错误,表明某个运算符不受支持。 我上传了我使用的 ONNX 文件和用于定量编译的参数供您参考。 我使用的版本是 11_01_07_00。您可以帮助检查导致此问题的原因吗?

 config.txt deeplabv3plus_mobilenetv2_edgeailite_512x512_20210405.rar 

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

    您好、
    这是因为日志中给出的层不受支持。

    [TIDL Import]  UNSUPPORTED: Allowlisting : Layer name - decoders.0.aspp.aspp_bra3.0.0 : For Depthwise convolution layer, Pad (along width) greater than the MMA width is not supported -- [tidlAllowlistingConstraints/tidl_constraint.cpp, 85]

    我建议您尝试 8 位(如果编译不起作用,也使用“advanced_options:add_data_convert_ops“:2)或修改图层以使用约束。

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

    非常感谢您的答复。 我们之前尝试使用 8 位量化进行编译、这在技术上成功、但产生的结果不符合我们的预期。 相比之下、16 位编译会产生预期结果(我们以前使用相同的网络架构成功编译过它,但现在突然遇到运营商不支持的问题)。 是否有办法提高 8 位编译结果的精度、或解决问题并成功使用 16 位编译? 我们期待着您的指导。

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

    您好、

    你是否说“完全“相同的模型与相同的工具和相同的配置工作在 16 位有时回来? 我不确定是否可以这样做。 您能否共享日志来支持您的索赔?

    关于提高性能,你可以尝试 advanced_options:output_feature_16bit_names_list, advanced_options:params_16bit_names_list 把一些层在 16 位,而运行模型在 8 位。 您还可以尝试 https://github.com/TexasInstruments/edgeai-tidl-tools/blob/11_02_07_00/docs/quantization.md#mixed-precision 以了解哪些层在 16 位时可能表现更好(这依赖于这样一个麻烦的层不应在 16 位运行这一事实)。

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

    感谢您的耐心答复。 首先、让我澄清我的意思是“完全相同“。 我的目标 ONNX 模型的网络结构与 TI 的 GitHub 存储库中的文件相同。 我已经成功编译了从 TI 存储库下载的 ONNX 模型、并在 EVM 板上运行该模型、特别是我之前上传的 deeplabv3plus_mobilenetv2_edgeailite_512x512_20210405.rar 文件中的 ONNX 模型。
    但是、当现在使用相同的 SDK 版本 11_00_07_00 时、我遇到不支持运算符的错误。 很遗憾、我无法提供此问题的相关日志。 但我认为下面的观察结果表明网络模型应该可以编译:映像中显示的结构是一个不受支持的反向卷积运算符,但这个精确的运算符存在于 TI 的 GitHub 存储库中的 ONNX 模型中(其与我的目标模型具有相同的参数),相应的 io.bin 和 net.bin 文件位于文件夹中。 这正是我感到困惑的地方。
    此外、我将尝试稍后提到的精度提高措施。 感谢您的宝贵建议、我期待您的解释。

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

    重要的是、我们现在已经使用直接从 TI 的 GitHub 存储库下载的原始 ONNX 文件重新测试编译、并且抛出完全相同的“运算符不受支持“错误。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    但我相信以下观察结果表明网络模型应该是可编译的:映像中显示的结构是一个不受支持的反向卷积运算符、但这个精确的运算符存在于 TI 的 GitHub 存储库的 ONNX 模型中(与我的目标模型具有相同的参数)、相应的 io.bin 和 net.bin 文件位于文件夹中。 这是我的困惑

    在 edgeai tidl model zoo 中、该模型编译为 8 位、这就是它不会抛出任何错误的原因。 此错误尤其源于以下约束 (c7x-mma-tidl/ti_dl/utils/tidlModelImport/tidlAllowlistingConstraints/tidl_constraints_conv.h)

        TIDL_CSTR(
            "For Depthwise convolution layer, Pad (along width) greater than the MMA width is not supported",
            "",
            "",
            [](const sTIDL_LayerPC_t *layer, string &logs){
                auto convParams = layer->layerParams.convParams;
                /* Depthwise separable convolution */
                if (((convParams.numGroups == convParams.numInChannels) || (convParams.numInChannels == 1)) &&
                    (convParams.numGroups == convParams.numOutChannels) &&
                    (gParams.numFeatureBits < 32))
                {
                    /* MMALIB Bug MMALIB-566*/
                    int32_t simd_width = -1;
                    if((gParams.deviceName & ~TIDL_OTF_FLAG_BIT) == TIDL_AM62A)
                    {
                        simd_width = 32U;
                    }
                    else
                    {
                        simd_width = 64U;
                    }
                    if( gParams.numFeatureBits > 8 )
                    {
                        simd_width = simd_width / 2;
                    }
                    /* This fixes TIDL-2946 */
                    if(convParams.padW > simd_width)
                    {
                        return false;
                    }
                }
                return true;
            }
        ),

    我们可以观察到、当模型编译为 16 位```sIMD_WIDTH = SIMD _WIDTH / 2 = 16```时、这将产生误差、因为该层中的 padW=18。 在这段代码中、8 位不会出现此问题。 这解释了该行为。