mmdeploy快速上手
mmdeploy快速上手
若要將使用 openmmlab 的框架(如mmdet、mmcls)等訓(xùn)練的模型進(jìn)行快速部署,同樣來(lái)自 openmmlab 的 mmdeploy 無(wú)疑是最合適的選擇,本文將簡(jiǎn)單地完成一個(gè) Faster RCNN 模型的部署。
配置
本文基于如下軟硬件配置:
CPU:x86-64 (any)
GPU:Nvidia (any)
OS: Ubuntu
環(huán)境與安裝
為了方便,這里就不展開(kāi)講如何安裝了,我們就直接使用 docker 環(huán)境來(lái)進(jìn)行實(shí)驗(yàn),需要在本機(jī)安裝的同學(xué)可參考:安裝mmdploy,或者直接參考 Dockerfile 中的步驟安裝也是一樣的。只要配置好相同的環(huán)境之后,后面的步驟都是一樣的。
我們先拉 git 倉(cāng)庫(kù),然后根據(jù)官方的 Dockerfile 來(lái)構(gòu)建鏡像:
git clone https://github.com/open-mmlab/mmdeploy.git cd mmdeploy/docker/GPU docker build . -t mmdeploy:test --build-arg USE_SRC_INSIDE=true # 使用阿里云的鏡像安裝鏡像內(nèi)的包構(gòu)建完成后,鏡像內(nèi)就已經(jīng)安裝好支持 ONNXRuntime 和 TensorRT 后端推理引擎和 mmdeploy 本身了。
準(zhǔn)備檢測(cè)模型
我們之前提到,本文將基于 mmdet 的 Faster RCNN 檢測(cè)模型來(lái)進(jìn)行部署,我們先準(zhǔn)備好監(jiān)測(cè)模型的配置文件和權(quán)重文件。
git clone https://github.com/open-mmlab/mmdetection.git # 準(zhǔn)備權(quán)重文件 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模型轉(zhuǎn)換
因?yàn)橹髸?huì)反復(fù)用到 mdeploy 和 mmdetection 中的內(nèi)容,我們先設(shè)置 mmdeploy 和 mmdetection 的根目錄地址為環(huán)境變量:
export MMDEPLOY_DIR=/your/path/to/mmdeploy export MMDET_DIR=/your/path/to/mmdetection接下來(lái)就可以開(kāi)始進(jìn)行模型轉(zhuǎn)換了,我們根 Faster RCNN 的配置文件和剛剛下載好的權(quán)重文件來(lái)將模型轉(zhuǎn)換為 onnx 和 tensorrt :
轉(zhuǎn)換為 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 \ # 這里筆者放在臨時(shí)目錄下了,大家按需選在放置的目錄--device cuda:0 \ # 轉(zhuǎn)換為trt格式,必須是在Nvidia GPU上--dump-info轉(zhuǎn)換為 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來(lái)試一下--dump-info之后我們會(huì)得到兩個(gè)目錄文件:/tmp/fsr_trt 和 /tmp/fsr_ort ,我們看一下這個(gè)目錄中有什么:
ls /tmp/fsr_trt/ # ... # end2end.onnx # end2end.engine # ...可以看到,end2end.engine, end2end.onnx 就是模型文件,我們之后會(huì)用這個(gè)模型文件分別在 TensorRT 和 ONNXRuntime 兩種后端上進(jìn)行推理。為什么 TensorRT 的結(jié)果目錄中也會(huì)有 end2end.onnx 文件呢,是因?yàn)橥ǔS?torch 模型轉(zhuǎn)換到 onnx 格式作為中轉(zhuǎn),再賺到 tensorrt。
模型推理
我們有多重進(jìn)行模型推理的方式,分別是是通過(guò) Python 的接口和C++編譯成的可執(zhí)行文件。
Python 接口
我們直接調(diào)用 mmdeploy 的 api 即可,這里我們用之前的到的 TensoRT 模型來(lái)實(shí)驗(yàn):
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'] # 注意這里傳遞的一定要是一個(gè)可迭代對(duì)象,比如列表 result = inference_model(model_cfg, deploy_cfg, backend_files, img=img, device=device)需要注意的是 backend_files 需要接收的是一個(gè)可迭代對(duì)象,比如這里我們傳的就是一個(gè)列表。當(dāng)然了字符串在 Python 中也是可迭代對(duì)象,但是意義就完全錯(cuò)了,傳進(jìn)來(lái)的字符串會(huì)被遍歷,就會(huì)得到類(lèi)似如下這樣的報(bào)錯(cuò):
IsADirectoryError: [Errno 21] Is a directory: '/'這就是將字符串去遍歷,結(jié)果認(rèn)為第一個(gè)符號(hào) / 為目錄了。
C++編譯成的可執(zhí)行文件
編譯SDK
這里如果之前的環(huán)境配置使用的是 Dockerfile 構(gòu)建的鏡像,或者在手動(dòng)配置環(huán)境方案中,在編譯 MMDeploy 時(shí)開(kāi)啟 MMDEPLOY_BUILD_SDK 則, MMDeploy SDK是已經(jīng)編譯好的,即在 ${MMDEPLOY_DIR}/build/install/example 目錄下有 object_detection 等一系列編譯好的可執(zhí)行文件,則可跳過(guò)這一小步:
cd ${MMDEPLOY_DIR}/build/install/example# 配置ONNX Runtime庫(kù)目錄 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這之后我們可以直接運(yùn)行可執(zhí)行文件,指定模型文件和圖像來(lái)進(jìn)行推理,這里我們用 CPU 的 ONNXRuntime 模型來(lái)測(cè)試
cd ${MMDEPLOY_DIR}/build/install/example ./object_detection cpu /tmp/fsr_ort ${MMDET_DIR}/demo/demo.jpg到這里,簡(jiǎn)單的 mmdeploy 的快速上手就結(jié)束了,如果有更定制化的需求,可以去參考文檔和源碼。
總結(jié)
以上是生活随笔為你收集整理的mmdeploy快速上手的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: trim()函数的含义及使用方法
- 下一篇: 我们不再沉默 给入侵黑客一个“下马威”