CV11_模型部署pytorch转ONNX

news2024/11/15 23:35:02

如果自己的模型中的一些算子,ONNX内部没有,那么需要自己去实现。

1.1 配置环境

安装ONNX

pip install onnx -i https://pypi.tuna.tsinghua.edu.cn/simple

安装推理引擎ONNX Runtime

 pip install onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/simple

以及其他包,pytorch,matplotlib,numpy,pandas,pillow,opencv-python,tqdm 等

1.2 将模型导出为ONNX格式

# Author:SiZhen
# Create: 2024/7/15
# Description: 
import onnx
import onnxruntime as ort
import torch
from model import resnet34 #导入模型
#print(onnx.__version__)
#print(ort.__version__)

device = torch.device("cuda:0" if torch.cuda.is_available() else 'cpu')

model = resnet34().to(device)
model = model.eval().to(device)

x = torch.randn(16,3,224,224).to(device)
output = model(x)
print(output.shape)
with torch.no_grad():
    torch.onnx.export(
        model, #要转换的模型
        x, #模型的任意一组输入
        'resNet34.onnx', #导出的ONNX文件名
        opset_version=11, #ONNX算子集版本
        input_names=['input'], #输入Tensor的名称 (自己起名字)
        output_names=['output'] #输出Tensor的名称 (自己起名字)
    )

或者用我们自己的模型:

# Author:SiZhen
# Create: 2024/7/15
# Description:
import onnx
import onnxruntime as ort
import torch
from model import resnet34 #导入模型
#print(onnx.__version__)
#print(ort.__version__)

device = torch.device("cuda:0" if torch.cuda.is_available() else 'cpu')

#model = resnet34().to(device)
model = torch.load('./resNet34.pth')
model = model.eval().to(device)

x = torch.randn(16,3,224,224).to(device)
output = model(x)
print(output.shape)

#生成ONNX格式模型权重文件
with torch.no_grad():
    torch.onnx.export(
        model, #要转换的模型
        x, #模型的任意一组输入
        'resNet34.onnx', #导出的ONNX文件名
        opset_version=11, #ONNX算子集版本
        input_names=['input'], #输入Tensor的名称 (自己起名字)
        output_names=['output'] #输出Tensor的名称 (自己起名字)
    )


#验证模型导出成功
import onnx

#读取 ONNX模型
onnx_model = onnx.load('resNet34.onnx')

#检查模型格式是否正确
onnx.checker.check_model(onnx_model)
print('无错误')

#以可读的形式打印计算图
print(onnx.helper.printable_graph(onnx_model.graph))

 运行结果出现一个ONNX格式的权重文件:

1.3 验证ONNX模型导出成功

#验证模型导出成功
import onnx

#读取 ONNX模型
onnx_model = onnx.load('resNet34.onnx')

#检查模型格式是否正确
onnx.checker.check_model(onnx_model)
print('无错误')

以可读的形式打印计算图:

#以可读的形式打印计算图
print(onnx.helper.printable_graph(onnx_model.graph))

用netron可视化onnx模型:

1.4 torch.onnx.export()的原理:

三篇详细讲解的博客:

链接1:https://zhuanlan.zhihu.com/p/477743341

链接2:https://zhuanlan.zhihu.com/p/479290520

链接3:https://zhuanlan.zhihu.com/p/498425043

NPU是什么

NPU,全称为Neural Processing Unit,即神经网络处理单元,是一种专门为加速人工智能(AI)任务,特别是深度学习和机器学习算法而设计的专用计算芯片。随着AI技术的迅速发展,传统的中央处理器(CPU)和图形处理器(GPU)在处理复杂的神经网络模型时逐渐显得力不从心,特别是在移动设备和边缘计算场景中,对低功耗和高效能的需求日益增长,NPU因此应运而生。

NPU的特点与优势:

  1. 高度优化的架构:NPU的硬件架构针对神经网络中的大规模并行计算进行了特别优化,拥有大量简单但高效的计算核心,可以同时处理大量数据和执行复杂的矩阵运算,这对于诸如卷积神经网络(CNN)、循环神经网络(RNN)等深度学习模型尤为重要。

  2. 低功耗:相比CPU和GPU,NPU在处理相同AI任务时通常具有更低的能耗。这是因为其设计目标之一就是在保持高性能的同时减少能量消耗,这对于电池驱动的设备如智能手机、可穿戴设备尤为重要。

  3. 高速处理能力:NPU能够显著加快深度学习算法的运行速度,提升实时性,这对于需要即时反馈的应用场景,如语音识别、图像识别、自然语言处理等,至关重要。

  4. 集成与定制化:NPU往往被集成到系统级芯片(SoC)中,与CPU、GPU等其他组件紧密协作,为特定的AI应用场景提供定制化的解决方案。这种集成设计可以减少数据在不同组件间传输的时间,进一步提高效率。

  5. 机器学习推理与训练:NPU不仅适用于推理任务(即使用训练好的模型进行预测),在一些高端的NPU设计中,也支持或专门用于模型训练,尽管通常规模较小的训练任务或模型微调更为常见。

