20240105,记。

最近在使用GPU对onnx模型进行加速过程中(仅针对N卡,毕竟也没有别的显卡了。。),遇到了点问题:就是明明在安装了合适版本的显卡驱动和CUDA后,onnx还是不能够成功调用GPU,并且还出现了先导入torch,再导入onnxruntime就可以成功调用的奇怪现象。

测试机器:Windows10,RTX 3070,onnxruntime-gpu==1.16.1,显卡驱动:522,CUDA11.8

问题展示:

onnxruntime.InferenceSession(ckpt, providers=['CUDAExecutionProvider'])
2024-01-05 10:44:22.7798928 [W:onnxruntime:Default, onnxruntime_pybind_state.cc:743 onnxruntime::python::CreateExecutionProviderInstance] Failed to create CUDAExecutionProvider. Please reference https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#requirements to ensure all dependencies are met.

在onnxruntime版本与CUDA等版本均对应,但却出现上面的警告信息,且没有查看到GPU调用。

下意识的会考虑是不是onnxruntime压根没找到GPU,所以尝试了下面的代码:

import onnxruntime
onnxruntime.get_device() # 得到的输出结果是GPU,所以按理说是找到了GPU的

解决之路:

自然是找issue是找官方仓库的issue是最靠谱的了,参考链接:https://github.com/microsoft/onnxruntime/issues/11092

看完后真的给了我一种顿悟感,而且竟然还与torch莫名地产生了联系,一开始有大佬给出的解决方法是先import torchimport onnxruntime,但这个方法就很奇怪,我使用了onnx,自然是不想再引入torch这个包,而且torch还很大,没有解决根本问题。

之后有一个佬给出的回答才让我明白过来:

我去查看了自己的torch的lib目录,发现下面确实有cudnn相关的动态链接库,但是去cuda的目录下(C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8),却并没有发现相关的库,也就是说,平常我们安装好cuda就可以用torch了,是因为torch自带了cudnn,即使我们没有安装cudnn,也能够去使用(cuda属于是框架,cudnn是属于软件层面的加速库)。

但onnxruntime不一样,它并没有自带cudnn,所以是需要自己去加cudnn添加进cuda的对应目录下的,具体可参考cudnn的安装教程,还有官方教程写的也是比较清晰的:Installation Guide - NVIDIA Docs

主要是解压下载的压缩包,复制cudnn的文件到cuda目录,以及添加环境变量,不过之前安装CUDA的时候应该已经默认添加过环境变量了。

完成这一步后,重新尝试了执行onnx推理,但却碰到了另一个问题:

Could not locate zlibwapi.dll. Please make sure it is in your library path!

重新查找后,根据 解决Could not locate zlibwapi.dll. Please make sure it is in your library path! - 知乎 (zhihu.com) 给出的回答,NVIDIA官网已不再提供zlibwapi.dll的下载,重新去换了最新版本的cuDNN,目前每个版本又分为与cuda对应的11.x和12.x的版本。版本对应可参考:Support Matrix - NVIDIA Docs

至此就解决了我碰到的onnxruntime无法在GPU推理的问题,关键点还是在于按照以往torch使用的思路,以为安装了驱动和CUDA就可以了(或者说下意识以为cuDNN就已经一起安装好了,但其实并没有),但还需要添加cuDNN库,因为torch自带了,而onnxruntime没有自带

