Failed to create CUDAExecutionProvider 使用onnxruntime-gpu未成功调用gpu

最近在使用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! - 知乎 给出的回答,NVIDIA官网已不再提供zlibwapi.dll的下载,重新去换了最新版本的cuDNN,目前每个版本又分为与cuda对应的11.x和12.x的版本。版本对应可参考:Support Matrix - NVIDIA Docs

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

### 关于QWindowsEGLContext创建失败的问题 当遇到`QWindowsEGLContext failed to create context eglError 3005`时,通常表示OpenGL上下文初始化过程中出现了问题。此错误可能由多种原因引起,包括但不限于驱动程序不兼容、硬件加速启用或环境配置不当。 #### 可能的原因分析 1. **显卡驱动问题**: 如果使用的显卡驱动版本过旧或者存在冲突,则可能导致无法正常加载所需的OpenGL功能集[^1]。 2. **层叠窗口属性设置异常**: 当尝试通过调用 `SetLayeredWindowAttributes` 或其他相关API实现透明效果时,如果能正确处理窗口状态转换逻辑,也可能间接影响到依赖图形渲染的功能模块运行稳定性。 3. **SDL库集成场景下的特殊考量**: 对于涉及多媒体播放器开发的应用而言,在利用SDL框架完成视频帧绘制操作之前如果没有妥善管理好显示表面资源释放时机的话,同样会干扰后续基于GPU加速路径上的各项任务执行流程[^2]。 4. **Ubuntu环境下Qt自定义构建后的遗留事项**: 即使成功完成了针对特定需求定制化编译过程之后,仍需注意是否按照官方指导补充完善桌面入口文件等相关细节工作以便获得最佳用户体验[^3]。 #### 解决方案建议 以下是几种常见的排查方向及其对应措施: - #### 更新并验证显卡驱动 确认当前操作系统已安装最新版适配本机硬件特性的专用型图形处理器软件包;对于Linux发行版来说可以借助命令行工具如`nvidia-smi`(适用于NVIDIA系列设备)来进行快速检测确认实际状况。 - #### 调整应用启动参数 尝试向应用程序传递额外选项以强制指定渲染模式为例: ```bash export QT_XCB_FORCE_SOFTWARE_OPENGL=1 ./your_application_binary ``` 上述方法能够帮助绕开潜在因本地系统层面存在的某些局限所引发的一系列连锁反应从而达到临时缓解目的。 - #### 修改源代码片段适应不同平台特性差异 针对跨平台项目尤其需要注意各主流OS之间固有的区别之处做适当调整优化比如下面展示了一个关于如何动态判断当前运行环境中是否存在必要条件再决定采取何种策略的例子: ```cpp #ifdef Q_OS_WIN // Windows specific handling here... SetLayeredWindowAttributes(hwnd, RGB(0,0,0), 255, LWA_ALPHA); #endif #if defined(Q_OS_LINUX) || defined(Q_OS_UNIX) // Linux/Unix alternative approach goes here instead. if (!context->create()) { qWarning() << "Failed creating EGL context:" << context->format().majorVersion(); } #endif ``` - #### 安装缺失依赖项以及重新部署关联服务组件 若发现即使经过上述种种努力依旧无济于事则不妨考虑全面梳理一遍整个生态链路当中是否有遗漏的部分比如说字体引擎支持插件之类的细枝末节往往容易被忽略但却至关重要不可忽视。 --- ### 示例代码修正参考 考虑到具体业务逻辑复杂度较高因此仅提供一段简化版示范仅供参考学习用途而非直接套用解决方案: ```cpp #include <QGuiApplication> #include <QSurfaceFormat> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QSurfaceFormat format; format.setRenderableType(QSurfaceFormat::OpenGLES); format.setProfile(QSurfaceFormat::CoreProfile); format.setMajorVersion(3); format.setMinorVersion(0); format.setSwapBehavior(QSurfaceFormat::DoubleBuffer); QSurfaceFormat::setDefaultFormat(format); Window w; w.show(); return app.exec(); } ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大雾的小屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值