您现在的位置是:首页 >技术交流 >使用MMDeploy(预编译包)转换MMxx(MMDeploy支持库均可)pth权重到onnx,并使用python SDK进行部署验证网站首页技术交流

使用MMDeploy(预编译包)转换MMxx(MMDeploy支持库均可)pth权重到onnx,并使用python SDK进行部署验证

wyypersist 2023-06-03 20:00:03
简介使用MMDeploy(预编译包)转换MMxx(MMDeploy支持库均可)pth权重到onnx,并使用python SDK进行部署验证

注意
mmdeploy C++ SDK的使用部署和实际操作过程请看本人另外一篇博文使用MMDeploy(预编译包)转换MMxx(MMDeploy支持库均可)pth权重到onnx,并使用C++ SDK加载onnx得到dll动态链接库,实现在windows平台中调用(linux也适用)

准备工作空间

为了更好地说明本文需要的环境配置等,现指出一个具体的工作空间和其中包含的各种文件

# 一个具体的工作空间目录构成如下
工作空间根目录
--------work_space
包含的子目录和文件
----------------checkpoints(保存使用MMxx系列仓库训练得到的pth权重)
----------------configs(保存使用MMxx系列仓库训练使用的pipeline对应的configs配置文件)
----------------images(保存用于测试onnx推理是否成功的图片文件夹)
----------------mmdeploy(使用git clone xxx命令得到的mmdeploy源码仓库,主要为了使用其中的mmdeploy)
----------------mmdeploy-0.14.0-windows-amd64-cuda11.3(下载的预编译版本的mmdeploy包)
----------------work_dir(用于保存mmdeploy生成的onnx文件及其他文件,相当于结果文件夹)
----------------python_torch2onnx.py(用于将pth权重文件转换为onnx文件的py脚本,自己创建,后续会有demo代码示例)
----------------python_onnx_inference.py(用于测试onnx的推理py脚本,自行创建,后续会有demo代码示例)

所需环境配置

  1. 安装anaconda,并创建虚拟环境,本文所需环境均已通过测试
# ----------------安装conda基础环境
conda create -n your_env_name python=3.7 
conda activate your_env_name

# ---------------查看本机cuda版本(nvidia-smi显卡驱动中cuda版本)
nvidia-smi (打印出来的表格右上方可见)
example:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 527.54       Driver Version: 527.54       CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ... WDDM  | 00000000:01:00.0  On |                  N/A |
| N/A   52C    P8    18W / 136W |    119MiB / 16384MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

# -----注意安装的cuda运行时版本应当小于或等于显卡驱动中cuda版本
# -----本机显卡驱动版本为12.0,我安装的是pytorch1.10.1_cudan11.3_cudnn8这个版本
conda install pytorch==1.10.1 torchvision==0.11.2 torchaudio==0.10.1 cudatoolkit=11.3 -c pytorch -c conda-forge
  1. 准备MMDeploy环境
# 首先,安装MMCV-FULL,通过MIM安装MMCV
pip install -U openmim
mim install mmcv-full

# 然后,下载预编译版本的mmdeploy,这里我选择了“mmdeploy-0.14.0-windows-amd64-cuda11.3” release来安装
# 对应网址为:https://github.com/open-mmlab/mmdeploy/releases/tag/v0.14.0
# 或者直接访问该链接启动下载:https://github.com/open-mmlab/mmdeploy/releases/download/v0.14.0/mmdeploy-0.14.0-windows-amd64-cuda11.3.zip

# ---------在当前工作空间下的windows power shell中运行命令:git clone https://github.com/open-mmlab/mmdeploy.git,将mmdeploy仓库源码保存到工作空间(主要是为了使用其中的configs文件夹下的配置文件,后面会有介绍)
 
# 然后,安装mmdeploy 0.14.0版本
pip install mmdeploy==0.14.0

# 安装mmdeploy_python 0.14.0版本
pip install mmdeploy-python==0.14.0

# 安装onnxruntime
pip install onnxruntime

