Flow-Developers

Raspberry Pi, Raspbian, python, ROS, IoT, 電子工作, 機械学習, Deep learning, サッカー, スポーツ写真, ライフハック

build and install onnx-tensorrt on jetson xavier nx jetpack 4.4

build and install onnx-tensorrt

f:id:flow-dev:20210213134706p:plain

environment

  • jetson xavier nx
  • jetpack4.4
uname -a
Linux jetson xaveir-nx 4.9.140-tegra #1 SMP PREEMPT Tue Oct 27 21:02:46 PDT 2020 aarch64 aarch64 aarch64 GNU/Linux

update cmake (3.13 Later for onnx-tensorrt)

  • cmakeのビルドに必要な物をinstall
sudo apt install libssl-dev libprotobuf-dev protobuf-compiler

# Was neccessary for my environment for $ ./bootstrap
  • cmake 最新版をビルドとインストール

qiita.com

install onnx-tensorrt on jetosn xavier nx

  • 下記手順でonnx-tensorrtをビルド
git clone --recursive -b 7.1  https://github.com/onnx/onnx-tensorrt.git  onnx_tensorrt
cd onnx-tensorrt
mkdir build && cd build
cmake .. -DTENSORRT_ROOT=/usr/src/tensorrt -DCMAKE_INSTALL_PREFIX=/usr/  
make -j8
sudo make install

www.codenong.com

convert model onnx to tensorrt

  • 実行方法
onnx2trt my_model.onnx -o my_engine.trt

install onnxruntime 1.4.0

wget https://nvidia.box.com/shared/static/8sc6j25orjcpl6vhq3a4ir8v219fglng.whl -O onnxruntime_gpu-1.4.0-cp36-cp36m-linux_aarch64.whl
pip3 install onnxruntime_gpu-1.4.0-cp36-cp36m-linux_aarch64.whl

developer.nvidia.com

install onnx_tensorrt.backend

  • CUDAへのPATHを通しておく
#Add a blank, then these 2 lines
# (letting your Nano know where CUDA is) to the bottom of the file.

sudo nano ~/.bashrc

export PATH=${PATH}:/usr/local/cuda/bin
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda/lib64

source ~/.bashrc

# test nvcc path done
nvcc --version
  • Jetson XavierNXで"onnx_tensorrt.backend"をinstallするためには,onnx-tensorrtの以下の2Fileの変更が必要.変更差分は以下の通り.
--- a/NvOnnxParser.h
+++ b/NvOnnxParser.h
@@ -31,6 +31,10 @@
 #define NV_ONNX_PARSER_MINOR 1
 #define NV_ONNX_PARSER_PATCH 0
 
+#ifndef TENSORRTAPI
+#define TENSORRTAPI
+#endif // TENSORRTAPI
+
 static const int NV_ONNX_PARSER_VERSION = ((NV_ONNX_PARSER_MAJOR * 10000) + (NV_ONNX_PARSER_MINOR * 100) + NV_ONNX_PARSER_PATCH);
 
 //! \typedef SubGraph_t
diff --git a/setup.py b/setup.py
index 8ffa543..d6244a3 100644
--- a/setup.py
+++ b/setup.py
@@ -59,10 +59,11 @@ EXTRA_COMPILE_ARGS =  [
     '-std=c++11',
     '-DUNIX',
     '-D__UNIX',
-    '-m64',
     '-fPIC',
     '-O2',
     '-w',
+    '-march=armv8-a+crypto',
+    '-mcpu=cortex-a57+crypto',
     '-fmessage-length=0',
     '-fno-strict-aliasing',
     '-D_FORTIFY_SOURCE=2',
  • 上記の準備のち、以下のコマンドでinstallできた.
cd onnx-tensorrt
sudo apt install swig
pip3 install pycuda
sudo python3 setup.py install
  • python3で,import onnx_tensorrt.backend as backendが成功すればinstallが成功.
python3
>>import onnx_tensorrt.backend as backend

onnx->TensorRT変換するときに便利なサイト

  • TopK layer(2次元)や,Dobule型は2021/1現在,TensorRT変換できないので対処する記述が必要.

PyTorch documentation — PyTorch 1.7.0 documentation

  • onnx->TensorRT変換のErrがどこで起きてるか探しやすい.Ctrl+Fでlayer番号で検索できる.

Netron

  • Nvidiaのフォーラムに行けば大体似たようなErrに遭遇しているので,きっかけにはなる.

NVIDIA Developer Forums - NVIDIA Developer Forums

  • onnx-tensorrt/issuesも活発でよい質問多い.

github.com

  • onnxモデルをきれいにしてくれるので使ってもよいが,今回の場合は,綺麗にしすぎてTensorRT変換が出来なくなった.
  • --input-shapeで動的サイズのinputを,静的サイズに変更できるのは便利な時があるかもしれない.
  • Jetson XavierNXでonnx-tensorrtの環境を作った後だとうまくinstallできなかったので,別のPCで環境作った.

github.com