mmdeploy快速上手

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532487.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532487.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532487.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

精簡CUDA教程——CUDA Driver API

精簡CUDA教程——CUDA Driver API tensorRT從零起步邁向高性能工業級部署(就業導向) 課程筆記,講師講的不錯,可以去看原視頻支持下。 Driver API概述 CUDA 的多級 API CUDA 的 API 有多級(下圖)&#xff…

CUDA編程入門極簡教程

CUDA編程入門極簡教程 轉自:CUDA編程入門極簡教程 作者:小小將 前言 2006年,NVIDIA公司發布了CUDA,CUDA是建立在NVIDIA的CPUs上的一個通用并行計算平臺和編程模型,基于CUDA編程可以利用GPUs的并行計算引擎來更加高效地…

精簡CUDA教程——CUDA Runtime API

精簡CUDA教程——CUDA Runtime API tensorRT從零起步邁向高性能工業級部署(就業導向) 課程筆記,講師講的不錯,可以去看原視頻支持下。 Runtime API 概述 環境 圖中可以看到,Runtime API 是基于 Driver API 之上開發的…

Python并發——concurrent.futures梳理

Python并發——concurrent.futures梳理 參考官方文檔: concurrent.futures — 啟動并行任務 Executor對象 class concurrent.funtures.Executor該抽象類是 ThreadPoolExecutor 和 ProcessPoolExecutor 的父類,提供異步執行調用方法。要通過它的子類調用…

TensorRT ONNX 基礎

TensorRT ONNX 基礎 tensorRT從零起步邁向高性能工業級部署(就業導向) 課程筆記,講師講的不錯,可以去看原視頻支持下。 概述 TensorRT 的核心在于對模型算子的優化(合并算子、利用當前 GPU 特性選擇特定的核函數等多種…

回文子串、回文子序列相關題目

回文子串、回文子序列相關題目 回文子串是要連續的,回文子序列可不是連續的。 516. 最長回文子序列 dp數組含義:dp[i][j]dp[i][j]dp[i][j] 表示子序列 s[i,j]s[i,j]s[i,j] 中的最長回文子序列的長度。 dp數組初始化:子序列長度為 1 時&am…

mmdetection tools工具梳理

mmdetection tools工具梳理 mmdetection 是一個非常好用的開源目標檢測框架,我們可以用它方便地訓練自己的目標檢測模型,mmdetection 項目倉庫提供許多實用的工具來實現幫助我們進行各種測試。本篇將梳理以下 mmdetection 項目倉庫 tools 目錄下的各種實…

TensorRT ONNX 基礎(續)

TensorRT ONNX 基礎(續) PyTorch正確導出ONNX 幾條推薦的原則,可以減少潛在的錯誤: 對于任何使用到 shape、size 返回值的參數時,例如 tensor.view(tensor.size(0), -1) 這類操作,避免直接使用 tensor.s…

frp實現內網穿透極簡教程

frp實現內網穿透極簡教程 本文是內網穿透極簡教程,為求簡潔,我們不介紹為什么內網穿透也不介紹其原理,這里假設各位讀者都已經明確的知道自己的目的,本文僅介紹如何安裝配置 frp 實現內網穿透。 簡單來說,內網穿透就…

圖像預處理之warpaffine與雙線性插值及其高性能實現

圖像預處理之warpaffine與雙線性插值及其高性能實現 視頻講解:https://www.bilibili.com/video/BV1ZU4y1A7EG 代碼Repo:https://github.com/shouxieai/tensorRT_Pro 本文為視頻講解的個人筆記。 warpaffine矩陣變換 對于坐標點的變換,我們通…

LeetCode-10 正則表達式匹配

LeetCode-10 正則表達式匹配 動態規劃 10. 正則表達式匹配 dp數組含義:dp[i][j]dp[i][j]dp[i][j] 表示 s[0:i?1]s[0:i-1]s[0:i?1] 能否被 p[0:j?1]p[0:j-1]p[0:j?1] 成功匹配。 狀態轉移方程 : 如果 s[i?1]p[j?1]s[i-1]p[j-1]s[i?1]p[j?1] …

shell if判斷和for循環常見寫法

shell if判斷和for循環常見寫法 轉自: Shell中for循環的幾個常用寫法 Shell中if 條件判斷總結 if常見寫法 一、if的基本語法: if [ command ];then符合該條件執行的語句 elif [ command ];then符合該條件執行的語句 else符合該條件執行的語句 fibash shell會按順序…

關于pytorch使用多個dataloader并使用zip和cycle來進行循環時出現的顯存泄漏的問題

關于pytorch使用多個dataloader并使用zip和cycle來進行循環時出現的顯存泄漏的問題 如果我們想要在 Pytorch 中同時迭代兩個 dataloader 來處理數據,會有兩種情況:一是我們按照較短的 dataloader 來迭代,長的 dataloader 超過的部分就丟棄掉…

neovim及coc.nvim自動補全初探

neovim及coc.nvim自動補全初探 安裝 # mac # 安裝 brew install neovim # 查看neovim安裝路徑 brew list nvim# ubuntu apt install neovim習慣了打開 vi/vim 的方式,可以用個 alias 在 ~/.zshrc 中設置一下: alias vi"nvim"插件 vim-plug…

sed 簡明教程

sed 簡明教程 轉自:https://coolshell.cn/articles/9104.html awk于1977年出生,今年36歲本命年,sed比awk大2-3歲,awk就像林妹妹,sed就是寶玉哥哥了。所以 林妹妹跳了個Topless,他的哥哥sed坐不住了&#xf…

awk 簡明教程

awk 簡明教程 轉自:https://coolshell.cn/articles/9070.html 有一些網友看了前兩天的《Linux下應該知道的技巧》希望我能教教他們用awk和sed,所以,出現了這篇文章。我估計這些80后的年輕朋友可能對awk/sed這類上古神器有點陌生了&#xff0c…

應該知道的LINUX技巧

應該知道的LINUX技巧 轉自:https://coolshell.cn/articles/8883.html 這篇文章來源于Quroa的一個問答《What are some time-saving tips that every Linux user should know?》—— Linux用戶有哪些應該知道的提高效率的技巧。我覺得挺好的,總結得比較好…

[深度][PyTorch] DDP系列第一篇:入門教程

[深度][PyTorch] DDP系列第一篇:入門教程 轉自:[原創][深度][PyTorch] DDP系列第一篇:入門教程 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好?那你definitely需要這一篇! No one knows DDP better than I…

[深度][PyTorch] DDP系列第二篇:實現原理與源代碼解析

[深度][PyTorch] DDP系列第二篇:實現原理與源代碼解析 轉自:https://zhuanlan.zhihu.com/p/187610959 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好?那你definitely需要這一篇! No one knows DDP better than I do! …

[深度][PyTorch] DDP系列第三篇:實戰與技巧

[深度][PyTorch] DDP系列第三篇:實戰與技巧 轉自:https://zhuanlan.zhihu.com/p/250471767 零. 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好?那你definitely需要這一篇! No one knows DDP better than I do! – – …