模型推理加速系列06:基于resnet18加速方案评测(代码片段)

JasonLiu1919 JasonLiu1919     2023-02-05     665

关键词:

简介

花雪随风不厌看,更多还肯失林峦。愁人正在书窗下,一片飞来一片寒。小伙伴们好,我是微信公众号小窗幽记机器学习的首席称重师:卖麻辣烫的小男孩。今天这篇文章以resnet18模型为例,对比Pytorch、ONNX、TorchScript、TensorRT模型格式在不同硬件(包括CPU和GPU)上的inference性能。由于此前TorchScript模型在 AMD CPU上的评测结果是负向效果(远慢于Pytorch),具体可以参考此前的推文模型推理加速系列|04:BERT模型推理加速 TorchScript vs. ONNX推理速度评测部分,因此本次实验涉及CPU评测部分改用Intel CPU

本文也同步发布于微信公众号模型推理加速系列 | 06: 基于resnet18加速方案评测

更多、更新文章欢迎关注微信公众号小窗幽记机器学习。后续会持续输出模型推理加速工程部署相关系列,敬请期待~

老惯例,下图是算法生成的图片,仅供欣赏~

本次实验所用硬件信息如下:

CPU:

10  Intel(R) Xeon(R) Platinum 8255C CPU @ 2.50GHz

GPU:

Nvidia T4 和 Nvidia 3090 都是单卡

模型导出

导出TorchScript

