mmdeploy快速上手
若要将使用 openmmlab 的框架(如mmdet、mmcls)等训练的模型进行快速部署,同样来自 openmmlab 的 mmdeploy 无疑是最合适的选择,本文将简单地完成一个 Faster RCNN 模型的部署。
配置
本文基于如下软硬件配置:
CPU:x86-64 (any)
GPU:Nvidia (any)
OS: Ubuntu
环境与安装
为了方便,这里就不展开讲如何安装了,我们就直接使用 docker 环境来进行实验,需要在本机安装的同学可参考:安装mmdploy,或者直接参考 Dockerfile 中的步骤安装也是一样的。只要配置好相同的环境之后,后面的步骤都是一样的。
我们先拉 git 仓库,然后根据官方的 Dockerfile 来构建镜像:
git clone https://github.com/open-mmlab/mmdeploy.git
cd mmdeploy/docker/GPU
docker build . -t mmdeploy:test --build-arg USE_SRC_INSIDE=true # 使用阿里云的镜像安装镜像内的包
构建完成后,镜像内就已经安装好支持 ONNXRuntime 和 TensorRT 后端推理引擎和 mmdeploy 本身了。
准备检测模型
我们之前提到,本文将基于 mmdet 的 Faster RCNN 检测模型来进行部署,我们先准备好监测模型的配置文件和权重文件。
git clone https://github.com/open-mmlab/mmdetection.git
# 准备权重文件
mkdir mmdetection/checkpoints
wget https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth -P mmdetection/checkpoints
模型转换
因为之后会反复用到 mdeploy 和 mmdetection 中的内容,我们先设置 mmdeploy 和 mmdetection 的根目录地址为环境变量:
export MMDEPLOY_DIR=/your/path/to/mmdeploy
export MMDET_DIR=/your/path/to/mmdetection
接下来就可以开始进行模型转换了,我们根 Faster RCNN 的配置文件和刚刚下载好的权重文件来将模型转换为 onnx 和 tensorrt :
转换为 tensorrt
python ${MMDEPLOY_DIR}/tools/deploy.py \${MMDEPLOY_DIR}/configs/mmdet/detection/detection_tensorrt_dynamic-320x320-1344x1344.py \${MMDET_DIR}/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \${MMDET_DIR}/checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \${MMDET_DIR}/demo/demo.jpg \--work-dir /tmp/fsr_trt \ # 这里笔者放在临时目录下了,大家按需选在放置的目录--device cuda:0 \ # 转换为trt格式,必须是在Nvidia GPU上--dump-info
转换为 onnx
python ${MMDEPLOY_DIR}/tools/deploy.py \${MMDEPLOY_DIR}/configs/mmdet/detection/detection_onnxruntime_dynamic.py \${MMDET_DIR}/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \${MMDET_DIR}/checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \${MMDET_DIR}/demo/demo.jpg \--work-dir /tmp/fsr_ort \--device cpu \ # onnx我们用cpu来试一下--dump-info
之后我们会得到两个目录文件:/tmp/fsr_trt
和 /tmp/fsr_ort
,我们看一下这个目录中有什么:
ls /tmp/fsr_trt/
# ...
# end2end.onnx
# end2end.engine
# ...
可以看到,end2end.engine
, end2end.onnx
就是模型文件,我们之后会用这个模型文件分别在 TensorRT 和 ONNXRuntime 两种后端上进行推理。为什么 TensorRT 的结果目录中也会有 end2end.onnx
文件呢,是因为通常由 torch 模型转换到 onnx 格式作为中转,再赚到 tensorrt。
模型推理
我们有多重进行模型推理的方式,分别是是通过 Python 的接口和C++编译成的可执行文件。
Python 接口
我们直接调用 mmdeploy 的 api 即可,这里我们用之前的到的 TensoRT 模型来实验:
from mmdeploy.apis import inference_model
import os
import os.path as ospmodel_cfg = osp.join(os.getenv('MMDET_DIR'), 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py')
deploy_cfg = osp.join(os.getenv('MMDEPLOY_DIR'), '/configs/mmdet/detection/detection_tensorrt_dynamic-320x320-1344x1344.py')
backend_files = ['/tmp/fsr_trt/end2end.engine'] # 注意这里传递的一定要是一个可迭代对象,比如列表
result = inference_model(model_cfg, deploy_cfg, backend_files, img=img, device=device)
需要注意的是 backend_files
需要接收的是一个可迭代对象,比如这里我们传的就是一个列表。当然了字符串在 Python 中也是可迭代对象,但是意义就完全错了,传进来的字符串会被遍历,就会得到类似如下这样的报错:
IsADirectoryError: [Errno 21] Is a directory: '/'
这就是将字符串去遍历,结果认为第一个符号 /
为目录了。
C++编译成的可执行文件
编译SDK
这里如果之前的环境配置使用的是 Dockerfile 构建的镜像,或者在手动配置环境方案中,在编译 MMDeploy 时开启 MMDEPLOY_BUILD_SDK
则, MMDeploy SDK是已经编译好的,即在 ${MMDEPLOY_DIR}/build/install/example
目录下有 object_detection
等一系列编译好的可执行文件,则可跳过这一小步:
cd ${MMDEPLOY_DIR}/build/install/example# 配置ONNX Runtime库目录
export LD_LIBRARY_PATH=/path/to/onnxruntime/lib
mkdir -p build && cd build
cmake -DOpenCV_DIR=path/to/OpenCV/lib/cmake/OpenCV \-DMMDeploy_DIR=${MMDEPLOY_DIR}/build/install/lib/cmake/MMDeploy ..
make object_detection
这之后我们可以直接运行可执行文件,指定模型文件和图像来进行推理,这里我们用 CPU 的 ONNXRuntime 模型来测试
cd ${MMDEPLOY_DIR}/build/install/example
./object_detection cpu /tmp/fsr_ort ${MMDET_DIR}/demo/demo.jpg
到这里,简单的 mmdeploy 的快速上手就结束了,如果有更定制化的需求,可以去参考文档和源码。