为什么在使用onnxruntime-gpu下却没有成功调用GPU?的更多相关文章

  1. 71 mac boook pro 无 gpu 下caffe 安装

    71 mac boook pro 无 gpu 下caffe 安装 1.首先安装homebrew工具,相当于Mac下的yum或apt ruby -e "$(curl -fsSL https:/ ...

  2. Ubuntu安装opencv 为调用gpu模块

    也真够折腾的. 事件背景:为了一个光流的提取处理,本来是3.1的opencv在include一些模块上出错,原因是opencv3.0以上的版本对模块进行了再分离,要contribute,但是contr ...

  3. 苹果手机Safari无痕浏览模式下系统登录成功但是页面不跳转

    昨天下午,测试提了一个bug,问题是:在苹果手机Safari无痕浏览模式下系统登录成功但是页面不跳转. 思前想后找了半天没思路,后来经过同事的点拨,说可能是禁用了cookie之类的,反正我也没思路就顺 ...

  4. windows7下php5.4成功安装imageMagick,及解决php imagick常见错误问题。(phpinfo中显示不出来是因为:1.imagick软件本身、php本身、php扩展三方版本要一致,2.需要把CORE_RL_*.dll多个文件放到/php/目录下面)

    windows7下   php5.4成功安装imageMagick . (phpinfo中显示不出来是因为:1.软件本身.php本身.php扩展三方版本要一致,2.需要把CORE_RL_*.dll多个 ...

  5. iOS下的 Fixed + Input 调用键盘的时候fixed无效问题解决方案

    做touchweb开发的时候,做头疼的是,电脑上面时候好的,有些手机上面也是好的,个别手机和浏览器出现问题,对于这些,只能慢慢调试,找问题. 今天说一下比较老的IOS的问题,那就是"iOS下 ...

  6. bugzilla4的xmlrpc接口api调用实现分享: xmlrpc + https + cookies + httpclient +bugzilla + java实现加密通信下的xmlrpc接口调用并解决登陆保持会话功能

    xmlrpc .  https . cookies . httpclient.bugzilla . java实现加密通信下的xmlrpc接口调用并解决登陆保持会话功能,网上针对bugzilla的实现很 ...

  7. 联想电脑win7旗舰版环境下的如何成功配置AppServ

    联想电脑win7旗舰版环境下的如何成功配置AppServ 毕业设计中需要用Mysql数据库,并且想找一个方便Mysql数据库编程的开发工具,百度搜索了一下,AppServ集成环境安装包能快速搭建环境. ...

  8. socket异步通信-如何设置成非阻塞模式、非阻塞模式下判断connect成功(失败)、判断recv/recvfrom成功(失败)、判断send/sendto

    socket异步通信-如何设置成非阻塞模式.非阻塞模式下判断connect成功(失败).判断recv/recvfrom成功(失败).判断send/sendto 博客分类: Linux Socket s ...

  9. 解析android framework下利用app_process来调用java写的命令及示例

    解析android framework下利用app_process来调用java写的命令及示例 在android SDK的framework/base/cmds目录下了,有不少目录,这些目的最终都是b ...

  10. 为什么目前无法再docker for windows中调用GPU

    本随笔记载与2019年1月23日,若随着技术发展,本随笔记录的困难被攻克也是可能的. 参考(https://www.reddit.com/r/docker/comments/86vzna/gpu_ac ...

随机推荐

  1. redis基本数据类型 set类型

    127.0.0.1:6379> SADD s1 a b c (integer) 3 127.0.0.1:6379> SMEMBERS s1 1) "b" 2) &quo ...

  2. 从MVC到DDD,该如何下手重构?

    作者:付政委 博客:bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 大家好,我是技术UP主小傅哥.多年的 DDD 应用,使我开了技术的眼界! MVC 旧工程腐化严重,迭代成本太高 ...

  3. Redis系列之——使用常见问题

    文章目录 一 子进程开销和优化 二 fork操作 三 aof追加阻塞 一 子进程开销和优化 1 cpu 开销:rdb和aof文件生成,属于cpu密集型 优化:不做cpu绑定,不和cpu密集型的服务一起 ...

  4. 垃圾000000000000000000000写了很多,保存不上,发送失败了。。。。。A

    垃圾000000000000000000000写了很多,保存不上,发送失败了.....A垃圾000000000000000000000写了很多,保存不上,发送失败了.....A垃圾0000000000 ...

  5. 轻松掌握组件启动之MongoDB(上):高可用复制集架构环境搭建

    MongoDB复制集 复制集架构 在生产环境中,强烈不建议使用单机版的MongoDB服务器.原因如下: 单机版的MongoDB无法保证系统的可靠性.一旦进程发生故障或是服务器宕机,业务将直接不可用.此 ...

  6. 20.2 OpenSSL 非对称RSA加解密算法

    RSA算法是一种非对称加密算法,由三位数学家Rivest.Shamir和Adleman共同发明,以他们三人的名字首字母命名.RSA算法的安全性基于大数分解问题,即对于一个非常大的合数,将其分解为两个质 ...

  7. Kafka基本原理、生产问题总结及性能优化实践

    Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量 ...

  8. QPixmap、QIcon和QImage

    QPixmap依赖于硬件,QImage不依赖于硬件.QPixmap主要是用于绘图,针对屏幕显示而最佳化设计,QImage主要是为图像I/O.图片访问和像素修改而设计的. 当图片小的情况下,直接用QPi ...

  9. Upload again!

    这道题没做出来,是看题解解出来的 先上传一个.htacess文件用来后面解析jpg格式的木马 再上传木马图片 注意:这里的木马比较特殊,需要为以下这样子的写法,我也不知道为啥 <script l ...

  10. Python中的爬虫应用及常用Python库

    Python的爬虫应用非常广泛,以下是一些典型的示例: 数据采集:使用爬虫可以从网页上抓取数据,并将其保存到本地或数据库中.这对于构建大规模数据集.进行市场调研.舆情监测等任务非常有用. 搜索引擎索引 ...