本文主要针对在编译安装OpenMMLab团队的MMDeploy模型部署工具时遇到的“难以下手”的问题。
由于OpenMMLab的用户中很大一部分都是具有快速开发需求的人,或者说其实相当部分OpenMMlab开源算法体系的用户都没有特别扎实的代码基础或者理论基础,比如说我,在面对MMDeploy这个相对于OpenMMLab其他算法库而言复杂了许多的代码库时会有一些畏难情绪。
此外由于很多时候接触Cpp比较少,对于其中的编译安装有很多不理解的地方,环境变量稍稍一变动就高不明白了,本文主要对于一些我之前作不来但是现在能做的地方进行分享与展示。
首先参考教程:(https://github.com/open-mmlab/mmdeploy/blob/main/docs/zh_cn/01-how-to-build/linux-x86_64.md)
如果教程由于在GitHub上你访问起来有困难,那么请移步官方中文文档
现摘取其中容易出问题的地方进行讲解。
跟着教程走一般都不会有问题,关键点在于==“不换终端”==,当然,如果你看了下面的文字知道发生了什么之后,你换终端也没有什么事。
教程中所给代码
git clone https://github.com/openppl-public/ppl.cv.git
cd ppl.cv
export PPLCV_DIR=$(pwd)
git checkout tags/v0.7.0 -b v0.7.0
./build.sh cuda
这里首先需要注意的是export PPLCV_DIR=$(pwd)
这一步,这是为了添加ppl.cv这个包的环境变量。
linux的环境变量,如果直接这样运行命令的话就是临时添加,如果你另起一个终端或者是使用source ~/.bashrc
之类的命令刷新了环境变量,那么这一步就需要重做了。
其余在这个教程中涉及到这种什么什么“DIR”的也是一样的道理。
因为我是在Nvidia显卡上进行模型部署,所以下面也主要依托这个来讲。
cd /the/path/of/tensorrt/tar/gz/file
tar -zxvf TensorRT-8.2.3.0.Linux.x86_64-gnu.cuda-11.4.cudnn8.2.tar.gz
pip install TensorRT-8.2.3.0/python/tensorrt-8.2.3.0-cp37-none-linux_x86_64.whl
export TENSORRT_DIR=$(pwd)/TensorRT-8.2.3.0
export LD_LIBRARY_PATH=$TENSORRT_DIR/lib:$LD_LIBRARY_PATH
pip install pycuda
这是教程中用于安装TensorRT包的命令。
只要选择和自己的cuda版本相应的就可以了。
如果你已经在做模型部署却连cuda都没有下载的话,那么请浏览器搜索引擎搜索Nvidia Cuda进入下载页面,根据你的环境进行选择,然后选择run脚本安装的方式安装cuda。
不要装deb包!不要装deb包!不要装deb包!
装deb包会连同你的驱动一起重装,一般而言是不合适的;而且这种库用APT或者YUM装,心里有点不踏实。
确认cuda装好了,就是我刚刚说的选择合适版本的TensorRT包就可以了,选择Tar包,安装没你以为的比Deb包麻烦,知道文件都放在哪里的感觉令人安心。
截至1月20日,该文编辑时间,已经有cuda12.2了,但是没有与该版本对应的TensorRT版本,别担心,实测12.1能用的就行,换句话说,最新的能用。
下面的两步中,一个又是设置TENSORRT_DIR环境变量的,后面的cudnn安装也要设置这个。这是为了编译MMDeploy的内容才这么做的,一般来说项目里面不会这么做,可能只是会在CMakeLists中通过set方法在文件内定义一下。这里用这个方式传入库的信息其实已经非常简化了流程了;而下面的第二条环境变量指令是将库文件所在引入环境变量,是常见的配置TensorRT环境的步骤。
我之前就装过,所以仅仅进行export TENSORRT_DIR=/opt/TensorRT-8.9.1.6
,这是我安装TensorRT的位置,另一条指令则写入了.bashrc文件。
注意不要忘记装pycuda。
然后是安装Cudnn这个深度学习加速库。命令上也是差不多的。
对于之前装过Cudnn的人来说,一般来说就和cuda的库文件放在一起的。也就是/usr/local/cuda
中,准确的应该要加版本号,不过一般都有软链接,应该是运行装cuda的时候自带的设置软链接。从而我们也可以粗略得出一种管理多版本cuda的方法——应该可以通过临时改换软链接的指向来确定当前使用的cuda环境。当然,这样做在写CMake的时候还不如直接接上版本号来得方便。
后面接着说了如果想永久有效的话就写入当前所用shell的配置文件,不一定就是.bashrc哦,也许你是别的shell。不过如果你不知道这个的话你多半就是.bashrc了。
也是有一个设置环境变量的过程。没啥难度。
不过另一个需要注意的地方是,MMDeploy中是有子模块的,不过因为是放在一个文件夹“ThirdPart”还是什么名字之下的,你克隆的时候可能没有看见。
在克隆仓库时克隆子模块则加上--recursive
参数;如果已经克隆了仓库但没有克隆子模块,则运行:
git submodule update
来更新子模块。
如果你前面都没什么问题,最后模型也转换出来了,但是最后你没办法完成推理,那么多半是SDK编译不对,
cd ${MMDEPLOY_DIR}
mkdir -p build && cd build
cmake .. \
-DCMAKE_CXX_COMPILER=g++-7 \
-DMMDEPLOY_BUILD_SDK=ON \
-DMMDEPLOY_BUILD_EXAMPLES=ON \
-DMMDEPLOY_BUILD_SDK_PYTHON_API=ON \
-DMMDEPLOY_TARGET_DEVICES="cuda;cpu" \
-DMMDEPLOY_TARGET_BACKENDS=trt \
-Dpplcv_DIR=${PPLCV_DIR}/cuda-build/install/lib/cmake/ppl \
-DTENSORRT_DIR=${TENSORRT_DIR} \
-DCUDNN_DIR=${CUDNN_DIR}
make -j$(nproc) && make install
以TensorRT的推理的SDK的编译为例,需要注意的地方就是这几个主目录,另外是-DCMAKE_CXX_COMPILER=g++-7 \
这个参数里面的7需要根据你自己的版本进行修改,比如我是9。
如果出现什么找不到库之类的情况,那么应该就是你的哪个环境变量掉了。你可以使用echo命令来看它到底指向哪里或者并不存在,例如
echo ${PPLCV_DIR}
应该返回该变量的路径。
也就是说其实如果你没有设置这些环境变量但是你记得这些库的路径的话,这几个编译选项就直接传入你的库路径也是一样的,使用设置环境变量的方式是为了简化流程与降低环境的安装难度,但是如果你觉得这样更加麻烦的话当然就不需要这么做了。
如果出现其他问题欢迎留言讨论。