当前位置: 首页 > news >正文

CV11_模型部署pytorch转ONNX

如果自己的模型中的一些算子,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技术的普及和应用。

相关文章:

CV11_模型部署pytorch转ONNX

如果自己的模型中的一些算子,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/si…...

Redis的使用(四)常见使用场景-缓存使用技巧

1.绪论 redis本质上就是一个缓存框架,所以我们需要研究如何使用redis来缓存数据,并且如何解决缓存中的常见问题,缓存穿透,缓存击穿,缓存雪崩,以及如何来解决缓存一致性问题。 2.缓存的优缺点 2.1 缓存的…...

BERT架构的深入解析

BERT(Bidirectional Encoder Representations from Transformers)是由Google在2018年提出的一种基于Transformer架构的预训练模型,迅速成为自然语言处理(NLP)领域的一个里程碑。BERT通过双向编码器表示和预训练策略&am…...

数字孪生技术如何助力低空经济飞跃式发展?

一、什么是低空经济? 低空经济,是一个以通用航空产业为主导的经济形态,它涵盖了低空飞行、航空旅游、航空物流、应急救援等多个领域。它以垂直起降型飞机和无人驾驶航空器为载体,通过载人、载货及其他作业等多场景低空飞行活动&a…...

HTTP背后的故事:理解现代网络如何工作的关键(二)

一.认识请求方法(method) 1.GET方法 请求体中的首行包括:方法,URL,版本号 方法描述的是这次请求,是具体去做什么 GET方法: 1.GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源。 2.在浏览器中直接输入 UR…...

数据流通环节如何规避安全风险

由于参与数据流通与交易的数据要素资源通常是经过组织加工的高质量数据集,甚至可能涉及国家核心战略利益,一旦发生针对数据流通环节的恶意事件,将造成较大负面影响,对数据要素市场的价值激活造成潜在威胁。具体来说,数…...

部署k8s 1.28.9版本

继上篇通过vagrant与virtualBox实现虚拟机的安装。笔者已经将原有的vmware版本的虚拟机卸载掉了。这个场景下,需要重新安装k8s 相关组件。由于之前写的一篇文章本身也没有截图。只有命令。所以趁着现在。写一篇,完整版带截图的步骤。现在行业这么卷。离…...

实验二:图像灰度修正

目录 一、实验目的 二、实验原理 三、实验内容 四、源程序和结果 源程序(python): 结果: 五、结果分析 一、实验目的 掌握常用的图像灰度级修正方法,包括图象的线性和非线性灰度点运算和直方图均衡化法,加深对灰度直方图的理解。掌握对比度增强、直方图增强的原理,…...

bash: ip: command not found

输入: ip addr 报错: bash: ip: command not found 报错解释: 这个错误表明在Docker容器中尝试执行ip addr命令时,找不到ip命令。这通常意味着iproute2包没有在容器的Linux发行版中安装或者没有正确地设置在容器的环境变量PA…...

全开源TikTok跨境商城源码/TikTok内嵌商城/前端uniapp+后端+搭建教程

多语言跨境电商外贸商城 TikTok内嵌商城,商家入驻一键铺货一键提货 全开源完美运营 海外版抖音TikTok商城系统源码,TikToK内嵌商城,跨境商城系统源码 接在tiktok里面的商城。tiktok内嵌,也可单独分开出来当独立站运营 二十一种…...

云原生、Serverless、微服务概念

云原生(Cloud Native) 云原生是一种设计和构建应用程序的方法,旨在充分利用云计算的优势。云原生应用程序通常具有以下特征: 容器化:应用程序和其依赖项被打包在容器中,确保一致的运行环境。常用的容器技…...

Windows上LabVIEW编译生成可执行程序

LabVIEW项目浏览器(Project Explorer)中的"Build Specifications"就是用来配置项目发布方法的。在"Build Specifications"右键菜单中选取"New",可以看到程序有几种不同的发布方法:Application(EXE)、Installer、.Net Inte…...

ref 和 reactive 区别

在Vue 3中,ref和reactive都是用于创建响应式数据的API,但它们之间存在一些关键的区别。以下是ref和reactive的主要区别: 1. 数据类型处理 ref:主要用于定义基本类型的数据(如字符串、数字、布尔值等)以及…...

深度学习计算机视觉中, 多尺度特征和上下文特征的区别是?

在深度学习和计算机视觉中,多尺度特征和上下文特征都是用来捕捉和理解图像中复杂模式和关系的重要概念,但它们的侧重点有所不同。 多尺度特征 (Multi-scale Features) 多尺度特征是指在不同尺度上对图像进行特征提取,以捕捉不同尺度的物体特…...

Facebook未来展望:数字社交平台的进化之路

在信息技术日新月异的时代,社交媒体平台不仅是人们交流沟通的重要工具,更是推动社会进步和变革的重要力量。作为全球最大的社交媒体平台之一,Facebook在过去十多年里,不断创新和发展,改变了数十亿用户的社交方式。展望…...

uniapp-vue3-vite 搭建小程序、H5 项目模板

uniapp-vue3-vite 搭建小程序、H5 项目模板 特色准备拉取默认UniApp模板安装依赖启动项目测试结果 配置自动化导入安装依赖在vite.config.js中配置 引入 prerttier eslint stylelint.editorconfig.prettierrc.cjs.eslintrc.cjs.stylelintrc.cjs 引入 husky lint-staged com…...

sealos快速安装k8s

Sealos 提供一套强大的工具,使得用户可以便利地管理整个集群的生命周期。 功能介绍 使用 Sealos,您可以安装一个不包含任何组件的裸 Kubernetes 集群。此外,Sealos 还可以在 Kubernetes 之上,通过集群镜像能力组装各种上层分布式…...

智慧水利:迈向水资源管理的新时代,结合物联网、云计算等先进技术,阐述智慧水利解决方案在提升水灾害防控能力、优化水资源配置中的关键作用

本文关键词:智慧水利、智慧水利工程、智慧水利发展前景、智慧水利技术、智慧水利信息化系统、智慧水利解决方案、数字水利和智慧水利、数字水利工程、数字水利建设、数字水利概念、人水和协、智慧水库、智慧水库管理平台、智慧水库建设方案、智慧水库解决方案、智慧…...

MATLAB——字符串处理

文章目录 MATLAB——字符串处理字符串处理函数字符串或字符串数组构造 MATLAB——字符串处理 字符串处理函数 MATLAB中的字符串处理函数如下: 函数名称说明eval(string)作为一个MATLAb命令求字符串的值blanks(n)返回一个具有n个空格的字符串deblank去掉字符串末尾…...

Qt实现一个简单的视频播放器

目录 1 工程配置 1.1 创建新工程 1.2 ui界面配置 1.3 .pro配置 2 代码 2.1 main.c代码 2.2 widget.c 2.3 widget.h 本文主要记述了如何使用Qt编写一个简单的视频播放器,整个示例采用Qt自带组件就可以完成。可以实现视频的播放和暂停等功能。 1 工程配置 1.…...

PHP和Node.js哪个更爽?

先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

pam_env.so模块配置解析

在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...