• MMDeploy部署实战系列【第四章】:onnx,tensorrt模型推理


    模型推理【linux】

    在转换完成后,您既可以使用 Model Converter 进行推理,也可以使用 Inference SDK。前者使用 Python 开发,后者主要使用 C/C++ 开发。

    使用 Model Converter 的推理 API

    Model Converter 屏蔽了推理后端接口的差异,对其推理 API 进行了统一封装,接口名称为 inference_model

    以上文中 Faster R-CNN 的 TensorRT 模型为例,您可以使用如下方式进行模型推理工作:

    创建inference.py文件,目录结构如下

    ├── inference.py
    ├── mmdetection/
    └── mmdeploy/
    
    • 1
    • 2
    • 3

    inference.py

    from mmdeploy.apis import inference_model
    import os
    
    
    def inf_faster_rcnn_r50():
        model_cfg = './mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'
        deploy_cfg = './mmdeploy/configs/mmdet/detection/detection_tensorrt_dynamic-320x320-1344x1344.py'
        backend_files = ['./mmdeploy/mmdeploy_models/faster_rcnn/end2end.engine']
        img = './mmdetection/demo/demo.jpg'
        device = 'cuda:0'
        result = inference_model(model_cfg, deploy_cfg, backend_files, img=img, device=device)
        print(result)
    
    
    def inf_yolox():
        model_cfg = './mmdetection/configs/yolox/yolox_s_8x8_300e_coco.py'
        deploy_cfg = './mmdeploy/configs/mmdet/detection/detection_tensorrt_dynamic-320x320-1344x1344.py'
        backend_files = ['./mmdeploy/mmdeploy_models/yolox_s/end2end.engine']
        img = './mmdetection/demo/demo.jpg'
        device = 'cuda:0'
        result = inference_model(model_cfg, deploy_cfg, backend_files, img=img, device=device)
        print(result)
    
    
    if __name__ == '__main__':
        inf_faster_rcnn_r50()
        inf_yolox()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    inference_model会创建一个对后端模型的封装,通过该封装进行推理。推理的结果会保持与 OpenMMLab 中原模型同样的格式。

    注解

    MMDeploy 转出的后端模型,您可以直接使用后端 API 进行推理。不过,因为 MMDeploy 拥有 TensorRT、ONNX Runtime 等自定义算子, 您需要先加载对应的自定义算子库,然后再使用后端 API。

    使用推理 SDK

    您也可以使用 MMDeploy SDK 进行推理。以上文中转出的 Faster R-CNN TensorRT 模型为例,接下来的章节将介绍如何使用 SDK 的 FFI 进行模型推理。

    Python API

    api_inference.py

    from mmdeploy_python import Detector
    import os
    import cv2
    import time
    
    coco_category = ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus',
                     'train', 'truck', 'boat', 'traffic light', 'fire hydrant',
                     'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog',
                     'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe',
                     'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
                     'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat',
                     'baseball glove', 'skateboard', 'surfboard', 'tennis racket',
                     'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl',
                     'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot',
                     'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
                     'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop',
                     'mouse', 'remote', 'keyboard', 'cell phone', 'microwave',
                     'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock',
                     'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush']
    
    
    def inf_model_api(model_path, image_path):
        detector = Detector(model_path, 'cuda', 0)
        img = cv2.imread(image_path)
        model_name = os.path.basename(model_path)
        t = time.time()
        bboxes, labels, _ = detector([img])[0]
        print(f"{model_name} cost time:", time.time() - t)
        print(f"{model_name} fps:", 1 / (time.time() - t))
    
        indices = [i for i in range(len(bboxes))]
        for index, bbox, label_id in zip(indices, bboxes, labels):
            [left, top, right, bottom], score = bbox[0:4].astype(int), bbox[4]
            if score < 0.3:
                continue
            cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0), 2)
            cv2.putText(img, coco_category[label_id], (left, top), cv2.FONT_HERSHEY_SIMPLEX, 1.3, (0, 0, 255), 3)
        model_name = os.path.basename(model_path)
        cv2.imwrite(f'demo_res_trt_{model_name}.png', img)
        return bboxes, labels
    
    
    def inf_faster_rcnn_r50():
        model_path = '/home/xbsj/gaoying/mmdeploy/mmdeploy_models/faster_rcnn'
        image_path = '/home/xbsj/gaoying/demo.png'
        res = inf_model_api(model_path, image_path)
        # print(res)
    
    
    def inf_yolox_s():
        model_path = '/home/xbsj/gaoying/mmdeploy/mmdeploy_models/yolox_s'
        image_path = '/home/xbsj/gaoying/demo.png'
        res = inf_model_api(model_path, image_path)
        # print(res)
    
    
    if __name__ == '__main__':
        inf_faster_rcnn_r50()
        inf_yolox_s()
    
    # faster_rcnn cost time: 0.07103466987609863
    # faster_rcnn fps: 14.072153983969509
    # yolox_s cost time: 0.014147043228149414		
    # yolox_s fps: 70.58859960618658
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    更多模型的 SDK Python API 应用样例,请查阅这里

    ⚠️ 注解

    如果您使用源码安装方式, 请把 ${MMDEPLOY_DIR}/build/lib 加入到环境变量 PYTHONPATH 中。 否则会遇到错误’ModuleNotFoundError: No module named ‘mmdeploy_python’

    C API(略)

    参考官方文档:操作概述 — mmdeploy 0.6.0 文档

    模型推理【windows】

    先安装一下windows下的环境,包括

    GPU: RTX 2060
    Win:10
    Cuda driver:
    Cuda:11.1
    Cudnn:8.2.1
    Python:3.7
    Pytorch:1.8.0
    torchvision:0.9.0
    mmdeploy:0.5.0
    Tensorrt:8.2.3.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    安装环境

    1️⃣ 安装cuda

    参考网址:win10+Anaconda+pytorch+CUDA11.1 详细安装指南

    cuda11.1下载地址: CUDA Toolkit 11.1.0 | NVIDIA Developer

    下载后打开安装,安装的几个步骤截图: 后边没截图的全选下一步就可以了。

    image-20220715105523744image-20220715105548166image-20220715105609014

    测试是否安装成功:命令行输入nvcc -V,成功结果如下:

    nvcc: NVIDIA (R) Cuda compiler driver
    Copyright (c) 2005-2020 NVIDIA Corporation
    Built on Tue_Sep_15_19:12:04_Pacific_Daylight_Time_2020
    Cuda compilation tools, release 11.1, V11.1.74
    Build cuda_11.1.relgpu_drvr455TC455_06.29069683_0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    2️⃣ 安装cudnn

    cudnn下载地址:cuDNN Archive | NVIDIA Developer

    下载直连: https://developer.nvidia.com/compute/machine-learning/cudnn/secure/8.0.4/11.1_20200923/cudnn-11.1-windows-x64-v8.0.4.30.zip

    🔸 覆盖cuda目录:分别将cudnn解压后的三个文件夹下的所有内容相对应复制到cuda目录下

    image-20220727110816595

    🔸 配置系统环境变量:

    一共有五个系统变量要添加:

    CUDA_SDK_PATH = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.1
    (这是之前安装cuda是默认安装位置的路径,如果你是自定义的路径的话,修改成自己的自定义路径)
    CUDA_LIB_PATH = %CUDA_PATH%\lib\x64
    CUDA_BIN_PATH = %CUDA_PATH%\bin
    CUDA_SDK_BIN_PATH = %CUDA_SDK_PATH%\bin\win64
    CUDA_SDK_LIB_PATH = %CUDA_SDK_PATH%\common\lib\x64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Path系统变量要添加的内容:

    C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.1\common\lib\x64
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\lib\x64
    C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.1\bin\win64
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\bin
    
    • 1
    • 2
    • 3
    • 4
    3️⃣ 安装anaconda

    官网下载:Anaconda | The World’s Most Popular Data Science Platform

    自行安装,记得勾选配置环境变量。

    🔸 创建conda虚拟环境,进入虚拟环境

    conda create -n mmdeploy python=3.7
    conda activate mmdeploy
    
    • 1
    • 2

    🔸 安装pytorch

    pip install torch==1.8.0+cu111 torchvision==0.9.0+cu111 torchaudio==0.8.0 -f https://download.pytorch.org/whl/torch_stable.html
    
    • 1
    4️⃣ 安装 mmcv-full
    pip install mmcv-full==1.5.0 -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.8.0/index.html
    
    • 1
    5️⃣ 安装 MMDeploy 和 SDK

    从 v0.5.0 之后,MMDeploy 开始提供预编译包。您可以根据目标软硬件平台,从这里选择并下载预编译包。在 NVIDIA 设备上,我们推荐使用 MMDeploy-TensoRT 预编译包:

    下载 mmdeploy-0.5.0-windows-amd64-cuda11.1-tensorrt8.2.3.0

    解压,用命令行进入到解压目录下:

    pip install dist\mmdeploy-0.5.0-py37-none-win_amd64.whl
    pip install sdk\python\mmdeploy_python-0.5.0-cp37-none-win_amd64.whl
    
    export LD_LIBRARY_PATH=/home/xbsj/gaoying/lib/mmdeploy-0.5.0-linux-x86_64-cuda11.1-tensorrt8.2.3.0/sdk/lib:$LD_LIBRARY_PATH            # 改为自己的目录
    
    cd ..
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    6️⃣ 安装mmdetction
    pip install mmdet
    
    • 1
    7️⃣ 安装TensorRT

    下载地址: NVIDIA TensorRT 8.x Download | NVIDIA Developer

    参考网址:windows安装tensorrt - 知乎 (zhihu.com)

    下载这个版本:TensorRT-8.2.3.0.Windows10.x86_64.cuda-11.4.cudnn8.2

    下载完成后,解压

    将 TensorRT-8.2.3.0\include 中所有文件 copy 到 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\include

    将 TensorRT-8.2.3.0\lib 中所有.lib文件 copy 到 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\lib\x64

    将 TensorRT-8.2.3.0\lib 中所有.dll文件 copy 到 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\bin

    进入conda虚拟环境,进入到 TensorRT-8.2.3.0\python\ 目录下:安装tensorrt包

    pip install tensorrt-8.2.3.0-cp37-none-win_amd64.whl
    
    • 1

    使用 Model Converter 的推理 API(略)

    参考模型推理Linux

    使用推理 SDK(略)

    参考模型推理Linux

    结果展示:

    🔸 速度对比

    设备:GTX 2060 fp16 image size:1382x1005(image size=640x427 速度差不多):

    GPU占用: 2181M
    faster_rcnn infer 1000 iter cost time: 71.89654660224915
    faster_rcnn infer 1000 iter fps: 13.908873892542662
    
    • 1
    • 2
    • 3
    GPU占用: 1703M
    yolox_s infer 1000 iter cost time: 14.963984966278076
    yolox_s infer 1000 iter fps: 66.82266306865823
    
    • 1
    • 2
    • 3

    🔸 可视化展示:

    原图faster rcnn r50yolox s
    640x427640x427_faster_rcnn_trt_sdk_res640x427_yolox_s_trt_sdk_res
    demo1382x1005_faster_rcnn_trt_sdk_res1382x1005_yolox_s_trt_sdk_res
  • 相关阅读:
    融入Facebook的世界:探索数字化社交的魅力
    在 Visual Studio Code (VS Code) 中设置
    神经网络梯度是什么意思,神经网络输出层节点数
    吴恩达《机器学习》8-7:多元分类
    SSH登录引起配置文件多次生效、应用程序多次启动问题
    【微服务】Dockerfile自定义镜像
    C#中的Dispatcher:Invoke与BeginInvoke的使用
    django+drf_haystack+elasticsearch+ik+高亮显示
    OpenCV9-窗口交互操作
    构建客户门户的痛点及低代码工具解决方案
  • 原文地址:https://blog.csdn.net/qq_39435411/article/details/126010452