onnx 部署的bug(1)
onnx
tensorFlow 转onnx的文件做部署时,onnx读取遇到的问题:
主要报错信息为:
[09/26/2022-16:03:16] [E] [TRT] ModelImporter.cpp:720: While parsing node number 10 [Reshape -> "reshape"]:
[09/26/2022-16:03:16] [E] [TRT] ModelImporter.cpp:721: --- Begin node ---
[09/26/2022-16:03:16] [E] [TRT] ModelImporter.cpp:722: input: "biased_tensor_name"
input: "shape_tensor"
output: "reshape"
name: "reshape"
op_type: "Reshape"
doc_string: ""
domain: ""[09/26/2022-16:03:16] [E] [TRT] ModelImporter.cpp:723: --- End node ---
[09/26/2022-16:03:16] [E] [TRT] ModelImporter.cpp:726: ERROR: ModelImporter.cpp:162 In function parseGraph:
[6] Invalid Node - reshape
Attribute not found: allowzero
TensorRT load onnx model already!
[09/26/2022-16:03:16] [E] [TRT] 4: [network.cpp::nvinfer1::Network::validate::2411] Error Code 4: Internal Error (Network must have at least one output)
[09/26/2022-16:03:16] [E] [TRT] 2: [builder.cpp::nvinfer1::builder::Builder::buildSerializedNetwork::417] Error Code 2: Internal Error (Assertion enginePtr != nullptr failed.)
[09/26/2022-16:03:16] [I] [TRT] [MemUsageChange] Init CUDA: CPU +0, GPU +0, now: CPU 39230, GPU 4403 (MiB)
可以看出主要模型的[Reshape -> "reshape"]:这一部分出错,
通过网站https://netron.app/查看模型
上网查询发现很多也都是Reshape出错,也有的建议尽量别使用reshape。
如Pytorch转TensorRT中的坑_永恒_一瞬的博客-CSDN博客。[ONNXRuntimeError] :6 : RUNTIME_EXCEPTION : Non-zero status code returned while running Reshape node | 码农家园 (codenong.com)
此处先留一个坑(后续调查一下为啥reshape特别容易出错,但是reshape很常用,按理说不应该存在这种问题)
但是因为我在项目中是做最后部分的,时间比较紧,要求上游修改模型架构,重新训练,也不太来得及。人家也不愿意做。
我一番搜索,发现了onnx文件依然可以做模型修改。那是不是可以先修改onnx文件,将Reshape去掉在做模型的读取部署呢。
答案当然是可行的。要不然也不会有这篇记录。
具体思路为,将onnx的Reshape-->reshape替换或者删掉,因为这一部分只做了数组的尺寸的变化,对数据结果并不会产生任何影响。
工具就是onnx-modifier: A tool to modify onnx models in a visualization fashion, based on Netron and flask
onnx-modifier功能还是很丰富的,刚好可以满足我的要求,在这里对作者表示敬意和感谢。
修改后的模型如下:(我删掉了Reshape,还给最后的输出层改了一个名字output,原来的reshape容易引起误解)
经测试完全成功,onnx的模型部署一切正常,输出与源文件一致。(打完收工,完结撒花!)