Mxnet模型轉換ONNX,再用tensorrt執行前向運算


環境:ubuntu16.04

tensorrt版本:5.1.5.0

cuda版本:9.0

GPU:1080Ti

Mxnet版本:1.3.1

cudnn:7.3.1

1、tensorrt安裝:

https://github.com/NVIDIA/TensorRT

tensorrt的不同版本:

https://developer.nvidia.com/nvidia-tensorrt-download

tensorrt python版的安裝參考:

https://blog.csdn.net/zong596568821xp/article/details/86077553

官網參考:

https://docs.nvidia.com/deeplearning/sdk/tensorrt-install-guide/index.html

其實看官網安裝tensorrt很簡單

 

2、安裝ONNX_TensorRT:

這里才是重點,由於mxnet模型不能直接在tensorrt上直接進行前向運算,所以需要先將mxnet模型轉換為onnx模型,再用tensorrt對onnx模型進行前向運算,即模型轉換:mxnet->onnx  tensorrt使用onnx完成計算。

首先要安裝ONNX_TensorRT,開始踩坑(真是太坑了!!)

ONNX_TensorRT:

主要步驟看官方教程

https://github.com/onnx/onnx-tensorrt

第一個坑:cmake找不到cuda編譯器。cmake3.15.1和3.11.1均無法找到cuda的編譯器,最后安裝的3.9.0成功找到編譯器(期間改了無數遍環境變量各種折騰,就是找不到)

由於ONNX_TensorRT需要依賴protobuf和tensorrt,tensorrt前面已經裝好了,現在安裝protobuf:

https://github.com/protocolbuffers/protobuf

源碼安裝和pypi兩種都做了,原因是兩者安裝完以后cmake編譯時均找不到protobuf,后來更改了third_party下的CMake.lists中233行

COMMAND ${ONNX_PROTOC_EXECUTABLE} ARGS ${PROTOC_ARGS}改為

COMMAND ${Protobuf_PROTOC_EXECUTABLE} ARGS ${PROTOC_ARGS}

Protobuf_PROTOC_EXECUTABLE為定義好的環境變量名稱來找到/usr/local/bin/protoc(這一步弄了兩天終於編譯過了)

第二個大坑:

mxnet模型轉換為onnx模型和tensorrt讀取onnx模型並創建engine:

mxnet在定義網絡時(以下均為symbol情形)盡量將所有函數參數確定,不要用默認參數(及時它們相同),否則容易報錯。

期間遇到的問題:

1、BatchNorm下attribute含有spatial,而onnx貌似不支持這一屬性(本人也不太清楚spatial具體作用),在轉換時注掉spatial=0

2、tensorrt讀取onnx模型時發現不支持3d卷積操作,tensorrt支持的onnx operator:

https://github.com/onnx/onnx-tensorrt/blob/master/operators.md

3、源碼安裝的mxnet(1.3)版本轉換onnx時deconv不支持,到

https://github.com/apache/incubator-mxnet/tree/fd34dc5f847192dfd522555afdf13be1eb67b72b/python/mxnet/contrib/onnx

下替換文件。

4、tensorrt調用onnx model時maxpool報錯,暫不支持ospet10版本的maxpool。有些操作可以通過轉換版本實現,轉換版本方法:

https://github.com/onnx/onnx/blob/master/onnx/version_converter.py

最后是onnx安裝:

pypi安裝即可:

pip3 install onnx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM