器件型号: AM62A7
将模型从 TI AM62A 10.01.02 迁移到 TI AM62A 11.01.07 时出现问题。 模型推理结果在 10.01.02 版中是正常的、但相同的模型在迁移到 11.01.07 时遇到问题。 问题描述如下:模型推论在 PC 上没有问题、但当部署到电路板进行推理时、输出结果不正确;模型输出值要么异常大、要么非常小。
这可能是什么原因造成的?
附加的文件和日志来自工程。
此致、
Longgang
run_python_examples.zip
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
将模型从 TI AM62A 10.01.02 迁移到 TI AM62A 11.01.07 时出现问题。 模型推理结果在 10.01.02 版中是正常的、但相同的模型在迁移到 11.01.07 时遇到问题。 问题描述如下:模型推论在 PC 上没有问题、但当部署到电路板进行推理时、输出结果不正确;模型输出值要么异常大、要么非常小。
这可能是什么原因造成的?
附加的文件和日志来自工程。
此致、
Longgang
run_python_examples.zip
尊敬的 Longgang:
我们将分析您提供的文件和日志、并返回给您。 听起来主机 — 目标不匹配[1][2]。
我们通常通过在 PC 和目标上使用等效脚本运行模型来实现这一点、debug_level=3。 然后比较 tidl_trace 文件的/tmp 下的跟踪(通常使用像 md5sum 这样的哈希值)、看看是否存在某个特定的层、在该层的精确度会有所不同。
请允许我们花些时间对此进行调查
BR、
Reese
您好 Reese、
以下是 debug_level=3 之后的日志、可供参考和分析。 谢谢你。
e2e.ti.com/.../run_5F00_model.zip
尊敬的 Longgang:
对于相同的输入、而不是日志、请共享来自 EVM 和 PC 的布线。 运行推理后、您将在/tmp 目录中找到.bin 文件。 无需为此重新编译模型(在运行 TIDL 脚本时删除-c 标志)。 这些 bin 文件是 C7x 上运行的每个层的推理输出。
请查看 Reese 在上一次答复中分享的第一个和第二个链接。
需要说明的是、开关使用的输出在 EVM 和 PC 上是否都不准确、或者在 PC 和 EVM 上运行模型时输出是否不同? 如果稍后、请按照我和 Reese 的答复继续操作。
此致、
Jay
e2e.ti.com/.../FaceKeypoint_5F00_tmp.zip
根据上述建议、我们执行了以下故障排除:
使用三种精度方法:32、16 和 8。
1.配置了三种方法:Tensor_bits = 32、tensor_bits = 16 且 tensor_bits = 8。
2.运行脚本:
1.修改了 common_utils.py 中的参数:Tensor_bit = 8、calibration_iterations = 600、debug_level = 4。
2.事先清除 tmp 目录: python3 onnxrt_ep.py $ncpus -m FaceKeypoints (remove -c ),运行配置,生成新的 tmp 并保存它。
3.图层激活比较:生成的定点 (*.y) 和浮点 (_float.bin) 输出逐层比较,并保存渲染的图像。
相关文件已作为附件上传。
目前尚不清楚相关的操作和方法是否存在任何问题。 如果没有问题、是否有办法确定哪个层的丢弃点导致了精确推理异常? 如果我们精确定位特定的层,我们如何调整结构以保持相应的精度(平台自适应运算符)? 已经提供了有关文件和模式、但目前进展缓慢。 您能否重现此问题并对其进行故障排除? 谢谢你。
尊敬的 Longgang:
我认为对调试指南所说的内容存在一些误解。 不应逐个比较浮点输出和定点输出。 正确的测试方法是比较 onnx 模型的浮点数输出和模型量化时的浮点数输出。 这些跟踪(BIN 文件)随后可与该实用程序一起使用[1]
要正确生成布线、请按照以下步骤操作:
1.需要为 ONNX 模型中的每个图层添加输出。 使用此文件[2]。 在较新的 TIDL 工具中、您无需单独下载该文件。
2.像使用这个脚本一样转储张量[3]。 在较新的 TIDL 工具中、这将在禁用卸载机制中进行处理。 目前、我使用的是使用 np.zero 生成的数组。 您可能需要通过实际图像。
3.像以前一样使用伪影获取迹线,只需要 8 位迹线。 使用相同的图像生成张量。
4、使用前面提到的实用程序获取比较图[1]。 示例命令:
streamlit run tidl_debug_scripts/layer_trace_inspector.py -- \
--traceONNX <tidl_tools_path>/traces/32bit \
--traceTIDL <tidl_tools_path>/traces/8bit \
--traceInfo <tidl_tools_path>/model-artifacts/FaceKeypoint/artifacts/tempDir/subgraph_0_tidl_net.bin.layer_info.txt
现在、我生成了布线、并得到了以下误差图: 
由此我们可以看到数据 id 75 和 176 是主要的离群值。 在它们的图形中也可以看到同样的情况(仅附加 75 个): 
这些点指向以下层:
1.数据 ID 75: /backbone/layer5/layer5.0/se/global_avgpool/GlobalAveragePool
2.数据 ID 176: / classification_head/pool/GlobalAveragePool
您可能需要使用混合精度量化来将一些张量设置为 16 位量化和测试。 您还可以通过将整个模型量化为 16 位进行测试、然后查看精度。 这是一个迭代过程、通常这些就是这些步骤。
[1] https://github.com/TexasInstruments/edgeai-tidl-tools/tree/11_01_06_00/scripts#inspecting-intermediate-layer-traces
[2] https://github.com/TexasInstruments/edgeai-tidl-tools/blob/master/osrt-model-tools/osrt_model_tools/onnx_tools/tidl_onnx_model_utils/onnx_add_intermediate_outputs.py
[3] e2e.ti.com/.../dump_5F00_layers.py
此致、
Jay
尊敬的 Goyal:
根据您的建议、我们重新完成了相关工作、但与您的调查结果有偏差。 问题是、将 ONNX 模型的浮点输出与模型量化的 int16 输出进行比较时、从第二层开始就会出现问题。 比较图显示显著的偏差、而图形融合显示相应层的以下浮点值:min/maxValue=(0、0)、min/maxTensorValue=(0.000000、0.000000)
tensorScale=1.000000
tensorZeroPoint=0
elementType=TIDL_SinglePrecFlot。 我们最初怀疑这是因为模型没有被量化。 我们不确定此怀疑是否正确。 如果是、配置文件是否有问题? 请帮助我们检查和验证这一点。 请务必注意、我们的 SOC 使用 AM62A。 在从`网站下载的` common_utils.py 文件中、“platform":“:“j7",“,"version"、"version":“:"7.2"“"7.2"。“。</s>“ 是否需要根据我们的 SOC 重新调整这些参数? 如果是、是否有任何相关资源可供参考? 如果是、那将是很好的。 随附相关的验证材料以供您审核。
另外、如果您已获得正确的验证结果、请将相应的配置文件和其他相关文档打包和副本?如果您可以提供这些文件、这将非常有帮助。
此致、
Longgange2e.ti.com/.../am62a_2D00_11.01.06.zip
尊敬的 Longgang:
“"7.2"</s>“ “"平台“平台“:“j7",“,"version"、"version":“:"7.2"
没关系。 编译器将针对 AM62A 运行。 如果要验证您正在使用哪个 SOC、可以检查 SOC 环境变量。
我们最初怀疑这是因为模型没有量化。 我们不确定此怀疑是否正确。 [/报价]我认为情况并非如此。 由于子图 bin 文件是在工件/目录中生成的、因此编译器正在运行。
关于量化、请查看本文档[1]。 我想强调的几点是、请使用非对称量化(量化量化比例_type=4)。 此外、将校准帧数增加到 50、将校准迭代增加到 25。 您可以尝试使用更高的值。 为此、我连接了一个补丁。 这还包括在 onnxrt_ep.py 文件中设置 calib_images 数组以指向正确的图像。 请根据您的要求进行设置。 其中包括我在基础 TIDL 工具之上所做的所有必要更改。 model_config 与您的模型相同、因为我找不到重大问题。
e2e.ti.com/.../0001_2D00_Add_2D00_Hirain_2D00_models_2D00_to_2D00_repo.patch
此致、
Jay
尊敬的 Longgang:
我想指出另一个可能的解决办法。
在模型工件中,您应该有一个文件 artifacts/tempDir/subgraph_0_tidl_net.bin.svg。 如果此文件在 SDK 10.1 和 11.1 之间相同、并且 SDK 10.1 中的精度结果足以满足您的需求、则可以查看此[1]。 在 SDK 10.1 中以写入模式运行此文件、将文件复制到 11.1 并在读取模式下运行。 不过、这与我之前关于量化比例_SCALE_TYPE = 4 的建议不符 。
该选项的目的是存储量化选项、以便 TIDL 编译器不必在重新编译时多次执行相同的工作。 请注意、只有编译后的模型(不仅仅是 ONNX)相同时、此方法才有效。 因此、您需要检查我在上面指向的文件。
[1] https://github.com/TexasInstruments/edgeai-tidl-tools/blob/master/docs/quantization_proto.md
此致、
Jay
尊敬的 Longgang:
到目前为止、我正在回顾相关主题和进度。 根据原始问题、PC 和 EVM 结果之间存在差异、对吗? 在 PC 上 11.1 的精度是否足够? 或者、无论 PC 或 EVM 如何、SDK 11.1 的精度是否较低(但在 10.1 上已足够)?
如果 PC 和 EVM 之间确实存在精度问题、那么我们要在这些设备上收集布线、并确定哪一层是第一层不匹配位(我想通过 md5sum 或类似的 file-hash 进行检查)。 为此、我们来 tensor_bits=8。 隔离不匹配的图层后、将其添加到拒绝列表中、重新编译网络、然后重新运行测试。 如果多个层导致此类问题、则可能需要进行几次迭代。
我们可以拒绝列出某个层或将其标记为 16 位量化、但在某些情况下、EVM 端实现存在错误、需要修复和更新固件。
我会注意到:在查看精确的图像时,有时生成的图像很难解释。 我通常说,如果有一个图像显示准确性 — 异常(你已经注意到几个),并且下面的一层显示类似的错误模式,那么该层确实会导致问题。 如果精度立即在下一层恢复、通常可以忽略前一层。 您在 10.1 跟踪中指出了一些、但以下图像看起来很好 --我不担心这些跟踪。
BR、
Reese