MMDeploy是一个开源的深度学习模型部署工具箱,是OpenMMLab项目的一部分,源码在 https://github.com/open-mmlab/mmdeploy,最新发布版本为v0.8.0,License为Apache-2.0。它支持在Windows10、Linux和Mac上运行。
      MMDeploy主要特性
      (1).支持超多OpenMMLab算法库,如mmcls、mmdet、mmseg、mmocr等;
      (2).支持多种推理后端,如ONNX Runtime、TensorRT、LibTorch等;
      (3).支持可扩展的C/C++ SDK框架,如Transform图像处理、Net神经网络推理等。
      MMDeploy定义的模型部署流程:如下图所示:https://github.com/open-mmlab/mmdeploy/blob/master/docs/en/get_started.md

      (1).模型转换(Model Converter):旨在将训练模型从OpenMMLab转换为可以在目标设备上运行的后端模型。它可以把PyTorch模型转换为ONNX、TorchScript等和设备无关的IR模型。也可以将ONNX模型转换为推理后端模型。两者相结合,可实现端到端的模型转换,也就是从训练端到生产端的一键式部署。
      (2).MMDeploy模型(MMDeploy Model):是Model Converter导出的结果包,除了后端模型(backend model),它还包括模型的元信息,将用于推理SDK中。
      (3).推理SDK(Inference SDK):由C/C++开发,封装了模型的前处理、网络推理和后处理过程。对外提供多语言的模型推理接口,如C、C++、Python等。

      以下内容主要来自 https://github.com/open-mmlab/mmdeploy/blob/master/README_zh-CN.md 中的新人解说:
      模型部署:
      (1).模型部署:指把训练好的模型在特定环境中运行的过程。MMDeploy实现了OpenMMLab中目标检测、图像分割、超分辨率等多个视觉任务模型的部署,支持ONNX Runtime,TensorRT,ncnn,openppl,OpenVINO等多个推理引擎。
      (2).模型部署的常见流水线是"深度学习框架--中间表示--推理引擎"。其中比较常用的一个中间表示是ONNX。
      (3).深度学习模型实际上就是一个计算图。模型部署时通常把模型转换成静态的计算图,即没有控制流(分支语句、循环语句)的计算图。
      (4).PyTorch框架自带对ONNX的支持,只需要构造一组随机的输入,并对模型调用torch.onnx.export即可完成PyTorch到ONNX的转换。
      (5).推理引擎ONNX Runtime对ONNX模型有原生的支持。给定一个.onnx文件,只需要简单使用ONNX Runtime的Python API就可以完成模型推理。
      (6).模型部署中常见的几类困难有:模型的动态化;新算子的实现;框架间的兼容。
      (7).PyTorch转ONNX,实际上就是把每一个操作转化成ONNX定义的某一个算子。比如对于PyTorch中的Upsample和interpolate,在转ONNX后最终都会成为ONNX的Resize算子。
      (8).通过修改继承自torch.autograd.Function的算子的symbolic方法,可以改变该算子映射到ONNX算子的行为。

      PyTorch到ONNX的转换函数:torch.onnx.export
      PyTorch模型到ONNX模型转换示例:https://blog.csdn.net/fengbingchun/article/details/126072998
      TorchScript是PyTorch模型(torch.nn.Module的子类)的中间表示,是一种从PyTorch代码创建可序列化和可优化模型的方法,可以在C++等高性能环境(high-performance environment)中运行。任何TorchScript程序都可以从Python进程中保存并加载到没有Python依赖项的进程中。
      torch.onnx.export中需要的模型实际上是一个torch.jit.ScriptModule。而要把普通PyTorch模型转一个这样的TorchScript模型,有跟踪(trace)和脚本化(script)两种导出计算图的方法。如果给torch.onnx.export传入了一个普通PyTorch模型(torch.nn.Module),那么这个模型会默认使用跟踪的方法导出。
      跟踪法只能通过实际运行一遍模型的方法导出模型的静态图,即无法识别出模型中的控制流(如循环);脚本化则能通过解析模型来正确记录所有的控制流。
      函数torch.onnx.export的声明如下:v1.11.0

def export(model, args, f, export_params=True, verbose=False, training=None,
           input_names=None, output_names=None, operator_export_type=None,
           opset_version=None, do_constant_folding=True, dynamic_axes=None,
           keep_initializers_as_inputs=None, custom_opsets=None,
           export_modules_as_functions=False)

      参数介绍:
      (1).前三个必选参数为模型、模型输入、导出的onnx文件名。
      (2).exprot_params:模型中是否存储模型权重。一般中间表示包含两大类信息:模型结构和模型权重,这两类信息可以在同一个文件里存储,也可以分文件存储。ONNX是用同一个文件表示记录模型的结构和权重。部署时一般都默认这个参数为 True。如果onnx文件是用来在不同框架间传递模型(比如PyTorch到Tensorflow)而不是用于部署,则可以令这个参数为False。
      (3).input_names, output_names:设置输入和输出张量的名称。如果不设置的话,会自动分配一些简单的名字(如数字)。ONNX模型的每个输入和输出张量都有一个名字。很多推理引擎在运行ONNX文件时,都需要以"名称--张量值"的数据对来输入数据,并根据输出张量的名称来获取输出数据。在进行跟张量有关的设置(比如添加动态维度)时,也需要知道张量的名字。在实际的部署流水线中,我们都需要设置输入和输出张量的名称,并保证ONNX和推理引擎中使用同一套名称。
      (4).opset_version:转换时参考哪个ONNX算子集版本,在PyTorch 1.11.0版本中,默认值为9。
      (5).dynamic_axes:指定输入输出张量的哪些维度是动态的。为了追求效率,ONNX默认所有参与运算的张量都是静态的(张量的形状不发生改变)。但在实际应用中,我们又希望模型的输入张量是动态的,尤其是本来就没有形状限制的全卷积模型。因此,我们需要显式地指明输入输出张量的哪几个维度的大小是可变的。

      ONNX介绍https://blog.csdn.net/fengbingchun/article/details/125947000
      ONNX在底层是用Protobuf定义的。Protobuf,全称Protocol Buffer,是Google提出的一套表示和序列化数据的机制。一个ONNX模型可以用ModelProto类表示。ModelProto包含了版本、创建者等日志信息,还包含了存储计算图结构的graph。GraphProto类则由输入张量信息、输出张量信息、节点信息组成。张量信息ValueInfoProto类包括张量名、基本数据类型、形状。节点信息NodeProto类包含了算子名、算子输入张量名、算子输出张量名。
      ONNX中的onnx.utils.extract_model()可以从原模型中取出部分节点,和新定义的输入、输出边构成一个新的子模型。利用子模型提取功能,我们可以输出原ONNX模型的中间结果,实现对ONNX模型的调试。

      安装:使用conda安装一个mmdeploy的虚拟环境,ONNX Runtime仅支持CPU,TensorRT仅支持CUDA
      (1).创建mmdeploy虚拟环境:

conda create --name mmdeploy python=3.8
conda activate mmdeploy

      (2).安装PyTorch:这里PyTorch使用1.11.0版本,CUDA使用10.2版本,此CUDA版本对PyTorch各版本都支持

conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=10.2 -c pytorch

      (3).安装MMCV:mmcv-full 1.5.0版本

pip install mmcv-full==1.5.0 -f https://download.openmmlab.com/mmcv/dist/cu102/torch1.11.0/index.html

      (4).安装MMDeploy:从https://github.com/open-mmlab/mmdeploy/releases下载mmdeploy-0.8.0-linux-x86_64-onnxruntime1.8.1.tar.gz,解压缩后进入到mmdeploy-0.8.0-linux-x86_64-onnxruntime1.8.1目录下,执行:

pip install dist/mmdeploy-0.8.0-py3-none-linux_x86_64.whl
pip install sdk/python/mmdeploy_python-0.8.0-cp38-none-linux_x86_64.whl

      (5).安装ONNX Runtime推理引擎:安装1.8.1版本

pip install onnxruntime==1.8.1

      (6).若用到OpenMMLab中的其它工具箱还需要进行安装,如安装MMDetection 2.25.1

pip install mmdet==2.25.1

      在linux上通过源码编译mmdeploy要求
      (1).安装cmake:版本>=3.14.0;
      (2).安装gcc 7+:mmdeploy sdk中使用了C++17特性,因此需要安装gcc 7+以上的版本;
      (3).安装依赖包:conda、pytorch(>=1.8.0)、mmcv-full;
      (4).安装mmdeploy sdk依赖:opencv(>=3.0)、pplcv(可选,仅cuda下需要);
      (5).安装推理引擎:onnxruntime(>=1.8.1)、tensorrt(要保证和你机器的cpu架构及cuda版本是匹配的)、cudnn(要保证和你机器的cpu架构、cuda版本及tensorrt版本是匹配的)、ppl.nn、openvino、ncnn、libtorch、cann。

     使用MMDeploy中的工具tools/deploy.py,将OpenMMLab的PyTorch模型转换成推理后端ONNX Runtime支持的ONNX格式

     (1).MMDetection中的模型使用 https://blog.csdn.net/fengbingchun/article/details/126199218 中测试用的faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth;

     (2).将执行命令写在mmdeploy_mmdetection_to_onnx_build.sh中,如下:

#! /bin/bash

python ../../src/mmdeploy/tools/deploy.py \
    ../../src/mmdeploy/configs/mmdet/detection/detection_onnxruntime_dynamic.py \
    ../../src/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \
    http://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \
    ../../data/image/1.jpg \
    --work-dir ../../data/model \
    --device cpu \
    --show

     (3).直接执行会报error:onnxruntime.capi.onnxruntime_pybind11_state.Fail: [ONNXRuntimeError] : 1 : FAIL : Failed to load library ~/Disk/anaconda3/envs/mmdeploy/lib/python3.8/site-packages/mmdeploy/lib/libmmdeploy_onnxruntime_ops.so with error: libonnxruntime.so.1.8.1: cannot open shared object file: No such file or directory,找不到libonnxruntime.so.1.8.1,虽然配置环境时执行了pip install onnxruntime==1.8.1,但在相关目录下搜索确实没有此库,解决方法:从https://github.com/microsoft/onnxruntime/releases 中下载onnxruntime-linux-x64-1.8.1.tgz,解压缩;并将压缩后的目录onnxruntime-linux-x64-1.8.1拷贝到mmdeploy环境下的~/Disk/anaconda3/envs/mmdeploy/目录下,然后在执行:

export LD_LIBRARY_PATH=~/Disk/anaconda3/envs/mmdeploy/onnxruntime-linux-x64-1.8.1/lib:${LD_LIBRARY_PATH}
./mmdeploy_mmdetection_to_onnx_build.sh

     (4).执行完上述命令后,会显示一样的两幅检测结果图,一个是pytorch的,一个是onnxruntime的,如下图所示:原始图像来自于网络

      并在../../data/model目录下产生onnx文件end2end.onnx。终端部分输出结果如下图所示:

      GitHub: https://github.com/fengbingchun/PyTorch_Test

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