TenserRT(一)模型部署简介

news2024/9/22 1:12:18

第一章:模型部署简介 — mmdeploy 0.12.0 文档

pytorch.onnx.export方法参数详解,以及onnxruntime-gpu推理性能测试_胖胖大海的博客-CSDN博客

我们来谈谈ONNX的日常 - Oldpan的个人博客

初识模型部署

训练:网络结构(深度学习框架定义)+网络参数(训练)

优化:模型结构+参数--优化-->中间表示

运行:面向硬件的高性能编程框架(CUDA)

 部署第一个模型

创建pytorch模型

# 安装 ONNX Runtime, ONNX, OpenCV
pip install onnxruntime onnx opencv-python
import os

import cv2
import numpy as np
import requests
import torch
import torch.onnx
from torch import nn
# 超分辨率
class SuperResolutionNet(nn.Module):
    def __init__(self, upscale_factor):
        super().__init__()
        self.upscale_factor = upscale_factor#放缩因子
        self.img_upsampler = nn.Upsample(#上采样
            scale_factor=self.upscale_factor,#上采样比例
            mode='bicubic',#双线性插值
            align_corners=False)#

        self.conv1 = nn.Conv2d(3,64,kernel_size=9,padding=4)
        self.conv2 = nn.Conv2d(64,32,kernel_size=1,padding=0)
        self.conv3 = nn.Conv2d(32,3,kernel_size=5,padding=2)

        self.relu = nn.ReLU()

    def forward(self, x):
        x = self.img_upsampler(x)
        out = self.relu(self.conv1(x))
        out = self.relu(self.conv2(out))
        out = self.conv3(out)
        return out

# Download checkpoint and test image
urls = ['https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth',
    'https://raw.githubusercontent.com/open-mmlab/mmediting/master/tests/data/face/000001.png']
names = ['srcnn.pth', 'face.png']
for url, name in zip(urls, names):
    if not os.path.exists(name):
        open(name, 'wb').write(requests.get(url).content)#保存参数和图像

def init_torch_model():
    torch_model = SuperResolutionNet(upscale_factor=3)#放大三倍

    state_dict = torch.load('srcnn.pth')['state_dict']#载入state_dict

    # Adapt the checkpoint
    for old_key in list(state_dict.keys()):#遍历state_dict
        new_key = '.'.join(old_key.split('.')[1:])#重新编辑名称
        state_dict[new_key] = state_dict.pop(old_key)#改写名称

    torch_model.load_state_dict(state_dict)#网络模型载入参数
    torch_model.eval()# 评估模式
    return torch_model#返回评估网络

model = init_torch_model()#初始化预测评估网络模型
input_img = cv2.imread('face.png').astype(np.float32)#opencv读取图片,转换为float32

# HWC to NCHW
input_img = np.transpose(input_img, [2, 0, 1])#将HWC通道转换为CHW
input_img = np.expand_dims(input_img, 0)#增加dims,为NCHW,这样网络就可以在HW上卷积,C为RGB

# Inference
torch_output = model(torch.from_numpy(input_img)).detach().numpy()

# NCHW to HWC
torch_output = np.squeeze(torch_output, 0)#NCHW -> CHW
torch_output = np.clip(torch_output, 0, 255)# clip
torch_output = np.transpose(torch_output, [1, 2, 0]).astype(np.uint8)# CHW -> HCW

# Show image
cv2.imwrite("face_torch.png", torch_output)# save

中间表示——ONNX

神经网络描述的是数据计算过程,结构可以用计算图表示。如a+b

一些框架通过“先编译,后执行”的静态图来加速计算过程。

静态图难以描述控制流(if-else和for) ,因为不同的控制语句产生不同的计算图。这

这就不是静态图了 。ONNX(Open Neural Network Exchange)是 Facebook 和微软在2017年共同发布的,用于标准描述计算图的一种格式。作为深度学习框架到推理引擎的中间表示。

import torch
from tensorrtdemo.torch_inference import init_torch_model
x = torch.randn(1, 3, 256, 256)#随机产生一个大小固定的输入
model = init_torch_model()#获取带参数的模型
with torch.no_grad():#上下文管理器,禁止梯度计算,在网络推断中可以节省显存
    torch.onnx.export(
        model,#带参模型
        x,#随机的输入形式
        "srcnn.onnx",#存储的onnx文件
        opset_version=11,# opset版本是指onnx定义的算子集合
        input_names=['input'],#输入对象名称
        output_names=['output'])#输出对象名称

PyTorch 提供了一种叫做追踪(trace)的模型转换方法:给定一组输入,再实际执行一遍模型,即把这组输入对应的计算图记录下来,保存为 ONNX 格式。

Netron download | SourceForge.net

netron可以查看onnx和参数文件,onnx利用protobuf序列化数据结构协议存储神经网络权重信息。

