onnxruntime无法使用GPU加速 加速失败 解决方法【非常详细】

news/2024/9/18 5:13:20/文章来源:https://www.cnblogs.com/io-T-T/p/18304208

onnx 无法使用GPU加速 加速失败 解决方法【非常详细】

 

应该是自目前以来最详细的加速失败解决方法GPU加速,收集了各方的资料。引用资料见后文

硬件配置:

GPU CUDA版本:12.2

客户架构:window10

输入: nvcc --version 

image-20240715140604035

onnxruntime版本后文提供

1 先检测是否无法使用GPU加速

检测代码如下,记得把模型换成你模型的地址

import onnxruntime
print(onnxruntime.__version__)
print(onnxruntime.get_device() ) # 如果得到的输出结果是GPU,所以按理说是找到了GPU的
​
ort_session = onnxruntime.InferenceSession("your_onnx_module_path.onnx",
providers=['CUDAExecutionProvider'])
print(ort_session.get_providers())

explain:

  • 如果print(onnxruntime.version)输出成功,应该包就安装成功了

    • 如果没有,见后文的onnxruntime版本匹配

  • 如果print(onnxruntime.get_device() )输出成功的话,大概率是能够获取到你的gpu了

    • 如果没有获取成功的话,则参见后文的配置cudann

  • 如果print(ort_session.get_providers()),应该是没什么问题了

    • 如果有问题的话,有蛮多情况导致的,我遇到的一个情况与版本有关

2.1 版本匹配

我的报错问题就与版本匹配有关,其他全部都是正确的,且这个关系到onnxruntime的包安装,固直接放到2.1来说明,你的硬件版本很重要,我这个是解决cuda12的,如果是cuda11可能不一样,或者也能给你们提供一点灵感也不错。

  • 问题描述

    Snipaste_2024-07-15_11-55-21

    报错信息大致是:

    CreateExecutionProviderInstance CUDA_PATH is set but CUDA wasn't able to be loaded. Please install the correct version of CUDA andcuDNN as mentioned in the GPU requirements page

    翻译出来就是,CUDA_PATH 路径已经设置了,但是 CUDA 不能被读取【也就说理论上环境变量没问题】,但保险起见,各位也可以检查一下你们的环境变量(后文cudann安装说明)

  • 问题处理

    找到官方提供的onnxcuda官方文档

    image-20240715142123668

    当初没想到这里那么多坑

    • 坑1【直接pip安装onnxruntime-gpu】

      默认下载的是最新的且是针对11.8的版本,因此你直接pip install onnxruntime-gpu实际上安装的版本是onnxruntime-gpu=1.18[ 即最新版 ,而且默认是cuda11的]

    • 坑2【使用官方提供的ort但不指定版本】:

      • 点进去官方的对12.x的指示

      image-20240715142644203

      • 使用官方的命令也会留有后患,因为官方确实是对12.x进行适配了,但默认还是version--1.18,适配cuda12.4,但!他不向下兼容版本,就是说你可能cuda版本12.2,安装了最新的1.18 ,CUDA版本的12.4就不能使用了,因此需要在安装的时候添加你cuda版本对应的ORT的版本

      pip install onnxruntime-gpu==what_you_want_version --extra-index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-12/pypi/simple/
      • what_you_want_version换成你需要的版本,对应上图。

      • 问题解决了,程序有输出了

  • 总结,如果没有遇到上述问题或者cuda版本不是12.x的,也可以对应图片通过pip安装即可,cuda12.x的话就要注意多一点,以免踩坑

2.2 安装cuda nn失败、缺失dll

可以参考这位博主的心路历程:

为什么在使用onnxruntime-gpu下却没有成功调用GPU?

在linux系统上可以参考这位博主:

onnxruntime使用gpu推理

大致需要排查的是:

  1. 是否已经安装cuda

  2. 是否已经将cudaNN对应的库放入cuda的文件中

  3. cudaNN版本与cuda版本是否匹配

    image-20240715144252361

    记得你的cudaNN版本要与ORT【onnxruntime版本匹配】

    image-20240715144346184

    按照那位博主或者其他博主的教程安装好对应cudaNN就好,90%的用户都是这个模块出问题了

    1. 检查你的cuda、cudaNN是否设置环境变量成功

    image-20240715144622853

    image-20240715144652275

    在你开发的虚拟环境中运行如下命令查看ORT需要设置的环境变量是否成功设置【默认应该是ok的】

    set CUDA_PATH

    正常输出如下图所示:

    image-20240715144851168

    如果没有怎么办?去环境变量里面设置即可

    image-20240715145008112

    如果没有的话,按照我这个变量新建即可,地址根据自己安装cuda地址填【因为我的cudaNn是嵌入进去的 ,公用一个文件夹】

3 疑难杂症

如果上述两个都解决不了你的问题,那确实是少有的疑难杂症了,我抛砖引玉一下吧,但我不是通过这个思路解决的

  • 来源于ORT的官方issue:Windows CUDA_PATH 已设置,但 CUDA 无法载入

    其中有这样一段话让我围绕了这个思路进行思考:

    • “The D:\ part just points to the source file on a build box, so it had nothing to do with your machine. You might want to check if those CUDA folders are present in the PATH of your Conda environment. Easy way to check is to use where command in CMD.”

    • 大意就是:第一是检查一下cuda在不在环境变量PATH中,有没有可能在conda环境中无法访问到PATH的路径

    • 但这个毕竟不是我解决的方法,如果上面两个问题都无法解决,无妨去看看issue

