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

使用ONNX Runtime对模型进行推理

今天的深度学习可谓是十分热门,好像各行各业的人都会一点。而且特别是Hinton获得诺奖后,更是给深度学习添了一把火。星主深知大家可能在平时仅仅将模型训练好后就不会去理会它了,至于模型的部署,很多人都没有相关经验。由于我最近在做一个关于模型部署的项目,面对以往缺乏这方面的经验,感到有些苦恼。因此,我决定先将学习的一部分内容记录下来,以便总结经验,帮助自己和他人更好地理解和实践模型的部署过程。希望这些记录能够为后续的项目提供指导,也能为同样面临挑战的人们带来一些帮助。

1.onnx格式和ONNX Runtime框架介绍

1.1 onnx格式介绍

ONNX (Open Neural Network Exchange) 是一个开放的深度学习模型文件格式,旨在促进不同深度学习框架之间的互操作性。它提供了一种标准的方式来表示机器学习模型,使得模型可以在多个框架之间进行共享和迁移。以下是一些关于 ONNX 格式的重要特点:

  1. 跨平台兼容性: ONNX 支持多种深度学习框架,如 PyTorch、TensorFlow、Keras 等,开发者可以在训练模型后将其导出为 ONNX 格式,从而在其他框架中进行推理或部署。

  2. 标准化: ONNX 提供了一个统一的模型描述,定义了模型的结构、参数和输入输出等信息,使得不同工具和框架能够理解模型。

  3. 优化支持: ONNX 模型可以通过不同的工具进行优化,以提升推理性能。这些工具包括 ONNX Runtime、TensorRT 等。

  4. 丰富的操作集: ONNX 包含了大量的操作(operators),支持常见的神经网络结构,允许开发者构建多样化的模型。

1.2 ONNX Runtime框架介绍

ONNX Runtime 是微软开发的一个高性能的推理引擎,用于执行 ONNX 格式的模型。它专为高效推理而设计,支持多种硬件平台,包括 CPU、GPU 和其他加速器。以下是 ONNX Runtime 的一些关键特性:

  1. 高性能: ONNX Runtime 提供了优化的推理引擎,能够有效利用硬件资源,支持并行计算,以提升推理速度。

  2. 多平台支持: ONNX Runtime 可以在多种操作系统和设备上运行,包括 Windows、Linux 和 macOS,支持各种硬件架构。

  3. 丰富的优化选项: 提供了图优化、量化和剪枝等多种优化手段,帮助开发者在不同设备上达到最佳的推理性能。

  4. 易于集成: ONNX Runtime 提供了简单易用的 API,支持 Python、C++、C# 和 Java 等多种编程语言,方便开发者将其集成到现有应用中。

至于为什么要使用 ONNX 格式的模型文件和 ONNX Runtime 框架,我认为有以下两点:

  1. 跨框架的兼容性: 不同深度学习框架训练出的模型文件格式一般不同,这给模型的推理和部署带来了不便。比如,你用 TensorFlow 训练一个模型,并用 TensorFlow 进行推理,而我用 PyTorch 训练的模型也要用 PyTorch 进行推理。在这样的情况下,大家的交流和协作就会变得不太方便。因此,ONNX 提供了一种统一的文件格式(.onnx),允许开发者将模型导出为 ONNX 格式,从而在不同的框架之间共享和使用模型。

  2. 简化依赖和环境配置: 在推理时,模型往往依赖于特定的深度学习框架。例如,如果我使用 PyTorch 训练好一个模型,之后再用 PyTorch 写一个推理脚本,而其他人想要使用这个模型进行推理,他们就必须安装 PyTorch(而且目前 PyTorch 的安装包越来越大)和其他一些相关的依赖包。这不仅增加了环境配置的复杂性,也给使用者带来了不便。通过使用 .onnx 格式文件,大家可以统一使用 ONNX Runtime 进行推理,从而简化了环境配置,让每个人都能方便地进行模型推理,无论他们最初使用的是哪个框架。这样一来,大家都能轻松实现模型的共享和使用,实现更高效的协作。这毕竟是你好,我好,他也好的好事。

2.库的安装

ONNX Runtime的Github地址:

GitHub - microsoft/onnxruntime: ONNX Runtime: cross-platform, high performance ML inferencing and training accelerator

要安装的库如下:

pip install onnx
pip install onnxruntime  # 这个和下面的二选一安装即可
pip install onnxruntime-gpu

