当前位置: 首页 > 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技术的普及和应用。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 前端练习小项目——方向感应名片
  • Open-TeleVision——通过VR沉浸式感受人形机器人视野:兼备远程控制和深度感知能力
  • Base64文件流查看下载PDF方法-CSDN
  • python-矩阵加法(赛氪OJ)
  • BERT架构的深入解析
  • c# 依赖注入-服务的生命周期
  • 如何恢复电脑上删除的文件?快速恢复被删除文件的技巧【5个实用方法】
  • css的三大特性
  • MATLAB quiver矢量图 设置colorbar
  • R语言学习笔记6-数据框
  • 2024黑马AI+若依框架项目开发 个人心得、踩坑和bug记录 全网最快最全 基础功能认识篇
  • Redis的热key解决
  • Windows上LabVIEW编译生成可执行程序
  • 并发编程-07之CountDownLatch
  • 【简历】兰州某大学一本硕士:面试通过率基本是为0
  • 【刷算法】求1+2+3+...+n
  • Git的一些常用操作
  • Java Agent 学习笔记
  • java8-模拟hadoop
  • Javascript 原型链
  • js 实现textarea输入字数提示
  • Js基础知识(四) - js运行原理与机制
  • laravel 用artisan创建自己的模板
  • leetcode386. Lexicographical Numbers
  • php面试题 汇集2
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 从setTimeout-setInterval看JS线程
  • 和 || 运算
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 试着探索高并发下的系统架构面貌
  • 手机端车牌号码键盘的vue组件
  • 手写一个CommonJS打包工具(一)
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 微信支付JSAPI,实测!终极方案
  • 移动端解决方案学习记录
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #每日一题合集#牛客JZ23-JZ33
  • (0)Nginx 功能特性
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (arch)linux 转换文件编码格式
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (面试必看!)锁策略
  • (三)docker:Dockerfile构建容器运行jar包
  • (转)重识new
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .net 4.0发布后不能正常显示图片问题
  • .NET Framework杂记
  • .Net MVC4 上传大文件,并保存表单
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net wcf memory gates checking failed
  • .net 后台导出excel ,word