工具与软件:
您好!
我尝试使用自定义的 onnx 模型在 TDA4VM 板上执行语义分割推理。 我尝试过两种方法:
1.使用 onnxruntime 以及 TIDLCompilationProvider 和以下提供程序选项生成推理工件
TIDL_OPTIONS = {
'tidl_tools_path' : get_tidl_tools_path(),
'artifacts_folder' : WORKDIR + 'artifacts/',
"platform":"J7",
"version":"7.2",
'debug_level' : 2,
'tensor_bits' : 8,
"ti_internal_nc_flag" : 1601,
'advanced_options:calibration_frames' : 10,
'advanced_options:calibration_iterations' : 5,
'accuracy_level' : 1,
}
这不返回错误、并生成所需的伪影、但基于这些伪影和 onxruntime (具有 TIDLExecutionProvider)在电路板上进行的推理会使我的模型的性能严重下降(接近零精度)。
2.使用 onnxruntime.quantizing.quantize_static 预量化模型、然后尝试使用带有提供程序选项的 TIDLCompilationProvider 生成伪影
TIDL_OPTIONS = {
'tidl_tools_path' : get_tidl_tools_path(),
'artifacts_folder' : WORKDIR + 'artifacts/',
"platform":"J7",
"version":"7.2",
'debug_level' : 2,
'tensor_bits' : 8,
"ti_internal_nc_flag" : 1601,
'advanced_options:prequantized_model': 1,
'accuracy_level' : 9,
}
这也不会返回错误、但不会在工件文件夹中生成所有必需工件。 它生成 allowedNode.txt 和 onnxrtMetaData.txt 文件、但是没有.bin 文件;.bin 文件位于工件文件夹的 tempDir 子目录中、但是这些工件的文件大小是它们应该的4倍(表示的是浮点数据而不是 INT8)、并且它们无法成功地用于电路板上的推理。 另请注意、在 CPU 上运行预量化模型会产生高精度网络预测、因此我确信我的网络可以量化到 INT8而不会大幅降低准确性。
这个问题似乎与我使用的实际模型无关。 下面、我附上了一个随机初始化的2层 conv net 的最小示例、当根据上面的方法1进行编译+评估时、会产生低质量预测、而预量化会在 CPU 上产生更好的质量预测、但在编译时不会产生.bin 伪影。 如果您想运行此脚本以自行查看问题:
- 对于方法1、运行
- python3 minimal_workflow.py -c [在采用标准设置的 TI 开发 Docker 中]
- scp -r ti_comp_test minimal_workflow.py tda4vm:[即将脚本和模型复制到电路板上]
- python3 minimal_workflow.py -e [在电路板上]
- 对于方法2、运行
- python3 minimal_workflow.py -p [在 TI Docker 开发中]
- LS ti_comp_test/伪 影/
步骤1c 和2a 打印精度数字、说明量化的影响;请注意、1c 的数字比2a 的数字差得多。 步骤2b 显示编译预量化模型时不会生成.bin 文件。
[请注意、第1a 步确实会在 stdout 中显示一些警告、但未遇到致命错误;对于我的语义分割模型、没有类似这些警告]
非常感谢在这方面提供任何帮助! 我更喜欢使用方法2 (因为这给了我量化算法更大的灵活性)、但修复方法1也是向前迈出的一步! 感谢您的帮助!