在Jetson nano上編譯paddle(帶TensorRT)並跑通Paddle-Inference-Demo

懶人區:想直接安裝的能夠點這個連接。

---------------------------------分割線---------------

原因:

在官方的Paddle-Inference-Demo中,建議Paddle版本>=1.7。
而我的能找到的資源最高的版本是Nvidia論壇的1.6.3版本的paddlepaddle-gpu。以及文檔中提供的0.0.0版本(連接)。
https://forums.developer.nvidia.com/t/paddlepadd-gpu-1-6-3-for-jetson-nano-now-available/111655
在這裏插入圖片描述
在跑Demo的過程當中,發現文檔中給出的版本沒有Paddle-TensorRT的功能,雖然能夠使用GPU加速。可是總感受有TensorRT但卻用不上很膈應。
另外,Nvidia論壇放出的版本雖然支持TensorRT,可是版本低於Paddle-Inference-Demo要求的1.7以上。在查閱1.61.7的文檔後,發現API有很大的不一樣。
我根據1.6.3支持的API對yolov3的demo修改後,**發現推理的結果有很大出入。**參見我在Github提的issue。固然,在運行過程當中也會報model和lib版本不一致的錯誤。*推測是不一樣版本支持的算子可能不同(或者實現)? *





html

並且,已有能搜到的教程徹底沒有說起TensorRT的功能如何添加,我來填坑python

在Jetson 上編譯Paddle(帶TensorRT):

1. Jetson nano環境

JetPack4.3
Found Paddle host system: ubuntu, version: 18.04.3
-- Found Paddle host system's CPU: 4 cores
-- CXX compiler: /usr/bin/c++, version: GNU 7.5.0
-- C compiler: /usr/bin/cc, version: GNU 7.5.0

2. 編譯前的準備

安裝所需的依賴:linux

sudo pip install virtualenv
sudo apt-get install python3.6-dev liblapack-dev  gfortran libfreetype6-dev libpng-dev libjpeg-dev zlib1g-dev patchelf python3-opencv

對nano的設置c++

sudo nvpmodel -m 0 && sudo jetson_clocks #打開性能模式
#增長swap空間,防止爆內存
swapoff -a
sudo fallocate -l 15G /swapfile
sudo chmod 600 /var/swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
swapon -a

sudo swapon --show#用來查看結果
ulimit -n 2048 #最大的文件打開數量

上方的設置必定要打開,swap空間的大小能夠根據本身存儲卡的大小設置,建議8G及以上。 (穩妥一點,我用6G的時候爆過)git

更改文件:在NvInferRuntime.h中Class IPluginFactory裏添加虛析構函數。若是還有報沒有virtual的析構函數時改法是一致的。github

virtualIPluginFactory() {}

3. 編譯流程

首先克隆Paddle的Github慢的本身想辦法 )。ubuntu

git clone https://github.com/paddlepaddle/paddle

查看可用的版本:bash

git tag

切換版本:ide

git checkout v2.0.0-alpha0 #我使用的是2.0.0,由於不是穩定版,名稱不一樣

安裝NCCL函數

git clone https://github.com/NVIDIA/nccl.git
make -j4
make install

創建虛擬python環境
這裏有些說法:由於JetPack4.3的nano自帶相應的cv2模塊,不須要安裝,只須要連接便可。所以我使用的是能夠找到文件夾的方式去建立虛擬環境:

python3 -m venv name-of-env #在一個你能夠記住的位置建立

連接cv2模塊: 部份內容須要修改

ln -s /usr/lib/python3.6/dist-packages/cv2/python-3.6/cv2.cpython-36m-aarch64-linux-gnu.so(本機cv2) path-to-venv/name-of-venv/lib/python3.6/site-packages/cv2.so

使TensorRT對虛擬環境python可見
參見下方連接:
https://docs.donkeycar.com/guide/robot_sbc/tensorrt_jetson_nano/
(注意你須要作的包括使CUDA、TensorRT都設爲環境變量)
進入虛擬環境並測試cv2



source pd_env/bin/activate
#test cv2 in the following lines
...

安裝必要的包:
包括cython、wheel、numpy(版本啥的目前我沒遇到不兼容的)

進入克隆的Paddle,安裝依賴:

cd Paddle 

#安裝運行Python Paddle須要的依賴(numpy,scipy etc)
#此處安裝會比較慢
pip install -r python/requirements.txt

Cmake設置:
這裏須要說明如下:Paddle的編譯中若是使用TensorRT的話須要按照要求把庫整理成必定的格式(打包的方式我再寫一篇博客),而且添加環境變量。在編譯子圖功能的時候會用到。固然也能夠修改cmake文件夾中的tensorrt.cmake,但不保證必定能成。(我試過,但最後用的是建議的方式,見issue。**穩妥點的方法是適應源代碼的配置修改本地配置。**整理成以下格式。
在這裏插入圖片描述

mkdir build
cd build/

其餘配置能夠看文檔:連接

cmake .. \
          -DWITH_CONTRIB=OFF \
          -DWITH_MKL=OFF  \
          -DWITH_MKLDNN=OFF \
          -DWITH_TESTING=OFF \
          -DCMAKE_BUILD_TYPE=Release \
          -DON_INFER=ON \
          -DWITH_PYTHON=ON \
          -DWITH_XBYAK=OFF  \
          -DWITH_NV_JETSON=ON \
          -DPY_VERSION=3.6 \
          -DTENSORRT_ROOT=/home/dlinano/Paddle/TensorRT \
	      -DCUDA_ARCH_NAME=Auto

開始編譯:

make -j4
# 生成預測lib,生成fluid_inference_install_dir 即C++預測庫目錄
make inference_lib_dist

4. 安裝paddlepaddle-gpu

# 安裝python 庫
pip install -U python/dist/*.whl #仍是在build文件夾

5.跑通Demo

詳情請見Paddle-Inference-Demo的GitHub,不搶別人的飯碗了 連接

效果:有興趣的能夠測測快了多少

中間使用到TRT的優化部分很是慢,請耐心等待。
在這裏插入圖片描述

Trouble Shooting

1.缺乏虛析構函數的問題(上面已經說起)

2.編譯中沒有錯誤提示掛了

paddle/fluid/operators/CMakeFiles/edit_distance_op.dir/edit_distance_op_generated_edit_distance_op.cu.o
nvcc error : 'cicc' died due to signal 9 (Kill signal)

問題在於swap區不夠,內存爆了。

3.Too many files

這個問題上面的設置中提到過,須要開啓最大能打開的文件數。

To be continued.

References:

https://www.jianshu.com/p/a352f538e4a1
https://paddle-inference.readthedocs.io/en/latest/user_guides/source_compile.html
https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/build_and_install_lib_cn.html
https://paddle-inference.readthedocs.io/en/latest/optimize/paddle_trt.html
https://github.com/PaddlePaddle/Paddle-Inference-Demo/tree/master/python/yolov3

最後感謝Paddle技術人員在Github及時回答問題。

相關文章
相關標籤/搜索