# 进入刚刚下载好的mmdeploy预编译包目录/path/to/mmdeploy-0.14.0-windows-amd64-cuda11.3/下
将路径:path/to/mmdeploy-0.14.0-windows-amd64-cuda11.3/thirdparty/onnxruntime/lib添加到本机系统环境变量

# 然后,重启windows power shell使环境变量生效,可以通过 echo $env:PATH 来检查环境变量是否设置成功。

使用MMDeploy得到onnx

  1. 准备MMxx系列仓库的configs和pth文件(举例:使用mmdetection中configs下面的配置文件“faster-rcnn_r50_fpn_2x_coco.py”,然后经过训练之后得到的权重为latest.pth,分别将其放入到上述工作空间的configs文件夹和checkpoints文件夹中);
  2. 然后,创建“python_torch2onnx.py”文件,示例代码如下:
from mmdeploy.apis import torch2onnx
from mmdeploy.backend.sdk.export_info import export2SDK

# 需要在转换pth到onnx时传入一张图片
img = 'images/demo.jpg'

# 保存结果路径的文件夹
work_dir = 'work_dir/onnx/your_model_name'

# 注意这里尽量使用mmdeploy原始文档中推荐的end2end.onnx名称,后续加载onnx时,避免一些错误出现
save_file = 'end2end.onnx'

# 使用mmdeploy源码仓库中的mmdet对应config文件(如果你使用的mmcls,那么就需要到mmcls下面找到合适的deploy config文件)
deploy_cfg = 'mmdeploy/configs/mmdet/detection/detection_onnxruntime_dynamic.py'

# 加载你训练好的模型的config配置文件(这里以“faster-rcnn_r50_fpn_2x_coco.py”举例)
model_cfg = 'configs/faster-rcnn_r50_fpn_2x_coco.py'

# 加载使用上述模型配置文件得到的训练权重latest.pth
model_checkpoint = 'checkpoints/latest.pth'

# 设置device为cpu
device = 'cpu'

# 1. convert model to onnx
torch2onnx(img, work_dir, save_file, deploy_cfg, model_cfg,
  model_checkpoint, device)

# 2. extract pipeline info for sdk use (dump-info)
export2SDK(deploy_cfg, model_cfg, work_dir, pth=model_checkpoint, device=device)

如果一切顺利,你会在/path/to/your/work_space/work_dir/onnx/your_model_name得到如下文件:

deploy.json
detail.json
end2end
pipeline.json

使用MMDeploy加载onnx模型对单张图片进行推理

  1. 在工作空间work_space下创建文件“python_onnx_inference.py”,示例代码如下:
from mmdeploy.apis import inference_model

# 加载使用git clone 下载的mmdeploy中相关的deploy config文件
deploy_cfg = 'mmdeploy/configs/mmdet/detection/detection_onnxruntime_dynamic.py'

# 加载模型权重对应的config文件
model_cfg = 'configs/faster-rcnn_r50_fpn_2x_coco.py'

# 设置后端推理使用的onnx模型路径
backend_files = ['work_dir/onnx/your_model_name/end2end.onnx']

# 设置后端推理所需的demo图片
img = ['images/demo.jpg']

# 设置使用cpu设备
device = 'cpu'

# 调用mmdeploy中推理函数接口得到result结果
result = inference_model(model_cfg, deploy_cfg, backend_files, img, device)

# 控制台打印得到的results结果
print("result: {}".format(result))

如果一切顺利的话,最后的print()会正常输出。

使用python SDK对onnx模型进行验证

在工作空间work_space下运行如下命令:

python .mmdeploydemopythonobject_detection.py cpu .work_dironnxyour_model_name .imagesdemo.jpg

之后在work_space工作空间目录下会得到demo.jpg对应的推理结果图。

参考资料

  1. https://gitee.com/open-mmlab/mmdeploy/blob/master/docs/zh_cn/02-how-to-run/prebuilt_package_windows.md#python-sdk
  2. https://gitee.com/open-mmlab/mmdeploy/blob/master/docs/zh_cn/get_started.md
  3. MMDeploy

2023.4.22 于 西安

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。