在学习使用deepstream以及Tensorrt的过程当中,发现Tensorrt对一些现在常见网络如Retinanet,YOLOV3,YOLOV4,SSD的一些层无法解析,因此需要下载编译Tensorrt自己实现的一些Plugin层,这些层的实现作为插件是不会添加在常规的Tensorrt下载中的,因此本教程旨在提供OSS插件的下载编译手段。(本教程建议配合Deepstream5. 0一起食用更佳哦!)
Ubuntu 18.04.3 LTS
cuda-10.2
cuDNN 7.6.5
TensorRT 7.0.0.11
git-lfs提供了使用git-clone下载大于5MB的手段,方便我们后续直接用命令行的方式下载模型等内容,可能报错,解决方法:无法添加gitlfs
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt-get install git-lfs
git lfs install
根据官网要求(TensorRT OSS requires cmake >= v3.13, so install cmake 3.13 if your cmake version is lower than 3.13)因此我们需要卸载安装过的CMAKE同时安装对应的版本。
#从git上下载安装包
sudo apt remove --purge --auto-remove cmake
wget https://github.com/Kitware/CMake/releases/download/v3.13.5/cmake-3.13.5.tar.gz
tar xvf cmake-3.13.5.tar.gz
cd cmake-3.13.5/
#接下来这步非常关键,因为CMAKE默认采用SSH的方式去下载包,因为在后续OSS的编译过程当中会存在某一些包下载不下来,导致编译失败,解决办法就是采用下列代码
sudo apt-get install curl
sudo apt-get install libssl-dev libcurl4-openssl-dev
./bootstrap --system-curl
make -j$(nproc)
sudo make install
sudo ln -s /usr/local/bin/cmake /usr/bin/cmake
上述建立软连接时,可能存在失败的原因,具体原因我遇到的是因为之前的软连接没有删掉,只需要sudo rm 就解决了。
这一步后续我在装其他电脑时遇见了找不到 libGL.so的问题,经过查询应该是软连接没有设置好,解决方法是solution1 solution2
git clone -b release/7.0 https://github.com/nvidia/TensorRT
cd TensorRT/
git submodule update --init --recursive
export TRT_SOURCE=`pwd`
cd $TRT_SOURCE
mkdir -p build && cd build
cmake .. -DGPU_ARCHS=xy -DTRT_LIB_DIR=/usr/lib/aarch64-linux-gnu/ -DCMAKE_C_COMPILER=/usr/bin/gcc -DTRT_BIN_DIR=`pwd`/out
make nvinfer_plugin -j$(nproc)
这一步非常的坑,常规情况下进行到这一步只需要将对应的.so文件拷贝到usr/lib中就可以了,但是不清楚为什么拷贝后仍然插件不可用,因此按照我这种步骤虽然繁琐,但是确实可用,欢迎提出建议。
#在build文件夹下执行命令
sudo make install
ps:这一步遇到了一个
/bin/sh: python: not found
的问题,这个是因为python没有链接,解决办法solution
正常来讲这一步过后就应该在out文件夹下产生了很多很多个与之前下载的Tensorrt/lib下一样的生成的文件,尚不清楚这些与正常下载的有何不同,但是可以确定的libnvinfer_plugin相关的so一定是最新的,这也是后续我使用该out文件夹作为后续lib的替代的原因。
接下来需要进行一些拷贝和删除工作,首先需要将usr/lib文件夹下所有和libnvinfer_plugin有关的文件删掉,然后将out文件夹下的libnvinfer_plugin.so,libnvinfer_plugin.so.7.0.0,libnvinfer_plugin_static.a拷贝到/usr/lib/x86_64-linux-gnu下,并设定环境变量,代码如下:
sudo cp libnvinfer_plugin.so /usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so.7
sudo cp libnvinfer_plugin.so.7.0.0 /usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so.7.0.0
sudo cp libnvinfer_plugin_static.a /usr/lib/x86_64-linux-gnu/libnvinfer_plugin_static.a
sudo ldconfig
#将原Tensorrt下的libnvinfer_plugin.so.7拷贝到out文件夹下,这样就确定可以将out当作新的lib库使用了
sudo cp /原Tensorrt/lib/libnvinfer_plugin.so out/libnvinfer_plugin.so
sudo gedit .bashrc
##打开后添加环境变量,将Tensorrt的lib库连接到out文件夹,就可以使用最新的lib库了
export LD_LIBRARY_PATH=/home/xxx/download/deepstream_tlt_apps-master/TRT-OSS/x86/TensorRT/build/out:$LD_LIBRARY_PATH
进行到上一步的时候其实已经解决了OSS插件的编译,后续是因为项目需要,需要再编译deepstream的插件
git clone https://github.com/NVIDIA-AI-IOT/deepstream_tlt_apps.git
#进入下载好的目录
cd deepstream_tlt_apps/
export DS_SRC_PATH=你的deepstream的存放位置 // e.g. /opt/nvidia/deepstream/deepstream
export CUDA_VER=cuda版本 // e.g. 10.2
make