应用场景:

  • 智能手机:提升拍照质量,实现即时的图像识别、场景识别、人脸解锁等功能。
  • 自动驾驶:处理传感器数据,实现环境感知、物体识别和决策制定。
  • 物联网设备:在智能家居、智能安防等场景中,进行本地数据分析,减少云端依赖,保护隐私。
  • 医疗健康:辅助诊断,实时分析医疗影像资料。
  • 边缘计算:在靠近数据源的位置处理数据,减少延迟,提高数据处理效率。

结论:

NPU代表了AI时代硬件发展的新方向,它的出现使得终端设备能够更高效、低耗地执行复杂的AI任务,推动了AI技术在日常生活中的广泛应用,同时也预示着未来计算设备将更加智能化和个性化。随着技术的不断进步,NPU的功能和应用范围预计将持续扩大,成为连接物理世界和智能世界的桥梁。

ONNX格式是什么

ONNX(Open Neural Network Exchange)是一种开放的神经网络交换格式,旨在促进不同深度学习框架之间的模型互操作性。它是由微软、亚马逊、Facebook、IBM等科技巨头共同发起和支持的项目,目的是简化和标准化机器学习模型的转移流程,使其能够在不同的平台和工具之间无缝迁移。

ONNX的核心特点和优势:

  1. 兼容性广泛:ONNX提供了一个统一的标准,使得模型可以从一个框架训练后,轻松转换到另一个框架进行推理,支持的框架包括但不限于PyTorch、TensorFlow、MXNet、Caffe2、Scikit-learn等。

  2. 中间表示格式:ONNX定义了一种中间层表示,这是一种平台无关的模型描述方式。这意味着模型可以在不损失精度的情况下,从原始训练框架转换为ONNX格式,进而部署到支持ONNX的推理引擎中。

  3. 模型组成

    • Graph:ONNX模型的核心是一个计算图(Graph),它描述了模型的计算流程,包括输入、输出以及中间的计算节点。
    • Node:计算图中的每个节点(Node)代表一个特定的操作,如卷积、ReLU激活函数、矩阵乘法等。
    • Tensor:模型中的数据通过张量(Tensor)的形式表示,这些张量是多维数组,用作节点的输入和输出。
  4. 算子丰富性与模拟:为了增强兼容性,ONNX不断扩展其算子库,以支持更多的模型类型和复杂操作。对于一些不直接支持的复杂算子,ONNX会尝试通过一系列基本算子的组合来模拟这些操作,确保模型转换的成功率。

  5. 性能优化:虽然ONNX本身不直接提供推理引擎,但它被设计为可以与多种高性能推理引擎集成,如TensorRT、OpenVINO等,这些引擎可以针对特定硬件(如GPU、NPU)进行优化,从而提升模型推理的速度和效率。

  6. 社区支持与工具:ONNX拥有活跃的开发者社区,提供了丰富的工具链,包括模型转换工具(如PyTorch的torch.onnx.export)、验证工具、可视化工具等,便于模型的转换、检查和调试。

应用场景:

  • 模型迁移:研究者和开发者可以在不同框架间快速切换,比较不同框架下的模型性能。
  • 部署灵活性:模型可以部署到云服务、边缘设备或移动设备上,适应不同的硬件环境。
  • 模型服务化:企业和服务提供商可以利用ONNX格式将模型整合进其产品中,便于维护和更新。

综上所述,ONNX通过提供一个统一的模型表述方式,降低了模型在不同框架和平台间迁移的障碍,促进了AI技术的普及和应用。

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

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

相关文章

基于STM32设计的超声波测距仪(微信小程序)(186)

基于STM32设计的超声波测距仪(微信小程序)(186) 文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献1.4 开发工具的选择1.5 系统框架图…

WebSocket、服务器推送技术

WebSocket 是一种在单个 TCP 连接上进行 全双工 通信的协议,它可以让客户端和服务器之间进行实时的双向通信,且不存在同源策略限制 WebSocket 使用一个长连接,在客户端和服务器之间保持持久的连接,从而可以实时地发送和接收数据…

实现给Nginx的指定网站开启basic认证——http基本认证

