ONNX模型利用CUDA加速如何正确配置好环境?

news2024/11/29 11:25:21

目前onnx可选的执行引擎非常多,覆盖了从cpu、gpu到npu,从Intel平台到AMD平台等。如下是onnxruntime所有的执行引擎。

['TensorrtExecutionProvider', 'CUDAExecutionProvider', 'MIGraphXExecutionProvider', 'ROCMExecutionProvider', 'OpenVINOExecutionProvider', 'DnnlExecutionProvider', 'TvmExecutionProvider', 'VitisAIExecutionProvider', 'QNNExecutionProvider', 'NnapiExecutionProvider', 'JsExecutionProvider', 'CoreMLExecutionProvider', 'ArmNNExecutionProvider', 'ACLExecutionProvider', 'DmlExecutionProvider', 'RknpuExecutionProvider', 'WebNNExecutionProvider', 'XnnpackExecutionProvider', 'CANNExecutionProvider', 'AzureExecutionProvider', 'CPUExecutionProvider']

我们最熟悉的执行引擎莫过于 CPUExecutionProvider了,所有的计算设备(电脑、计算盒子等)可以没有显卡、NPU等,但一定得有CPU,因此无论你的模型是用Pytorch训练的又或者是Tensorflow、MXNET、PaddlePaddle训练的,也不论你的模型网络结构是怎样的,又或者你的模型是部署在什么样的硬件环境下,我们总可以把pytorch等深度学习框架训练得到的模型转化为ONNX中间态,然后利用ONNX模型进行推理,并把ONNX迁移到任意设备上。要知道就拿Pytorch深度学习框架来说,不是所有的计算设备拥有的硬件环境可以满足安装Pytorch的,在个人笔记本上安装Pytorch或许很简单,但是在手机上或者算力更低的边缘计算设备上是安装不了Pytorch的,但是并不代表在手机上或者边缘计算设备上跑不了Pytorch训练的模型。这种情况下,ONNX就发挥了巨大作用。

但是总是用CPU推理ONNX模型往往速度不佳,难易达到低延迟、高吞吐。如果计算设备上有额外计算硬件加持并且ONNX支持该硬件那就更好了。

OK,言归正传,今天来聊一聊,在onnxruntime python api的情况下,如何正确配置好环境,让ONNX模型在拥有英伟达显卡的计算设备上进行深度加速。

在N卡上进行加速,首先,需要的硬件环境就是电脑上得有英伟达显卡,其实电脑上安装好了英伟达显卡驱动,没有安装好驱动的小伙伴可以查看这篇文章。之后就是安装CUDA工具包了,最后是下载onnxruntime-gpu依赖。

要理解用英伟达显卡加速ONNX模型,不是用onnxruntime而是onnxruntime-gpu,onnxruntime是CPU执行引擎,它没有CUDA、Tensorrt执行引擎,即使你手动指定了CUDA、Tensorrt执行引擎也没有用的。要下载onnxruntime-gpu并且手动指定执行引擎为TensorrtExecutionProvider'或者'CUDAExecutionProvider',你不指定,那么即使你下载了onnxruntime-gpu,也配置好了对应版本的CUDA,那么此时还是CPU推理,因为不论是onnxruntime还是onnxruntime-gpu,不指定执行引擎,都默认采用CPU执行引擎。其次,这两个包不能共存,下载onnxruntime-gpu之前要删除干净onnxruntime。onnxruntime的python 导包方式是

import onnxruntime

onnxruntime-gpu的python 导包方式也是

import onnxruntime

因此如果两个包共存,有时候导入的是onnxruntime,而有时候导入的是onnxruntime-gpu,会产生非常奇怪的bug 。

这里最容易犯错的地方就是安装CUDA。

经常会有小伙伴遇到:本地电脑下载安装、配置好了CUDA,也删除了onnxruntime,重新下载了onnxruntime-gpu,项目代码中的onnxruntime执行引擎也手动指定了'TensorrtExecutionProvider'或者 'CUDAExecutionProvider',为什么就是不走GPU推理,反而还是CPU?又或者遇到了:ONNX GPU推理反而比CPU还要慢的情况。这里就属于典型的CUDA版本跟onnxruntime-gpu版本不匹配。

以CUDACUDAExecutionProvider为例,官方明确指出了在推理的时候,onnxruntime-gpu的版本要跟CUDA、CuDnn版本匹配

NVIDIA - CUDA | onnxruntime

但是,就拿本人的多次onnx项目部署实践经历来说,有时候这些版本并不是严格完全对应的,上面的表格版本对应关系也是官方自己测试的,应该并不是面面俱到。例如官方测试的onnxruntime-gpu版本1.15 1.16 1.17可以对应CUDA11.6 CUDA 11.7 CUDA11.8; CuDnn版本8.2.4到8.9.0 