安装 ONNX Runtime 时,是否需要安装 GPU 版本取决于你的具体需求。如果你希望利用 GPU 加速推理,以提高模型的执行速度,那么安装 GPU 版本是合适的选择。否则,CPU 版本已经足够满足大多数推理任务。

下面将介绍如何使用 Python 版本的 API 进行推理。同时,ONNX Runtime 也提供了 C++ 版本的 API,使用起来同样方便。对于 C++ 版本,用户不必进行复杂的安装,只需从 GitHub 下载编译好的版本,然后配置相关路径即可开始使用。这种方式不仅简化了安装过程,而且编译好的版本大小仅约 100 多 MB,相信大多数人都能接受。

注意:ONNX Runtime框架要与自己电脑中的CUDA版本相对应,否则会报错,下面是一个有些过时的参考:ONNXRuntime与CUDA版本对应_onnxruntime版本对应-CSDN博客

3.推理

使用ONNX Runtime框架进行推理的流程如下:

  1. 将模型导出为.onnx格式
  2. 检查导出的文件是否合法
  3. 配置一些日志、优化器、线程、运行设备等信息
  4. 将3中的配置应用到会话中
  5. 推理并对结果数据进行处理,得到自己想要的形式

3.1将.pth格式的模型导出为.onnx格式的模型

