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的模型部署一切正常,輸出與源文件一致。(打完收工,完結撒花!)
浙公網安備 33010602011771號