但是我测试过onnxruntime-gpu 1.16指定CUDAExecutionProvider引擎在不安装Cudnn,CUDA为11.4 11.7 11.8 12.4都可以进行加速 。但是我也有不少翻车的经历,有时候没注意CUDA跟onnxruntime-gpu的版本对应关系,ONNX项目不走GPU推理;项目走GPU推理反而比CPU还慢;项目走了GPU推理但是时快时慢,慢的时候比CPU还慢。这些情况我都遇到过,但是把版本对应起来之后,总能解决上面的问题。因此上面的版本对应关系还是非常具有参考意义的。

同时还要注意我们直接通过pip安装的onnxruntime-gpu都是官方实现帮我们编译好的,比如截止到2024.6.28,官方提供的onnxruntime-gpu 1.18 和 1.17都是在CUDA11.8环境下通过源码编译得到wheel包的,官方提示:CUDA11.8编译得到的onnxruntime在推理时可以兼容CUDA11.x,但是不能兼容CUDA12.x。但是本人通过pip安装的onnxruntime-1.16(虽然不知道是哪个版本CUDA编译而来的)在CUDA 11.4 11.7 11.8 12.4都可以进行加速

 

但是最正确的方式还是通过onnxruntime-gpu源码在本地用自己的CUDA编译出onnxruntime-gpu,但是编译过程繁琐而且不保证成功,我们大多数都是直接pip安装onnxruntime-gpu的wheel,但是此时务必注意版本对应关系。

那么问题来了,假如我的电脑全局安装了CUDA11.3,但是用CUDA11.3不能对onnx进行CUDA加速,需要重新安装CUDA吗?其实完全没有必要,我们完全可以利用anaconda在虚拟环境中安装指定版本的CUDA以适配onnxruntime-gpu,即本地环境多版本CUDA共存,可以参考本人的这篇文章

同理,执行引擎为 TensorrtExecutionProvider,onnxruntime也需要跟CUDA、Tensorrt版本匹配。NVIDIA - TensorRT | onnxruntime

指定引擎为TensorrtExecutionProvider需要在本地事先安装好Tensorrt,据我观察在推理的时候,是现场将onnx转Tensorrt的,但是模型不保存本地而是保存在内存中了,程序启动开始转换,程序结束Tensorrt模型销毁,并且这个转化的过程还很长,几十秒到几分钟不等,所以这就造成了一个问题,假如我写了一个脚本让模型推理一张图片,每次推理都需要重新执行这个脚本,那么模型转化的过程就包含在内了,此时表面上看时间很长,但实际上时间都花在了转化模型上。但是如果将这个模型发布为flask服务,在启动服务之前将onnx推理代码所在的类提前初始化,等个几分钟,模型先转化过去,服务在启动,模型推理速度就正常了。

 

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

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

相关文章

电脑屏幕监控软件方案合集|六款屏幕监控软件让老板高枕无忧

今天,我们就来聊一聊市面上备受瞩目的几款电脑屏幕监控软件,并重点介绍其中的佼佼者——安企神软件及其强大监控功能。因为它们的存在,我们的老板才能坐筹帷幄,决胜千里。 电脑屏幕监控软件大盘点 1.安企神软件:作为国…

Linux登录界面

Linux登录界面 1. 起因2. 脚本3. 效果 1. 起因 某次刷抖音看到一个博主展示了一个登录页面,觉得蛮好看的.于是自己动手也写一个 2. 脚本 编写脚本/usr/local/bin/login.sh #!/bin/bash Current_timedate %Y-%m-%d %H:%M:%S Versioncat /etc/redhat-release Kernel_Version…

Amazon OpenSearch Service 现在支持 JSON Web Token(JWT)身份验证和授权

最近,Amazon OpenSearch 推出了一个新功能,支持 JWT 认证和授权。虽然这个功能在开源的 OpenSearch 中早已存在,但在托管的 Amazon OpenSearch 中的实现一直不够理想。 此前的授权方式 控制台登录 内部数据库:使用基本的用户名…

同三维T908转换器 SDI转DVI/HDMI/VGA/色差分量/AV转换器

同三维T908转换器 SDI转DVI/HDMI/VGA/色差分量/AV转换器 1路SDI进,1路DVI(可转HDMI/VGA/色差分量/AV)3.5音频1路SDI出,可以支持音频解嵌,也可把3.5音频加嵌转换输出,输出分辨率可调,支持图像翻转180度 一、产品简介 SDI转万能转…

低代码+定制:优化项目管理的新方案

引言 在当今快速变化的商业环境中,企业需要更加灵活、高效的项目管理工具。低代码平台作为一种新的开发方式,因其能够快速构建应用程序而受到广泛关注。与此同时,软件定制开发仍然是满足特定复杂需求的重要手段。在项目管理中,低代…

以指标为中心,Aloudata 重塑企业数据生产力

6 月 25 日 - 6 月 26 日,第十届 CDIE 数字化创新博览会在上海张江科学会堂隆重举行。作为国内领先的自动化数据管理软件提供商,Aloudata 大应科技携自主研发的 Aloudata CAN 自动化指标平台亮相,全面展现了其独创的“NoETL”架构理念&#x…

