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格式

python 复制代码
# 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的名称 (自己起名字)
    )

或者用我们自己的模型:

python 复制代码
# 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模型导出成功

python 复制代码
#验证模型导出成功
import onnx

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

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

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

python 复制代码
#以可读的形式打印计算图
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技术的普及和应用。

相关推荐
码蜂窝编程官方7 分钟前
【含开题报告+文档+PPT+源码】基于SSM的电影数据挖掘与分析可视化系统设计与实现
java·vue.js·人工智能·后端·spring·数据挖掘·maven
遗落凡尘的萤火-生信小白10 分钟前
转录组数据挖掘(生物技能树)(第11节)下游分析
人工智能·数据挖掘
XinZong19 分钟前
【OpenAI】获取OpenAI API Key的多种方式全攻略:从入门到精通,再到详解教程!
人工智能
友艺20 分钟前
CatBoost 模型实践:回归与分类的全流程解析
机器学习
没有余地 EliasJie20 分钟前
深度学习图像视觉 RKNN Toolkit2 部署 RK3588S边缘端 过程全记录
人工智能·嵌入式硬件·深度学习
亚图跨际27 分钟前
Python和R基因组及蛋白质组学和代谢组学
python·r语言·生物医学
fanyamin34 分钟前
编程语言的局限
开发语言·python
梦醒沉醉37 分钟前
神经网络的正则化(二)
深度学习·神经网络
努力更新中1 小时前
Python浪漫之随机绘制不同颜色的气球
开发语言·python
HelpLook HelpLook1 小时前
高新技术行业中的知识管理:关键性、挑战、策略及工具应用
人工智能·科技·aigc·客服·知识库搭建