查看模型版本、输入、输出名称和数据类型 

 

 

点击算子节点 :

  • 算子属性(attribute),如对卷积算子来说,属性包括卷积核大小(kernel_shape)、卷积步长(strides)等。
  • 图结构信息,包含算子节点在计算图中的名称(Conv_2)、邻边的信息(inputs(X):11、outputs(Y):12)
  • 权重信息:卷积核的权重(conv1.weight)和卷积后的偏差(conv1.bias),点击后面的“+”可以看到具体的数值。

推理引擎——ONNX Runtime

ONNX Runtime是微软维护的一个跨平台机器学习推理加速器(推理引擎)。

import onnxruntime
import cv2
import numpy as np
input_img = cv2.imread('face.png').astype(np.float32)#读取数据,并转换数据类型
# HWC to NCHW
input_img = np.transpose(input_img, [2, 0, 1])#坐标轴转置
input_img = np.expand_dims(input_img, 0)#扩展数组的形状。

ort_session = onnxruntime.InferenceSession("srcnn.onnx")#输入ONNX,获取ONNX Runtime推理器
ort_inputs = {'input': input_img}#输入值字典,key为张量名,value为numpy类型的张量值
ort_output = ort_session.run(['output'], ort_inputs)[0]#网络推理(输出张量名列表,输入值字典),输入输出张量名称要和torch.onnx.export中设置的输入输出名称对应
ort_output = np.squeeze(ort_output, 0)#移除长度为1的轴
ort_output = np.clip(ort_output, 0, 255)#剪辑(限制)数组中的值。
ort_output = np.transpose(ort_output, [1, 2, 0]).astype(np.uint8)#坐标轴转置,并转换数据类型
cv2.imwrite("face_ort.png", ort_output)#保存

总结

  • 模型部署:将训练好的模型在特定环境中运行的过程,以解决模型框架兼容性差和模型运行速度慢。
  • 流水线:深度学习框架-中间表示(ONNX)-推理引擎
  • 计算图:深度学习模型是一个计算图,模型部署就是将模型转换成计算图,没有控制流(分支语句和循环)的计算图。
  • ONNX:pytorch可以直接导出ONNX。
  • 推理引擎:ONNX Runtime是ONNX模型的原生推理引擎,可以直接在python API中完成模型推理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/431820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Windows】更换笔记本键盘操作

目录 一、拆旧 1、电脑保持关机状态 2、拆下电池 3、拧开中间这块区域的螺丝 4、拿键盘进行对照,找到对应的固定键盘的螺丝的位置,拧开 5、直接撬起原本的键盘,注意不要扯到下面的排线,小心点 二、换新 6、换新键盘&#…

公司新招了个腾讯拿38K的人,让我见识到了什么才是测试天花板···

5年测试,应该是能达到资深测试的水准,即不仅能熟练地开发业务,而且还能熟悉项目开发,测试,调试和发布的流程,而且还应该能全面掌握数据库等方面的技能,如果技能再高些的话,甚至熟悉分…

ubuntu_修改libc.so.6 或者 libm.so.6的软链接导致sudo ls 等命令失效的解决方法