关于如何导出TorchScript模型格式及其TorchScript模型格式的进一步介绍可以参考此前的文章:模型推理加速系列|04:BERT模型推理加速 TorchScript vs. ONNX
模型推理加速系列|05:TorchScript模型格式简介及其使用。本文将 resnet18 导出TorchScript格式及其Python版inference的评测代码如下:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    :   check_jit.py
@Time    :   2022/11/25 20:31:12
@Author  :   卖麻辣烫的小男孩
@Desc    :   
'''
import os
os.environ['TORCH_HOME']='/data/model_zoo/cv'
"""
默认情况下环境变量TORCH_HOME的值为~/.cache
"""

import torch
import torchvision
import pdb
import time
from tqdm import tqdm
import numpy as np


def convert_resnet18_torchscript():
    """
    将 resnet18 转为 TorchScript 模型格式
    """
    # An instance of your model.
    model = torchvision.models.resnet18(pretrained=True)

    # Switch the model to eval model
    model.eval()

    # An example input you would normally provide to your model's forward() method.
    example = torch.rand(1, 3, 224, 224)

    # Use torch.jit.trace to generate a torch.jit.ScriptModule via tracing.
    trace_model = torch.jit.trace(model, example) # torch.jit.ScriptModule

    raw_output = model(example)
    trace_model_output = trace_model(example)
    np.testing.assert_allclose(raw_output.detach().numpy(), trace_model_output.detach().numpy())
    # Save the TorchScript model
    trace_model.save("/data/model_zoo/cv/resnet18_traced_model.pt")


    # Use torch.jit.trace to generate a torch.jit.ScriptModule via script.
    script_model = torch.jit.script(model)
    script_model_output = script_model(example)
    np.testing.assert_allclose(raw_output.detach().numpy(), script_model_output.detach().numpy())
    # Save the TorchScript model
    script_model.save("/data/model_zoo/cv/resnet18_script_model.pt")

导出 ONNX

关于如何导出ONNX模型格式可以参考之前的文章:模型推理加速系列|04:BERT模型推理加速 TorchScript vs. ONNX

导出ONNX模型

本次实验将resnet18导出为ONNX模型格式的代码如下:

import torch

MODEL_ONNX_PATH = "/data/model_zoo/cv/resnet18.onnx"
OPERATOR_EXPORT_TYPE = torch._C._onnx.OperatorExportTypes.ONNX
model = torchvision.models.resnet18(pretrained=True)
model.eval()
org_dummy_input = torch.rand(1, 3, 224, 224)
torch.onnx.export(model,
                org_dummy_input,
                MODEL_ONNX_PATH,
                verbose=True,
                operator_export_type=OPERATOR_EXPORT_TYPE,
                opset_version=12,
                input_names=['inputs'],
                output_names=['outputs'],
                do_constant_folding=True,
                dynamic_axes="inputs": 0: "batch_size", "outputs": 0: "batch_size"
                )

ONNX模型可视化

利用 netron 对导出的ONNX模型进行可视化:

netron  /data/model_zoo/cv/resnet18.onnx -p 8001 --host "0.0.0.0"

可视化结果如下:

导出TensorRT

使用如下命令将 ONNX 格式模型转为 TensorRT 模型格式:

CUDA_VISIBLE_DEVICES=0 trtexec --onnx=model_repo/resnet18.onnx  --minShapes=inputs:1x3x224x224 --optShapes=inputs:64x3x224x224 --maxShapes=input_ids:256x3x224x224 --saveEngine=model_repo/model.plan --workspace=20480

更多关于如何导出TensorRT模型格式的细节,敬请期待后续系列

C++上做模型inference

由于导出的 TorchScript 模型能够在C++上运行,本文进一步在C++上进行评测。

编译和运行

官方发布的LibTorch所有版本都是已经编译好的,解压后就可以使用。在Linux上提供了两种类型的libtorch二进制文件:一种是用GCC pre-cx11 ABI编译的,另一种是用GCC-cx11 ABI编译的,应该根据系统使用的GCC ABI进行选择。

CMakeList.txt 内容如下:

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)

project(example-app)

find_package(Torch REQUIRED)
set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS $TORCH_CXX_FLAGS")

add_executable(example-app example-app.cpp)
target_link_libraries(example-app "$TORCH_LIBRARIES")
set_property(TARGET example-app PROPERTY CXX_STANDARD 14)

cmake 编译:

cmake -DCMAKE_PREFIX_PATH=/opt/conda/lib/python3.8/site-packages/torch/share/cmake/ ..
cmake --build . --config Release

运行程序:

./example-app /home/model_zoo/cv/resnet18_traced_model.pt gpu 1

功能测试

torch::ones(1, 3, 224, 224作为输入,测试结果如下。

Python版GPU 上 inference的输出结果:

(Pdb) outputs[0,:5]
tensor([-0.0375,  0.1146, -1.7963, -1.2334, -0.8193], device='cuda:0',
       grad_fn=<SliceBackward0>)

C++版CPU 上inference的输出结果:

-0.0391  0.1145 -1.7968 -1.2343 -0.8190
[ CPUFloatType1,5 ]

C++版GPU 上inference的输出结果:

-0.0375  0.1146 -1.7963 -1.2334 -0.8193
[ CUDAFloatType1,5 ]

评测结果

以下综合评测了resnet18在原生Pytorch模型格式、ONNX、TorchScript(Python版和C++版)和TensorRT模型格式的inference性能。具体评测结果如下表所示(单位ms):

CPU 版

batch-sizePytorchONNXJIT-traceJIT-trace(C++)
116.7714.414.3
876.250.271.370.0
16146.899.9139.6140.6
32277.6194.3274269.9

NVIDIA T4 GPU 评测结果:

batch-sizePytorchONNXJIT-traceJIT-trace(C++)TensorRT
14.24.14.24.23.9
25.55.85.55.55.2
49.58.39.59.58.4
817.616.817.617.615.3
1628.526.228.628.625.2
325251.152.15250.7
64100.396.2100.3100.292.6
128显存不足198.6显存不足200174.8

NVIDIA 3090 GPU 评测结果:

batch-sizePytorchONNXJIT-traceJIT-trace(C++)TensorRT
12.61.41.91.90.9
22.71.51.921.1
42.71.91.921.5
82.72.72.32.32.4
164.34.44.24.154.2
327.67.87.57.57.3
6414.113.813.91412.7
12826.527.726.326.624

小结

本文基于resnet18模型在CPU和GPU上评测原生Pytorch模型格式、ONNX、TorchScript(Python版和C++版)和TensorRT模型格式的inference性能。根据上述评测结果可以得出以下初步结论:

  1. Intel CPU 上,ONNX推理速度最快

  2. 图片场景下(尺寸固定,只是batch size可变)如果使用GPU,TensorRT推理速度最快

  3. 小 batch size加速明显,随着batch size的增加,耗时近乎上线性增加,即提速收益不再增加

  4. 随着batch size的增加,各个方案的inference性能接近,没有显著差异。

  5. 相同模型格式不同编程语言在GPU上做推理,纯GPU inference部分耗时一样。不同语言在GPU上inference的差异仅仅在于把数据放在GPU上的API不同,最终是同一硬件GPU对同一模型进行inference,所需要的算力是一样的。

  6. C++中显存利用率更高

模型推理加速系列07:以bert为例全面评测各种推理加速方案(代码片段)

...李白风格创作的,仅供欣赏。前文以CV领域中的resnet18模型为例综合评测各种推理加速方 查看详情

模型推理加速系列07:以bert为例全面评测各种推理加速方案(代码片段)

...李白风格创作的,仅供欣赏。前文以CV领域中的resnet18模型为例综合评测各种推理加速方 查看详情

模型推理加速系列bert加速方案对比torchscriptvs.onnx(代码片段)

文章目录简介基于ONNX导出ONNX模型示例代码基于TorchScriptJITTorchScript示例代码推理速度评测CPUGPU附录简介本文以BERT-base的为例,介绍2种常用的推理加速方案:ONNX和TorchScript,并实测对比这两种加速方案与原始Pytorch模型... 查看详情

模型推理加速系列04:bert加速方案对比torchscriptvs.onnx(代码片段)

文章目录简介基于ONNX导出ONNX模型示例代码基于TorchScriptJITTorchScript示例代码推理速度评测CPUGPU附录简介本文以BERT-base的为例,介绍2种常用的推理加速方案:ONNX和TorchScript,并实测对比这两种加速方案与原始Pytorch模型... 查看详情

自动驾驶中的深度学习模型量化部署加速实战

这里主要是针对AI算法落地的模型部署,其中有基于TensorRT的部署、基于OpenCV+CUDA的部署以及基于NCNN的部署,项目包括简单的demo案例、目标检测、语义分割、实例分割、车道线检测以及Transformer等。大家可以参考以下的链接进行... 查看详情

自动驾驶中的深度学习模型量化部署加速实战

这里主要是针对AI算法落地的模型部署,其中有基于TensorRT的部署、基于OpenCV+CUDA的部署以及基于NCNN的部署,项目包括简单的demo案例、目标检测、语义分割、实例分割、车道线检测以及Transformer等。大家可以参考以下的链接进行... 查看详情

模型推理一文看懂winograd卷积加速算法(代码片段)

...篇卷积加速相关的文章,感兴趣的同学可以查阅《【模型推理】一文看懂Img2Col卷积加速算法》、《【模型推理】一文看懂GoogleTPU脉动阵列加速卷积计算原理》、《【模型推理】谈谈为什么 查看详情

模型推理谈谈为什么量化能加速推理(代码片段)

... o_O O_o ~_~ o_O 本文主要讨论一下为什么量化能加速模型推理。 前面已经写过几篇关于模型量化相关的文章:《【模型推理】谈谈几种量化策略:MinMax、KLD、ADMM、EQ》、《【模型推理】谈谈模型量化组织方式》、... 查看详情

《自动驾驶中的深度学习模型量化部署加速实战》专栏概述|实战教程,开放源码

这里主要是针对AI算法落地的模型部署,其中有基于TensorRT的部署、基于OpenCV+CUDA的部署以及基于NCNN的部署,项目包括简单的demo案例、目标检测、语义分割、实例分割、车道线检测以及Transformer等。大家可以参考以下的链接进行... 查看详情

基于b/s架构搭建一个支持多路摄像头的实时处理系统----使用yolov5模型基于gpu多进程处理视频流

文章大纲多路推理的几种方案多进程多线程cpu效果gpu效果其他格式的加速推理ONNX推理ONNXRuntime不同格式能给推理加速多少?CPUGPU学习路径与参考文献参考项目项目地址系列文章:参考:使用python多进程进行基于websocket的实时视频... 查看详情

如何加速 Tensorflow 2 keras 模型进行推理?

】如何加速Tensorflow2keras模型进行推理?【英文标题】:HowtospeedupTensorflow2kerasmodelforinference?【发布时间】:2020-03-0420:50:55【问题描述】:所以现在有一个重大更新,从TensorFlow1.X迁移到2.X。在TF1.X中,我习惯了一个管道,它帮助我... 查看详情

cpu推理|使用英特尔sapphirerapids加速pytorchtransformers(代码片段)

...我们将重点关注推理。使用基于PyTorch的HuggingFacetransformers模型,我们首先在IceLake服务器上分别测量它们在长、短两种文本序列上的性能。然后,我们在SapphireRapids服务器和最新版本的HuggingFaceOptimumIntel上执行相同的测试,并比较... 查看详情

rk3399proyolov5人工智能加速推理解决方案(代码片段)

...;本文介绍了YOLOv5s算法在国产瑞芯微电子RK3399ProD上的部署推理.介绍整个的流程,并基于RK3399Pro简单的介绍下RKNN的Python接口使用,并记录一些踩过的坑。本文仅做交流使用,文中有什么理解的不到位的或者谬误,... 查看详情

模型推理谈谈为什么卷积加速更喜欢nhwclayout(代码片段)

 本文主要讨论一下为什么卷积加速更加喜欢NHWC的数据排布。 我目前接触过的数据排布类型(主要针对卷积)有NCHW(pytorch、caffe),NHWC(Tensorflow,也是TVMGPU和寒武纪MLUCore上更喜欢的dataLayout),CHW(TensorRT里不考虑动态batch... 查看详情

模型推理一文看懂googletpu脉动阵列加速卷积计算原理

 本教程详细解释了GoogleTPU脉动阵列加速卷积计算原理。 TPU中计算卷积的方式和GPU不同,主要是依靠一种称为“脉动阵列”的硬件电路结构来实现的。脉动阵列的主体部分是一个二维的滑动阵列,其中每一个节点都是... 查看详情

模型推理寒武纪mluresnet50量化及离线推理流程(代码片段)

...搭建、resnet50量化、resnet50离线推理,resnet系列是标准模型,其他模型也可参考该流程执行。文章目录1、 查看详情

ampere收购onspecta,加速对云原生应用程序的ai推理

...收购AI技术初创公司OnSpecta,该收购将助力Ampere通过AI推理应用程序进一步增强Ampere®Altra®的性能。相较于常用的基于CPU的机器学习(ML)框架,OnSpecta深度学习方案(DLS)的AI优化引 查看详情

tensorrt模型加速1-输入输出部署流程

...TensorRT的输入、输出以及部署流程,了解TensorRT在部署模型中起到的作用。然后介绍TensorRT模型导入流程,针对不同的深度学习框架,使用不同的方法导入模型。一、TensorRT简介TensorRT是NVIDIA公司发布的一个高性能的深... 查看详情