一、问题描述 目前我们配置的网站内容都是没有限制,可以让任何人打开浏览器都能够访问,这样就会存在一个问题(可能会存在一些恶意访问的用户进行恶意操作,直接访问到我们的敏感后台路径进行操作,风险就会很大&#xff…

如何在excel表中实现单元格满足条件时整行变色?

可以试试使用条件格式: 一、条件格式 所谓“自动变色”就要使用条件格式。 先简单模拟数据如下, 按 B列数字为偶数 为条件,整行标记为蓝色背景色。 可以这样设置: 先选中1:10行数据,在这里要确定一下名称栏里显示…

数据的力量:Facebook如何通过数据分析驱动创新

在当今数字化和信息化的时代,数据被认为是推动企业创新和发展的关键因素之一。作为全球最大的社交媒体平台,Facebook不仅积累了庞大的用户数据,还利用先进的数据分析技术,不断探索和实现新的创新。本文将深入探讨Facebook如何通过…

Golang中读写锁的底层实现

目录 Sync.RWMutex 背景与机制 接口简单介绍 sync.RWMutex 数据结构 读锁流程 RLock RUnlock RWMutex.rUnlockSlow 写锁流程 Lock Unlock Sync.RWMutex 背景与机制 从逻辑上,可以把 RWMutex 理解为一把读锁加一把写锁; 写锁具有严格的排他性&…

Spring之事务管理TranscationManager(大合集)

原子性 事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。 一致性 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 隔离性 一个事务的执行不能被其他事务干扰。 持续性 一…

人工智能算法工程师(中级)课程12-PyTorch神经网络之LSTM和GRU网络与代码详解1

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程12-PyTorch神经网络之LSTM和GRU网络与代码详解。在深度学习领域,循环神经网络(RNN)因其处理序列数据的能力而备受关注。然而,传统的RNN存在梯度消失和梯度爆炸的问题,这使得它在长序列任务中的表现不尽…

【Git分支管理】理解分支 | 创建分支 | 切换分支 | 合并分支 | 删除分支 | 强制删除分支

目录 前言 0.理解分支 1.查看本地仓库存在的分支 2.HEAD指向分支 3.创建本地分支 4.切换分支 5.分支提交操作 6.合并分支 快进模式Fast-forward 7.删除分支 8.强制删除分支 本篇开始介绍下Git提供的杀手级的功能:分支管理 先提交再合并 前言 在玄幻武侠…

IP-Guard日志数据上传至 SYSLOG 服务器操作指南

一、功能简介 服务器支持把日志数据上传到 SYSLOG 服务器。 二、功能配置 2.1 数据目录移交设置 在服务器安装目录下 OServer3.ini 文件中,添加工具启动配置,配置五分钟内生效。 Path:设置移交目录路径,IPG 服务器会把收集完成的…

Redis④ —— 高可用

1. 主从复制 一主多从模式,采用读写分离的方式主服务器可以进行读写操作,当发生写操作时自动将写操作同步给从服务器,而从服务器一般是只读,并接受主服务器同步过来写操作命令,然后执行这条命令。主从服务器之间的命令…

jvm常用密令、jvm性能优化、jvm性能检测、Java jstat密令使用、Java自带工具、Java jmap使用

1.jps是Java虚拟机的进程状态工具,用于列出正在运行的Java进程 jps命令的使用:cmd打开直接jps 1.1不带参数: jps 默认情况下,列出所有正在运行的 Java 进程的进程 ID 和主类名。 1.2 -l:显示完整的主类名或 JAR 文件…

《故障复盘 · 数据库连接异常关闭》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

不开放80或443端口也能申请IP SSL证书!

在申请SSL/HTTPS证书时,如果不方便使用域名或者没有域名,就要申请一种特殊的SSL证书——IP SSL证书。但是一般的IP地址证书签发过程中,需要短暂开放80或者443端口才能签发成功。那么问题来了,有的实在不能开放80或者443端口&#…

keil中GD32 MCU IAP中APP的存储地址如何设置?

前面和大家聊过什么是IAP,那么IAP中APP的存储地址该如何设置呢? 以keil为例,打开工程的option选项卡: 将IROM1中的地址改为你想要保存的位置,比如0x08008000开始的位置: 这样通过keil烧录,程序…

记录|.NET上位机开发和PLC通信的实现

本文记录源自:B站视频 实验结果:跟视频做下来是没有问题的。能运行。 目录 前言一、项目Step1. 创建项目Step2. 创建动态图片展示Step3. 创建图片型按钮Step4. 创建下拉框Step1~4的效果展示Step5. 编程实体类操作类Main函数 Step1~5的效果展示Main函数 最…

[Python学习篇] Python PyMysql

什么是PyMysql PyMysql是一个纯 Python 实现的 MySQL 客户端库,允许你在 Python 程序中与 MySQL 数据库进行交互。 安装PyMysql PyMysql地址:https://pypi.org/project/PyMySQL/ pip install pymysql 使用PyMysql 连接mysql import pymysql# 数据库连…

数据库redis命令作业九

1、安装redis,启动客户端、验证。 2、string类型数据的命令操作: (1) 设置键值: (2) 读取键值: (3) 数值类型自增1: (4) 数…

【单片机毕业设计选题24064】-基于阿里云的鱼塘水质检测系统

系统功能: 主控为STM32F103C8T6,通过PH值传感器、浑浊度传感器、温度传感器采集各项水质数据,系统可设定各参数 的阈值,超过设定的阈值将通过蜂鸣器响来提醒用户做出措施,同时通过ESP-12F WIFI模块将设备连接阿里云 物联网平台…

信通院全景图发布 比瓴科技领跑软件供应链安全,多领域覆盖数字安全服务

近日,中国信息通信研究院在2024全球数字经济大会—数字安全生态建设专题论坛正式发布首期《数字安全护航技术能力全景图》(以下简称全景图)。 比瓴科技入选软件供应链安全赛道“开发流程安全管控、交互式安全测试、静态安全测试、软件成分分…