4 参考资料

ONNX官方文档1

CUDAnn下载官网

官方issue

鸣谢:为什么在使用onnxruntime-gpu下却没有成功调用GPU?,这位大佬的分享让我初期解决这个问题的时候有了一定参考

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jsAPIS-DomEvent

APIs 申明变量const优先 对于变量申明,常见的申明方式包括:var、let、conts。由于var老旧,我们避免使用和var进行变量声明。 那么在定义变量时如何判断使用let还是const? 对于常量(后续不会改变)变量,使用const进行申明。对于会发生变化的变量,使用let进行声明。常见情…

泰山派学习14--pinctr、gpio子系统控制设备树LED

1、在泰山派设备树的/根节点上添加zbl_led子节点(路径:Z:\sdk\linux\kernel\arch\arm64\boot\dts\rockchip)打开tspi-rk3566-user-v10-linux.dts设备树源文件在根目录下添加gpioled子节点2、在SDK上编译kernel(./build.sh kernel)执行内核编译:./build.sh kernel内核编译…

JavaScript全解析——本地存储✔(localStorage~sessionStorage~cookie)

●就是浏览器给我们提供的可以让我们在浏览器上保存一些数据●常用的本地存储(localStorage~sessionStorage~cookie)1-localStorage => 特点:-> 长期存储,除非手动删除否则会一直保存在浏览器中 清除缓存或者卸载浏览器也就没有了-> 可以跨页面通讯, 也就是说在一个…

三种交换方式的比较

一、互联网的核心部分 网络核心部分是互联网中最复杂的部分。 网络中的核心部分要向周围网络边缘的大量主机提供连通性,使边缘部分任何一个主机都能够向其他主机通信。 在网络核心部分起特殊作用的是路由器。 路由器是实现分组交换的关键构件,其任务是转发收到的分组,这是网…

gateway 使用细节

spring:cloud:gateway:routes:- id: test_my_provider # 自定义,全局唯一即可uri: http://localhost:8081 # 实际调用的地址predicates:- Path=/test/** # 请求匹配规则- id: test_my_consumeruri: http://localhost:8082predicates:- Path=/feign/**上一篇文章 gateway 快速入…

长链剖分笔记

与轻重链剖分相似. dfs1:高度 \(h\)、\(son\);dfs2:\(top\). 性质 1:到根最多 \(O(\sqrt n)\) 条轻边. (证明:长链长度最坏情况:1, 2, 3...) 性质 2:\(x\) 的 \(k\) 级祖先 \(y\) 所在的长链长度 \(\ge k\).(证明:若非,则 \(y-x\) 是一条更长的链,矛盾.) 树上 \(…

【漏洞分析】DoughFina 攻击事件分析:不做任何参数检查的去杠杆合约

背景介绍 2024 年 7 月 12 日,DoughFina 协议遭受了黑客攻击,造成本次攻击的主要原因是 ConnectorDeleverageParaswap 合约没有对输入参数进行检查,且该合约为 DSA 合约的 owner。攻击者可以构造恶意参数窃取 DSA 合约的资金。 攻击交易 https://app.blocksec.com/explorer/…

SpringCloud启动报错Did you forget to include spring-cloud-starter-loadbalancer?

当我在gateway项目中添加了feign依赖时,报错:   原因:因为在springcloudFeign在Hoxton.M2 RELEASED版本之后就不再使用Ribbon而是使用spring-cloud-loadbalancer,所以不引入spring-cloud-loadbalancer会报错解决办法:引入依赖即可1 <dependency> 2 …

圆方树

一些概念 割点:无向图中,若删除点x及其连边,连通块变多,那么x为割点。 点双连通:若点对x和y,删除任意非x和非y节点后,x和y仍然联通,称x和y点双连通。 点双联通子图:无向图中的一个子图G,G中任意两点都是点双连通的,那么G为原图的一个点双连通子图。 点双联通分量:无…

链表引用——约瑟夫问题

约瑟夫问题Josephu问题为:设编号为1,2,...n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。提示:用一个不带头结点的循环…

LogRotate 切割 Nginx 日志

发布于 2023-12-04 10:20:327140举报文章被收录于专栏:码农UP2U一直以来做日志切割都是使用 shell + crontab 来搞,shell 脚本可以在网上找到各种版本的,改改就用了,懒省事。这样的做法很传统,却忽略了系统的给我们提供的优秀的工具 —— logrotate。 一、Logrotate 是什么…

SQL Server中Upsert的三种方式(转载)

本文介绍了SQL Server中Upsert的三种常见写法以及他们的性能比较。SQL Server并不支持原生的Upsert语句,通常使用组合语句实现upsert功能。假设有表table_A,各字段如下所示:int型Id为主键。方法1:先查询,根据查询结果判断使用insert或者updateIF EXISTS (SELECT 1 FROM ta…