参考链接
mmdeploy/docs/en/01-how-to-build/linux-x86_64.md at main · open-mmlab/mmdeploy
Toolchains安装
- 操作系统:Ubuntu 18.04
- cuda:11.4
安装cuda之前需要确认自己机器的驱动是否支持该版本的cuda,cuda版本与驱动之间的关系可以打开链接查看,驱动下载的载链接为:https://www.nvidia.com/download/index.aspx。
确认上述信息或者更新自己驱动之后,就可以打开链接,根据自己机器选择合适的配置,得到下载命令,下载文件并安装。
将cuda环境变量添加到系统中
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
- cudnn:8.2
cudnn的下载链接为:https://developer.nvidia.com/rdp/cudnn-archive。本文中下载的cudnn版本为8.2.1,适配cuda 11.x的版本。具体安装过程请自行搜索。
- cmake:cmake版本需要大于等于3.14.0,安装方式如下:
wget https://github.com/Kitware/CMake/releases/download/v3.20.0/cmake-3.20.0-linux-x86_64.tar.gz
tar -xzvf cmake-3.20.0-linux-x86_64.tar.gz
sudo ln -sf $(pwd)/cmake-3.20.0-linux-x86_64/bin/* /usr/bin/
依赖环境
MMdeploy可以分为两部分:Model Converter和SDK。其中Model Converter是将模型转换为目标推理引擎要求的格式文件,如TensorRT,则生成TensorRT Engine文件。SDK提供多种编程语言在工业生产来部署目标推理引擎。
为Model Conveter安装依赖
miniconda
- 安装miniconda
- 下载miniconda文件,打开链接,找到适合自己目标机器的文件
- 安装minconda
通过如下命令安装即可,过程中一直enter就行,默认情况下,conda的环境变量会写入到bashrc文件中。
sudo bash Miniconda3-latest-Linux-x86_64.sh
- 激活conda环境
通过下面的命令可以激活conda环境,进入base虚拟环境。
source ~/.bashrc
- 替换conda国内源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes
如果只想在安装时使用国内源,则可以通过如下命令实现:
conda install -y -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/linux-64 opencv tensorboardX
- 为mmdeploy创建虚拟环境
conda create -n mmdeploy python=3.8 -y
conda activate mmdeploy
pytorch:1.10.0
通过如下的命令安装pytorch 1.10.0,对应的cudatoolkit为11.3,而安装的cuda为11.4,但是对于后续的测试没有什么影响。
conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=11.3 -c pytorch -c conda-forge
mmcv
export cu_version=cu114 # cuda 11.4
export torch_version=torch1.10
pip install -U openmim
mim install mmengine
mim install "mmcv>=2.0.0rc2"
为SDK安装依赖环境
- OpenCV
sudo apt-get install libopencv-dev
- pplcv
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
安装推理引擎
mmdeploy支持以不同的backend推理模型,在这篇文章中主要测试Tensor RT backend。本文以TensorRT推理引擎的安装为例,其他推理平台可以参考文档。
TensorRT
- 下载TensorRT tar文件
tar -xvf TensorRT-8.2.4.2.Linux.x86_64-gnu.cuda-11.4.cudnn8.2.tar.gz
- 添加环境变量
# <<< TensorRT 8 <<<
export PATH=/home/xxxx/local/TensorRT-8.2.4.2/bin:$PATH
export LD_LIBRARY_PATH=/home/xxxx/local/TensorRT-8.2.4.2/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/home/xxxx/local/TensorRT-8.2.4.2/include:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/home/xxxx/local/TensorRT-8.2.4.2/include:$CPLUS_INCLUDE_PATH
- 安装TensorRT python 包
cd python
# 根据python的版本安装
pip install tensorrt-8.2.4.2-cp38-none-linux_x86_64.whl
- 安装pycuda
conda install -c conda-forge pycuda
编译mmdeploy
编译mmdeploy分为两部分,Model Converter和SDK。其中converter的作用是将pytorch模型转换为对应backend的推理引擎文件,并测试起在不同数据集上的性能;SDK提供不同编程语言来将backend的推理引擎部署到工业实际生成中。
Model Converter
编译model converter包含两个步骤,一个是编译backend的自定义算子,一个是安装mmdeploy-python库。
编译tensorrt算子
cd ${
MMDEPLOY_DIR}
mkdir -p build && cd build
cmake -DCMAKE_CXX_COMPILER=g++-7 -DMMDEPLOY_TARGET_BACKENDS=trt -DTENSORRT_DIR=${
TENSORRT_DIR} -DCUDNN_DIR=${
CUDNN_DIR} ..
make -j$(nproc) && make install
编译成功之后会生成libmmdeploy_tensorrt_ops.so动态库。mmdeploy-python会在进行模型转换时,修改模型的function、module和symbolic,需要链接相应的tensorrt自定义算子。
安装mmdeploy-python
cd ${
MMDEPLOY_DIR}
mim install -e .
安装完成之后,就可以对mmdeploy支持的模型进行相应的转换。其实后续的SDK可以不安装。
Build SDK and Demo
这个应该就是基于mmdeploy的部署sdk,通过mmdeploy- python得到tensorrt engine之后,通过这个sdk可以直接部署模型。
cmake -DCMAKE_CXX_COMPILER=g++-7 \
-DMMDEPLOY_TARGET_BACKENDS=trt \
-DTENSORRT_DIR=/home/xxxx/local/TensorRT-8.2.4.2 \
-DCUDNN_DIR=/home/xxxx/local/cuda/ \
-DMMDEPLOY_BUILD_SDK=ON -DMMDEPLOY_BUILD_SDK_PYTHON_API=ON \
-DMMDEPLOY_BUILD_EXAMPLES=ON -DMMDEPLOY_TARGET_DEVICES="cuda;cpu" ..
转换模型
本文测试了常见模型Faster R-CNN、Cascade R-CNN、DeepLabv3和Mask R- CNN转换之后性能之间的对比。转换模型和测试性能可以分别参考如下两个链接:
- https://github.com/open-mmlab/mmdeploy/blob/main/docs/en/02-how-to-run/convert_model.md
- https://github.com/open-mmlab/mmdeploy/blob/main/docs/en/02-how-to-run/profile_model.md
benchmark
mmdeploy支持不同类型模型的转换,具体运行时间和精度可以参考如下链接。
mmdet
对应mmdetection,测试了Yolov3、Faster R-CNN、Cascade R-CNN和Mask R-CNN。
mmdetection/docs/en/model_zoo.md at main · open-mmlab/mmdetection
在安装MM Detection遇到numpy的版本问题,解决方案源码编译安装cocoapi。
git clone https://github.com/pdollar/coco.git
Yolov3
转换engine脚本如下(static shape转换正常,dynamic shape存在问题):
#!/bin/bash
export MMDET_ROOT=/home/xxxx/workspace/mmlab/mmdetection
python ./tools/deploy.py \
configs/mmdet/detection/detection_tensorrt_dynamic-320x320-1344x1344.py \
$MMDET_ROOT/configs/yolo/yolov3_d53_8xb8-ms-608-273e_coco.py \
$MMDET_ROOT/exp/yolov3_d53_mstrain-608_273e_coco_20210518_115020-a2c3acb8.pth \
$MMDET_ROOT/demo/demo.jpg \
--work-dir work_dir \
--device cuda:0
Yolo v3就进行了Tensor RT Engine转换未对性能进行相应的对比。
Faster R-CNN
转换engine文件的脚本与Yolo v3转换类似,只需要替换对应的deploy_config和model_config文件路径。
#!/bin/bash
export MMDET_ROOT=/home/xxxx/workspace/mmlab/mmdetection
python ./tools/deploy.py \
configs/mmdet/detection/faster_rcnn_tensorrt_static-800x1344.py \
$MMDET_ROOT/configs/faster_rcnn/faster-rcnn_r50_fpn_2x_coco.py \
$MMDET_ROOT/exp/faster_rcnn_r50_fpn_2x_coco_bbox_mAP-0.384_20200504_210434-a5d8aa15.pth \
$MMDET_ROOT/demo/demo.jpg \
--work-dir work_dir \
--device cuda:0
测试其在COCO2017-val数据集上的性能。
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.384
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=1000 ] = 0.590
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=1000 ] = 0.420
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.215
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.421
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.503
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.520
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=300 ] = 0.520
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=1000 ] = 0.520
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.326
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.557
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.661
07/05 14:00:14 - mmengine - INFO - bbox_mAP_copypaste: 0.384 0.590 0.420 0.215 0.421 0.503
07/05 14:00:16 - mmengine - INFO - Results has been saved to exp/results.pkl.
07/05 14:00:16 - mmengine - INFO - Epoch(test) [5000/5000]
coco/bbox_mAP: 0.3840
coco/bbox_mAP_50: 0.5900
coco/bbox_mAP_75: 0.4200
coco/bbox_mAP_s: 0.2150
coco/bbox_mAP_m: 0.4210
coco/bbox_mAP_l: 0.5030
data_time: 0.0028 time: 0.0402
通过onnx
转换得到对应的engine
文件之后,可以通过tools/test.py
文件测试精度和速度。
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.384
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=1000 ] = 0.590
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=1000 ] = 0.419
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.215
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.421
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.502
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.519
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=300 ] = 0.519
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=1000 ] = 0.519
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.325
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.556
Average Recall (AR) @[