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.
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。
每个图层的图层跟踪文件(浮点值)将转储到/tmp 文件夹中。 文件名以 tidl_开头。
大家好、我按照您的建议操作、由于某些原因、没有创建文件、它会打印每层统计数据、我不知道如何像下面这样理解:
起始层#-74
处理层#-74
73 512.00000-64.00000 64.00000 3.
第74层末尾 outPtrs[0]= 0x7f9815362000
您好、可以在此处获取信息:
(这实际上是指直接使用底层 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 文件示例?
您好、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位模式吗? 并分享您的观察结果
您好、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、
感谢您的更新。 同时、我打开了另一个问题、您能不能看一下?
谢谢、
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