import torch
import onnxmodel = AlexNet(num_classes=5)
# 加载训练好的权重
model.load_state_dict(torch.load('AlexNet.pth'))
# 模型推理模式
model.eval()
model.cpu()# 定义一个输入
dummy_input = torch.randn(1, 3, 224, 224)   # 1张3通道224x224的图片# 将PyTorch模型转换为ONNX模型
torch.onnx.export(model,dummy_input,"AlexNet1.onnx",         # 保存的ONNX模型路径和文件名verbose=True,input_names=['input'],  # 输入名output_names=['output'],  # 输出名dynamic_axes={'input': {0: 'batch_size'}, 'output': {0: 'batch_size'}},        # 动态调整batch_sizeopset_version=11)  # 导出的onnx版本,这个要与ONNX Runtime框架兼容,否则会报错

上面这段代码中的AlexNet模型可以参考这位博主:【图像分类】【深度学习】【Pytorch版本】AlexNet模型算法详解_alexnet pytorch-CSDN博客

AlexNet.pth模型文件和ONNX Runtime相关参数配置在这篇博客里:【深度学习】【OnnxRuntime】【Python】模型转化、环境搭建以及模型部署的详细教程_onnxruntime python-CSDN博客

3.2检查并可视化.onnx模型

import onnx
# 加载ONNX模型
onnx_model = onnx.load("AlexNet1.onnx")
onnx.checker.check_model(onnx_model)  # 检查ONNX模型是否合法
print(onnx.helper.printable_graph(onnx_model.graph))  # 打印ONNX模型结构

若导出的模型不正确,则上述代码会报错。上述代码运行结果如下:

使用netron可视化我们导出的onnx格式的模型,netron网址:Netron,可视化结果如下,主要观察输入和输出的名称和形状。

3.3 推理

为了规范化我们写代码的习惯,我们将类别名称写入了flower_classes.txt文件中,如下:

代码如下:

import numpy as np
import cv2
import onnxruntime as ort# 加载标签
class_names = []
with open('./flower_classes.txt', 'r') as f:for line in f:name = line.strip()class_names.append(name)print("类别名称:",class_names)
# onnx模型路径
onnx_model_path ='./AlexNet1.onnx'# 配置一些环境,如日志,优化器,线程等等
session_options = ort.SessionOptions()
session_options.log_severity_level = 3
session_options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_BASIC
session_options.intra_op_num_threads = 4
# 设置运行设备,列表中的顺序表示优先级
providers = ['CUDAExecutionProvider', 'CPUExecutionProvider']# 将上述配置应用到ONNX Runtime的session中
ort_session = ort.InferenceSession(onnx_model_path, sess_options=session_options, providers=providers)# 获取输入名
input_name = ort_session.get_inputs()[0].name
print("输入名:",input_name)
print("输入形状:",ort_session.get_inputs()[0].shape)input_h, input_w = ort_session.get_inputs()[0].shape[2:]# 获取输出名
output_name = ort_session.get_outputs()[0].name# 读取图片并进行预处理
image_path = './sunflower.jpg'
image = cv2.imread(image_path)
img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (input_h, input_w))
img = img.astype(np.float32)
img /= 255.0
mean = np.array([0.485, 0.456, 0.406], dtype=np.float32)
std = np.array([0.229, 0.224, 0.225], dtype=np.float32)
img = (img - mean) / std
img = np.transpose(img, (2, 0, 1))
img = np.expand_dims(img, axis=0)        # 形成一个batch# 进行推理
result = ort_session.run(output_names=[output_name], input_feed={input_name: img})
print(result)# 获取预测结果
probabilities = result[0][0]
print("预测概率:", probabilities)
predicted_class = np.argmax(probabilities)
print("预测结果:", class_names[predicted_class])# 在图片上绘制预测结果
cv2.putText(image, f'{class_names[predicted_class]}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下:

目前,由于该项目星主正在努力赶工,所以这里只介绍了一些Python版本的API,C++版本等以后有机会再分享。具体一些ONNX Runtime中的参数见上面的参考链接。

相关文章:

使用ONNX Runtime对模型进行推理

今天的深度学习可谓是十分热门,好像各行各业的人都会一点。而且特别是Hinton获得诺奖后,更是给深度学习添了一把火。星主深知大家可能在平时仅仅将模型训练好后就不会去理会它了,至于模型的部署,很多人都没有相关经验。由于我最近…...

五款pdf转换成word免费版,谁更胜一筹?

作为一名在都市丛林中奋斗的打工人,每天处理各种文件是家常便饭。尤其是PDF和Word文档之间的转换,简直是日常工作中不可或缺的一部分。今天,我就来和大家分享一下我使用过的几款PDF转Word免费版工具,看看它们的表现如何。 一、福…...

【C++】踏上C++学习之旅(四):细说“内联函数“的那些事

文章目录 前言1. "内联函数"被创造出来的意义2. 内联函数的概念2.1 内联函数在代码中的体现2.2 普通函数和内联函数的汇编代码 3. 内联函数的特性(重点)4. 总结 前言 本章来聊一聊C的创作者"本贾尼"大佬,为什么要创作出…...

SVN克隆或更新遇到Error: Checksum mismatch for xxx

文章目录 前言问题的产生探索解决方案正式的解决方法背后的故事总结 前言 TortoiseSVN 作为版本控制常用的工具,有一个更为人们熟知的名字 SVN,客观的讲SVN的门槛相比Git而言还是低一些的,用来存储一些文件并保留历史记录比较方便&#xff0…...

QT交互界面:实现按钮运行脚本程序

一.所需运行的脚本 本篇采用上一篇文章的脚本为运行对象,实现按钮运行脚本 上一篇文章:从0到1:QT项目在Linux下生成可以双击运用的程序(采用脚本)-CSDN博客 二.调用脚本的代码 widget.cpp中添加以下代码 #include &…...

驱动和芯片设计哪个难

驱动和芯片设计哪个难 芯片设计和驱动开发 芯片设计和驱动开发 都是具有挑战性的工作,它们各自有不同的难点和要求。 对于芯片设计,它是一个集高精尖于一体的复杂系统工程,涉及到从需求分析、前端设计、后端设计到流片的全过程。 芯片设计的…...

【云原生】云原生后端:监控与观察性

目录 引言一、监控的概念1.1 指标监控1.2 事件监控1.3 告警管理 二、观察性的定义三、实现监控与观察性的方法3.1 指标收集与监控3.2 日志管理3.3 性能分析 四、监控与观察性的最佳实践4.1 监控工具选择4.2 定期回顾与优化 结论参考资料 引言 在现代云原生架构中,监…...

在 ubuntu20.04 安装 docker

1、替换清华源 替换 sources.list 里面的内容 sudo vim /etc/apt/sources.list# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse # deb-src htt…...

前端开发设计模式——观察者模式

目录 一、定义和特点 1. 定义 2. 特点 二、实现方式 1. 使用 JavaScript 实现观察者模式的基本结构 2. 实际应用中的实现示例 三、使用场景 1. 事件处理 2. 数据绑定 3. 异步通信 4. 组件通信 四、优点 1. 解耦和灵活性 2. 实时响应和数据一致性 3. 提高代码的可…...

永磁同步电机高性能控制算法(17)——无差拍预测转速控制

1.前言 前期写了比较多的关于无差拍预测电流控制的东西。 https://zhuanlan.zhihu.com/p/659205719https://zhuanlan.zhihu.com/p/659205719 https://zhuanlan.zhihu.com/p/660266190https://zhuanlan.zhihu.com/p/660266190 https://zhuanlan.zhihu.com/p/719591343https://z…...

【GIT】Visual Studio 中 Git 界面中, 重置 和 还原

在 Visual Studio 的 Git 界面中,“重置” 和 “还原” 是两个常用的 Git 操作。它们的主要区别在于应用场景和影响范围。 1. 重置(Reset) 重置用于更改当前分支的提交历史,通常用于撤销或删除某些提交。重置操作可能会更改 Git…...

开源一款前后端分离的企业级网站内容管理系统,支持站群管理、多平台静态化,多语言、全文检索的源码

大家好,我是一颗甜苞谷,今天分享一款前后端分离的企业级网站内容管理系统,支持站群管理、多平台静态化,多语言、全文检索的源码。 前言 在当今的数字化时代,企业网站和个人博客已成为信息传播和品牌建设的重要渠道。…...

【electron+vue3】使用JustAuth实现第三方登录(前后端完整版)

实现过程 去第三方平台拿到client-id和client-secret,并配置一个能够外网访问回调地址redirect-uri供第三方服务回调搭建后端服务,引入justauth-spring-boot-starter直接在配置文件中定义好第一步的三个参数,并提供获取登录页面的接口和回调…...

Amcor 如何借助 Liquid UI 实现SAP PM可靠性

背景介绍 安姆科是塑料行业的全球领军企业,该企业认识到 SAP 工厂维护(SAP PM)对于确保高效的维护管理的重要性。 在诸如制造业等高度依赖机械设备的行业中,SAP PM是一种通过数据驱动决策来最大限度减少停机时间、降低间接成本、…...

【Redis】常见基本全局命令

一、Redis俩大核心命令 由于Redis是以键值对的形式进行数据存取,自然就离不开不断的存储和获取,而其所对应的命令则是set和get,如此说来二者为Redis的核心基础命令也不为过。 作用:用于存储Stirng类型的数据 返回:当…...

探索国际数据空间(IDS)架构(上)

在当今数字化时代,数据的重要性日益凸显,而国际数据空间(IDS)作为一个新兴的概念,正逐渐成为数据管理和共享的关键领域。今天,我们就来一起探索一下 IDS 的精妙架构。 参考文章:国际数据空间&am…...

如何选择好用的U盘数据恢复软件免费版?2024年热门榜单有哪些?

U盘是我们用来存数据的小玩意儿,又方便又好用。但是,有时候因为不小心删掉了、格式化了或者中病毒了,U盘里的东西就没了,这可让人头疼。好在有很多免费的U盘数据恢复软件能帮我们找回这些丢失的数据。那怎么挑一个好用的免费数据恢…...

音视频入门基础:AAC专题(12)——FFmpeg源码中,解码AudioSpecificConfig的实现

音视频入门基础:AAC专题系列文章: 音视频入门基础:AAC专题(1)——AAC官方文档下载 音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件 音视频入门基础:AAC…...

UDP组播测试

支持组播的接口: ip a | grep MULTICAST 环回接口虽然显示不支持组播,实际也可以用于本地测试。 添加路由(非必须?): ip route add 239.0.0.0/24 via 10.10.10.206 dev eth0 开放防火墙: 查…...

【Nas】X-Doc:jellyfin“该客户端与媒体不兼容,服务器未发送兼容的媒体格式”问题解决方案

【Nas】X-Doc:jellyfin“该客户端与媒体不兼容,服务器未发送兼容的媒体格式”问题解决方案 当使用Jellyfin播放视频时出现“该客户端与媒体不兼容,服务器未发送兼容的媒体格式”,这是与硬件解码和ffmpeg设置有关系,具体…...

504 Gateway Time-outopenresty

504 Gateway Time-out openresty 问题背景: 当自己点开知乎页面以后,发现官网没有出现任何问题,点击官网以后开始出现各种各样的报错! 一下是来源ai的介绍:(通过搜索这种形式帮助自己进行记忆)…...

SpringBoot篇(自动装配原理)

目录 一、自动装配机制 1. 简介 2. 自动装配主要依靠三个核心的关键技术 3. run()方法加载启动类 4. 注解SpringBootApplication包含了多个注解 4.1 SpringBootConfiguration 4.2 ComponentScan 4.3 EnableAutoConfiguration 5. SpringBootApplication一共做了三件事 …...

《Web性能权威指南》-WebRTC-读书笔记

本文是《Web性能权威指南》第四部分——WebRTC的读书笔记。 第一部分——网络技术概览,请参考网络技术概览; 第二部分——无线网络性能,请参考无线网络性能; 第三部分——HTTP,请参考HTTP; 第四部分——浏览…...

跨境电商独立站:打造你的全球品牌

什么是跨境电商独立站? 跨境电商独立站是指一个独立的电子商务网站,企业可以通过这个网站直接向全球消费者销售产品。与入驻亚马逊、eBay等第三方平台不同,独立站拥有完全自主权,可以自由定制店铺风格、营销策略,并直…...

基于uniapp微信小程序的旅游系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...

怿星科技薛春宇丨智能汽车软件研发工具链国产化的挑战和探索

2024年7月25日,由上海良益企业管理咨询有限公司主办的“2024域控制器技术论坛“在上海成功举办,十位嘉宾做了精彩分享。“整零有道”将陆续刊出部分演讲的文字实录,以飨读者。 本期刊出怿星科技副总经理薛春宇的演讲实录:智能汽车…...

Flutter动画渐变

User experience is everything. One way to improve it is by making transitions between different UI elements smoother and more visually appealing. This is where the AnimatedCrossFade widget comes in handy. 用户体验就是一切。改善用户体验的方法之一就是让不同…...

Python毕业设计选题:基于Web学生会网站的设计与实现-django

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 系统首页界面 用户注册界面 用户登录界面 校内报道界面 品牌活动界面 个人中心界面 …...

如何选购高性价比百元头戴式耳机?六大选购技巧加性价比耳机推荐

在日益繁忙的生活中,头戴式耳机已成为许多人享受音乐、放松心情的重要工具。然而,市面上的头戴式耳机种类繁多,价格各异,如何选购高性价比百元头戴式耳机?成为了许多消费者的难题。为了帮助大家更好地做出选择&#xf…...

Java爬虫的京东“寻宝记”:揭秘商品类目信息

开篇:Java特工的神秘任务 在这个数据驱动的时代,我们就像一群特工,穿梭在数字的海洋中,寻找着隐藏的宝藏——商品类目信息。今天,我们将带领你一起,用Java这把精密的瑞士军刀,深入京东的神秘领…...

优秀高端网站建设报价/atp最新排名

1.提升内聚性 2.降低耦合度 3.切分关注面 4.模块化系统性关注面 5.缩小类和函数的尺寸 6.选用更好的命名,缩减冗余的注释 转载于:https://www.cnblogs.com/DjangoBlog/p/5445309.html...

直播网站是怎么做的/东莞网络推广排名

1、什么是虚悬镜像? 构建和删除镜像时出现一些错误,导致仓库(REPOSITORY)和标签(TAG)都是NONE 2、自己写一个虚悬镜像 3、查看docker容器中存在的虚悬镜像 docker image ls -f danglingtrue4、删除docker…...

泰安网站建设制作服务/河南网站推广

Linux系统内核设置优化tcp网络,# vi /etc/sysctl.conf,添加以下内容 net.ipv4.tcp_syncookies 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭&a…...

网站后台权限管理怎么做的/百度网站推广排名优化

文章目录1. 安装2. 创建测试组3. 创建http请求4. 创建测试监听5. 测试1. 安装 下载 apache-jmeter-5.2.1,解压后,到apache-jmeter-5.2.1\bin目录下执行jmeter.bat 运行。 2. 创建测试组 在TestPlan 上右键,选择Add->Threads(Users)->…...

做网站要多少像素/做竞价托管的公司

大家都知道使用线程的2种方式,一是继承Thread类,二是实现Runnable接口。实际上,即使你实现了Runnable接口,终于还是要构造一个Thread类的对象。看过Thread源码发现,事实上这个Thread类也实现了Runnable接口&#xff0c…...

郑州网站推广哪家专业/一站式推广平台

1.基本知识: 1.1solr的安装 1.2solr的基本使用 1.3solrj的使用 2.solr 实现全文检索 索引流程:客户端---》solr 服务器(发送post请求,xml文档包含filed,solr实现对索引的维护) 搜索流程:客户端---》solr 服务器(发送get 请求&…...