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.

[参考译文] TDA4VM:TDA4VM

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1165701/tda4vm-tda4vm

器件型号:TDA4VM

您好!

我在考虑 QAT 时有一个问题。

我想对一些模型层执行8位量化、并以16位精度推理一些层。  我对电桥-电感器进行了一些更改、以便这些层(卷积)不会被替换  

对于 QuantTrainConv2d、它们也不会接收 PACT2。  这些图层不会在  ONNX 图中"接收"剪辑图层。

现在、我想在 TIDL 中执行编译并创建伪影。 我不想更改已计算的8位图层的剪辑范围。 但是、我想为16位范围的"非触控"计算这些值。 如何做到这一点?

谢谢、

Alex。  

 

 

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

    如果缺少裁剪图层、TIDL 应在模型导入期间插入裁剪参数。 但我们尚未验证您尝试的情形。  请在 TIDL 中试用您的模型、并让我们知道它是如何运行的。

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

    感谢您的回答、   

    我的第一个解决方案将不起作用、因为对于缺少此削波的层、仍然会在 TIDL 中计算削波。 我找到了另一种解决方法、在  QuantTrainConv2d 类中为我不想量化的层设置 quantTecting_enable = False。 在这种情况下、会为所有层计算削波。 在 TIDL 中导出伪影时、我将这些非量化图层设置为在编译选项中以16位运行。

    但是、当我在导出工件后以执行模式运行 onnxruntime 时、输出与 py火炬 模型不匹配。

    根据我的理解、当我设置  quanted_enable = False 时、不会在该特定层上完成 QAT。  

    您能在这里指出一个可能的问题吗?

    谢谢、

    Alex。

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

    我尚未测试将 quanted_enable 设置为 False 以选择图层。 如果您可以单步执行代码并确保它按照您的预期运行、则表示在 QuantTrainPAct2模块中执行量化。

    >>但是,当导出伪影后以执行模式运行 onnxruntime 时,输出与 py火炬 模型不匹配。

    您能更详细地描述一下吗? 哪种热电筒型号? 浮点模型还是 QAT 模型?  哪一个 onnx 运行时? 原始 onnxruntime 还是带有 tidl 卸载的 onnxruntime?

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

    我将在 QAT 之后讨论该模型。 据我了解、 在推理过程中、它仍然使用浮点权重、但 在 QAT 期间使用 PACT2块中设置的值来剪辑激活。 我将使用 onnxruntime 并在使用 QAT 添加的剪辑层导出的 onnx 图形上执行 tidl 卸载。  我在  compile_options 中将 Accuration_level 设置为0以避免 tidl 校准、使用单个 onnx 会话运行来创建工件。  

    创建伪影后、我使用  TIDLExecutionProvider 通过模型推理图像。 然后、我将 onnx 输出与 QuantTestModule 中来自 torchvision edgeailite/xnn 的模型输出进行比较。 我的理解是、输出应该完全匹配。

     

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

    我现在明白了。 输出可能不完全匹配-因为 TIDL 和 PyTorch 实现某些运算符的方式可能存在细微差异。 我们一直在使用精度测量来查看 QAT 是否在提高精度。

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

    问题是、输出不匹配的裕度很高。 模型只有卷积和大小调整图层。 所有卷积层都有线夹。 我如何检查这些差异来自什么?  _tidl_net.bin_paramDebug.csv 文件非常不可用、无法理解。

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

    您能否尝试在提供给执行提供程序的 delegate_options 中将 debug_level 设置为3。  

    https://github.com/TexasInstruments/edgeai-tidl-tools/blob/master/examples/osrt_python/common_utils.py#L63

    https://github.com/TexasInstruments/edgeai-tidl-tools/blob/master/examples/osrt_python/ort/onnxrt_ep.py#L137

    每个图层的图层跟踪文件(浮点值)将转储到/tmp 文件夹中。 文件名以 tidl_开头。

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

    大家好、我按照您的建议操作、由于某些原因、没有创建文件、它会打印每层统计数据、我不知道如何像下面这样理解:

    起始层#-74
    处理层#-74
    73 512.00000-64.00000 64.00000 3.
    第74层末尾 outPtrs[0]= 0x7f9815362000

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

    您好、可以在此处获取信息:  

    https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/08_04_00_06/exports/docs/tidl_j721e_08_04_00_16/ti_dl/docs/user_guide_html/md_tidl_fsg_steps_to_debug_mismatch.html

    (这实际上是指直接使用底层 TIDM-RT、而不是使用 python 接口、但仍然可以提供见解并解答您在上面提出的问题)

    这也可能有用: https://github.com/TexasInstruments/edgeai-tidl-tools/blob/master/docs/tidl_osr_debug.md

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

    大家好、我仍在努力解决我的问题。 在将 DEBUG_LEVEL=3设置为  TIDLExecutionProvider 时、有一件事引起了我的注意。

    它会按 QAT 后 ONNX 文件中提供的格式、最小值和最大值精确打印每个格式的缩放值、最小值和最大值。 但是、当我观察第一层信息时、它会提供以下内容:

    起始层#-1
    0 128.00000 0.00000 255.00000 1.
    处理层#- 1.
    1 256.00000 0.00000 1.00000 0
    第1层结束、outPtrs[0]= 0x7f72a003107e

    在输入之后和第一个 Conv 层之前有一个剪辑层: 1 256.00000 0.00000 1.00000 0。 实际上、输入图像除以255、以便输入值介于0和1.0之间。 但是 ,这个:0 128.00000 0.00000 255.00000 1呢? 它来自哪里?  

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

    我已在 TIDL 专家中进行循环来研究这一点。 是否可以附加 onnx 文件示例?

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

    e2e.ti.com/.../RCF360_5F00_for_5F00_conti_5F00_split_5F00_24_5F00_07_5F00_2022_5F00_ShortRange_5F00_TDA4_5F00_quantization_5F00_DepthNet.zip

    您好、Manu、请根据您的请求在 ZIP 存档中找到 onnx 文件。

    谢谢、

    Alex。

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

    0 128.00000 0.00000 255.00000 1 -是输入传感器的信息(数据 ID 0)。 输入被视为单个 INT8 (最后1指定元素类型),因此刻度被选为128。  在这里、最小和最大削波值不正确、它不用于任何 计算操作系统、可以安全地忽略。  

    我希望此主题中的这个特定问题仅供参考、您是否观察到此输入 Tensor Min 和 Max 特定的任何问题、如果是、请告诉我

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

    您好、Kumar、

    在提取伪影后、在 QAT 和 TIDL onnxruntime 推理之后、我的 py火炬 模型输出之间存在精度问题。 根据我的理解、我应该得到相似或非常接近的结果、因为每个卷积层在 QAT 期间已经预先计算了其激活范围。  

    但情况并非如此。 我试图了解问题的来源、甚至制作了一个真正简单的子模型、该子模型只有一个卷积。 我再次提取了这些伪影并在推理上对其进行了测试。 令我惊讶的是、已经存在很大的差异。

    下面是我的简单模型:

    runtimes_visualization.svg 看起来正常:

    但是 out_tidl_net_bin.svg 看起来很奇怪:从该 BatchNorm 层到哪里?

    模型中的数据是浮点标准化图像、因此数据在范围[0、1]内

    卷积有32个通道、奇怪的是第一个通道为每个96x896条目提供零误差、但所有其他通道在这个早期阶段已经显示出大不匹配。

    如果需要、我可以为您提供 onnx 文件、输入/输出数据和工件。

    谢谢、

    Alex。  

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

    第一个削波层在激活削波时转换为 batchNorm (刻度和偏置=0)。 第二个剪辑与卷积合并、并激活剪辑。

    不知道为什么只有一个通道产生正确的结果。

    请共享模型、输入/输出数据以及您用于重新生成此问题的模型编译代码。

    BTW、是此模型的结果在 PC 仿真模型中正常工作

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

    您好、Kumar、  

    请参见随附的 depthnet.zipe2e.ti.com/.../0131.test.zip

    在内部、您会发现:

    1. test.onnx - onnx 型号

    2. test.npy - img 以 NumPy 数组的形式进行推理

    3. output.npy -手电筒型号的输出

    4. python_code.py -我用于创建伪影和推理的代码。

    对于您的问题、我的所有实验都是在 PC 仿真模式下使用 onnx 运行时的 TIDLExecutionProvider 完成的。

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

    尊敬的 Alex:

    我们将尝试并返回到这里。

    同时、您可以尝试16位模式吗? 并分享您的观察结果

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

    您好、Kumar、

    我尝试了16位、结果更糟。 最大误差为0.2、而8位为0.04。 等待您的调查结果。

    谢谢、

    Alex。

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

    8位 QAT 模型在16位推理中会非常糟糕。 我想 Kumar 建议尝试16位浮点模型。

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

    库马尔、您好、我做了一个非常简单的实验、证明了我面临的问题。 我导出了一个带有单个卷积且内核与下图相同的微型 ONnx 模型:

    您可以看到、模型的输入是单通道5x5图像。 我为所有5x5条目使用了单个值来测试模型的输出是否符合数学和手电筒模型。

    输入的5x5示例:

     '

    模型的输出:

    计算方法应为:

    输入剪辑(范围0-1,标度256): floor (0.8 *256 +0.5)/256=0.80078125

    卷积不影响计算

    输出剪辑(范围0-4,比例64):floor (0.80078125 *64 + 0.5)/64 = 0.796875

    不过、可以看到 TIDL 得出了0.78125、即0.015625的差值。

    下表总结了我测试过的查看案例。  手电筒结果始终符合量化背后的数学原理、

    而不是 TIDL。  

    谢谢、

    Alex。

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

    尊敬的 Alex:

    库马尔旅行了几天。 我希望他在回来后会尽快作出答复。

    此致 、Manu

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

    您好、Manu、

    感谢您的更新。 同时、我打开了另一个问题、您能不能看一下?

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1175872/tda4vm-how-to-instruct-tidl-to-run-particular-layer-with-16-bits-accuracy

    谢谢、

    Alex。

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

    我已将此新线程转发给 TIDL 专家、他将在该线程中作出响应。 让我回答原来的问题。

    我与 Kumar 进行了讨论。 在 TIDL 中、定点实现中有近似值、可在8位下获得最佳性能。 因此、初始线夹层不会得到精确表示。 这可能是输出存在差异的原因。  因此、预期来自 py火炬 和 TIDL 的 QAT 输出之间的输出不匹配。 TIDL 实现卷积偏置和调整图层大小时也有近似值。

    (注意:  通过在 QAT 期间将 quanted_in 设置为 False github.com/.../quant_graph_module.py  

    我之前尝试强调的一点是:"我们一直在使用精度测量来查看 QAT 是否在提高精度。"

    您可以在以下报告中看到 QAT-P2所示的分类模型: https://github.com/TexasInstruments/edgeai-modelzoo/blob/master/modelartifacts/report_tda4vm.csv

    以及此处的结果: https://github.com/TexasInstruments/edgeai-torchvision/blob/master/docs/pixel2pixel/Quantization.md