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 的快速上手就結束了,如果有更定制化的需求,可以去參考文檔和源碼。