環境: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情形)儘可能將全部函數參數肯定,不要用默認參數(及時它們相同),不然容易報錯。 期間遇到的問題: 一、BatchNorm下attribute含有spatial,而onnx貌似不支持這一屬性(本人也不太清楚spatial具體做用),在轉換時注掉spatial=0 2、tensorrt讀取onnx模型時發現不支持3d卷積操做,tensorrt支持的onnx operator: https://github.com/onnx/onnx-tensorrt/blob/master/operators.md 三、源碼安裝的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 ————————————————