谁用谁夸,为什么BI零售数据分析方案这么受欢迎?

在当今数字化时代,零售行业竞争激烈,如何快速准确地获取数据洞察,成为企业制胜的关键。奥威BI零售数据分析方案,凭借其全面、高效、智能的特点,赢得了广大零售企业的青睐,成为市场上的热门选择。 奥威BI零…

如何修复Power BI【View usage metrics report】指标报表数据源更新问题?

故事背景 有朋友留言询问:通过我之前写的 想知道Power BI用户访问报告的次数?快来学习! 这篇文章,了解了如何查看Power BI用户访问报告的详情。 但是最近由于创建【View usage metrics report】指标报表的小伙伴离职了&#x…

安装CLion配置opencv和torch环境

配置操作如图,源码见底部附录部分 安装CLion 官网下载 创建项目 设置环境 调整类型为release 配置opencv和项目 编译环境 编译后 重启CLion 测试opencv环境 测试代码 运行main.cpp显示图片 测试torch环境 没标红表示配置成功 附件 CMakeList.txt cmake_mi…

uniapp获取证书秘钥、Android App备案获取公钥、签名MD5值

一、 uniapp获取证书秘钥 打开uniapp开发者中心下载证书打开cmd输入以下这段代码,下载提供查看到的密钥证书密码就可以了!下载证书在 java 环境下运行才可以 // your_alias 换成 证书详情中的别名,your_keystore.keystore 改成自己的证书文件…

【scrapy】3.XPath解析

目录 一、XPath介绍 1.基本介绍 2.HTML树状结构图 3.节点之间的关系 (1)Xpath中的绝对路径与相对路径 二、XPath的语法介绍 1.元素属性定位 1.1 根据属性名定位元素: 1.2 根据属性名和属性值定位元素: 1.3 根据部分属性…

Python安装库太慢?配置好这个速度立马提上来

Python 的 pip 包管理器在安装库时可能会因为各种原因而显得很慢。以下是一些可能的原因以及相应的解决方案: 网络问题: 你的网络连接可能不稳定或速度较慢。Python 的官方 PyPI (Python Package Index) 服务器可能距离你较远,导致传输延迟。…

【Qt】QMessageBox 各种对话框的默认显示效果

1. 函数原型 void about(QWidget *parent, const QString &title, const QString &text)void aboutQt(QWidget *parent, const QString &title QString())QMessageBox::StandardButton critical(QWidget *parent, const QString &title, const QString &…

数字信号处理实验一(离散信号及离散系统的MATLAB编程实现)

实验要求: 离散信号及离散系统的MATLAB编程实现(2学时) 要求: 编写一程序,输出一定长度(点数),具有一定幅度、(角)频率和初始相位的实(或复&…

【C++】动态内存管理new和delete

文章目录 一、C的内存管理方式二、new和delete的用法1.操作内置类型2.操作自定义内置类型 三、new和delete的底层实现1.operator new和operator delete函数2.new和delete的实现原理 四、定位new表达式五、malloc/free和new/delete的区别 一、C的内存管理方式 之前在C语言的动态…

超详细之IDEA上传项目到Gitee完整步骤

1. 注册gitee 账号密码,gitee官网地址:Gitee官网,注册完成后,登录。 2. 创建仓库,在主页左下角有新建按钮,点击新建后会进入到此页面填写仓库信息。 3. 创建完成后复制仓库地址 4. 打开IntelliJ IDEA新建或…

Docker 安装最新版本 Jenkins

目录 1、下载、启动容器、更新到最新版本 2、查看初始密码两种方式: 3、默认安装的部分未汉化,删除默认的汉化插件。重启容器,重新安装汉化插件 4、安装 Publish over SSH、docker-build-step 、Docker Commons 插件 5、配置服务器连接信…

Arduino - LED 矩阵

Arduino - LED 矩阵 Arduino - LED Matrix LED matrix display, also known as LED display, or dot matrix display, are wide-used. In this tutorial, we are going to learn: LED矩阵显示器,也称为LED显示器,或点阵显示器,应用广泛。在…

人大金仓×深信服:打造高性能、高可靠教育信创数据库一体机解决方案

信息技术应用创新是数字经济发展的关键支撑和重要基石,近年来,国家高度重视信息技术应用创新产业发展。教育行业作为我国人才培养的发动机,发展教育信创是保持信创创新力、是提升信创人才质量的重要举措、是保障信创产业可持续发展的关键环节…

做短视频赛道,云微客矩阵系统提醒这些雷区要避开!

90%的实体老板做抖音短视频都踩过雷区,那就是上来就真人出镜拍视频,要么自己上要么让员工上。但是我们大家试想下,企业做短视频是想借助平台流量找客户的,又不是来当网红的,拍剧情、想段子,无非就是浪费时间…