1. 背景 运行一个binary 应用程序, 提示报错: /lib/x86_64-linux-gnu/libm.so.6: version GLIBC_2.27 not found (required by 我的应用程序string 里一下符号标, 确实没有然后下载了一个 glibc-2.27, 安装到 usr/local/下, 并将 libm-2.27.so 和 libc-2.27.so 复制到 /lib/x8…

点云的处理

一、激光点云 激光点云指的是由三维激光雷达设备扫描得到的空间点的数据集,每一个点云都包含了三维坐标(XYZ)和激光反射强度(Intensity),其中强度信息会与目标物表面材质与粗糙度、激光入射角度、激光波长以…

基于imx8m plus开发板全体系开发教程3:Ubuntu 20.04 编译

前言: i.MX8M Plus 开发板是一款拥有 4 个 Cortex-A53 核心,运行频率 1.8GHz;1 个 Cortex-M7 核心,运行频率 800MHz;此外还集成了一个 2.3 TOPS 的 NPU,大大加速机器学习推理。 全文所使用的开发平台均为与NXP官方合作的FS-IMX8…

websorm启动vue项目修改内容后自动运行内存溢出

手动启动vue项目正常运行,修改部分内容保存后会自动重新run一下, 这个时候就报错内存溢出,然后很悲伤的需要再手动重启一下。 (在网上查了好多方法就不单独加链接了) 前3个方法都试过对于我的项目无效,第4…

017 - C++ 中的静态(static)

本期我们将讨论 C 中的 static(静态)。 static 关键字在 C 中有两个意思,这个取决于上下文。 简单了解 第一种情况是在类或结构体外部使用 static 关键字,另一种是在类或者结构体内部使用 static。 基本上我们可以这样理解&am…

背包问题基础与应用

背包问题 理论基础 01背包 背包中的每个物品只能用一次 物品编号重量价值物品1115物品2320物品3430 定义:dp[i][j]表示从下标0-i的物品中任取,放进容量为j的背包的最大价值 初始化: dp [[0] * (bag_size 1) for _ in range(len(weigh…

Java程序内存占用优化实践

目录背景堆内存调整内存还会继续上涨减少线程数量TomcatDubboLogback野线程背景 上了微服务的当,喜欢将服务各种拆分,公有云模式下服务器比较多,还能玩得转。到了私有化部署,有的客户连个技术人员都没有,只想一键启动…

java——《面试题——基础篇》

1、 Java语言有哪些特点 1、简单易学、有丰富的类库 2、面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高) 3、与平台无关性(JVM是Java跨平台使用的根本) 4、可靠安全 5、支持多线程 2、面向对象…

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCVSharp实现Mono12和Mono16位深度的图像保存(C#)

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCVSharp实现Mono12和Mono16位深度的图像保存(C#) Baumer工业相机Baumer工业相机保存位深度12/16位图像的技术背景代码案例分享1:引用合适的类文件2:BGAPI SDK在图像回调中联合O…

【GCU体验】基于PaddlePaddle + GCU跑通模型并测试GCU性能

一、环境 地址:启智社区:https://openi.pcl.ac.cn/ 二、计算卡介绍 云燧T20是基于邃思2.0芯片打造的面向数据中心的第二代人工智能训练加速卡,具有模型覆盖面广、性能强、软件生态开放等特点,可支持多种人工智能训练场景。同时具备灵活的可…

STM32理论 —— 定时器、时钟

文章目录 1. 定时器1.1 分类与简介1.1.1 分类与主要功能特点1.1.2 三种常用的定时器简介1.1.3 三种计数模式1.1.4 定时器计数原理 1.2 时钟来源1.3 通用定时器简介1.4 计数溢出时间公式1.4 定时器中断的原理1.5 输入捕获1.6 核心代码1.6.1 通用定时器初始化1.6.2 高级定时器初始…

【Python_Scrapy学习笔记(十三)】基于Scrapy框架的图片管道实现图片抓取

基于Scrapy框架的图片管道实现图片抓取 前言 本文中介绍 如何基于 Scrapy 框架的图片管道实现图片抓取,并以抓取 360 图片为例进行展示。 正文 1、Scrapy框架抓取图片原理 利用 Scrapy 框架提供的图片管道类 ImagesPipeline 抓取页面图片,在使用时需…

领域驱动设计理论实践

战略设计 战略设计是将“混沌”解构成“清晰”的过程,在该过程从开始到结束的历程之中,我们会划分出领域、界定通用语言范围、确定出系统限界上下文以及上下文之间的映射方式。 领域划分 战略设计在领域驱动设计中起着关键作用,因为其决定了…

使用Bazel构建前端Sass

注:本文假设对Bazel有一定的了解。本文基于Bazel 4.2.2 版本 在web前端领域,前端样式,web浏览器只认CSS样式语言。而CSS样式语言又过于低级。于是有人发明了更高级的语言:Sass[1],用于生成CSS代码。 这样的方案&#x…

【C++】队列模拟问题

文章目录队列模拟问题12.7.1 ATM问题12.7.2 队列类12.7.3 Queue类的接口12.7.4 **Queue类的实现**12.7.5 是否需要其他函数?12.7.6 Customer类queue.hqueue.cpp12.7.7 ATM模拟main.cpp队列模拟问题 12.7.1 ATM问题 Heather银行打算在Food Heap超市开设一个自动柜员…

【C++STL精讲】vector的基本使用与常用接口

文章目录💐专栏导读💐文章导读🌷vector是什么?🌷vector的基本使用🌷vector常用函数接口💐专栏导读 🌸作者简介:花想云,在读本科生一枚,致力于 C/C…

HAL库版FreeRTOS(上)

目录 FreeRTOS 简介初识FreeRTOS什么是FreeRTOS?为什么选择FreeRTOS?FreeRTOS 的特点商业许可 磨刀不误砍柴工查找资料FreeRTOS 官方文档Cortex-M 架构资料 FreeRTOS 源码初探FreeRTOS 源码下载FreeRTOS 文件预览 FreeRTOS 移植FreeRTOS 移植移植前准备添加FreeRTO…

浏览器断点调试说明

断点调试 断点调试面板 功能按钮介绍 描述:继续执行脚本 或者叫(逐过程执行) 快捷键 (F8)或者是(Ctrl\) 作用:打断点了的地方(比如有是三个断点地方)就会 第一…