You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决C#中Microsoft.ML结合ONNX模型在NVIDIA GPU运行的DLL加载异常?

解决Microsoft.ML + ONNX Runtime GPU的DllNotFoundException问题

我之前也碰到过几乎一模一样的坑,折腾了好几天才搞定,给你分享几个关键的排查方向和解决方案:

  • 确认CUDA/cuDNN版本匹配
    ONNX Runtime GPU 1.5.2对CUDA和cuDNN的版本有严格要求:必须是CUDA 10.2cuDNN 7.6.5。如果你的机器装的是更高版本(比如CUDA 11.x),会直接导致onnxruntime.dll加载失败。安装对应版本后,还要确保CUDA的bin目录(比如C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\bin)和cuDNN的bin目录已经添加到系统PATH环境变量里。

  • 强制项目目标架构为x64
    ONNX Runtime GPU版本只支持64位架构,如果你项目设置的是Any CPU,编译时可能会默认拉取32位的依赖,自然找不到正确的dll。去项目属性 -> 生成 -> 平台目标,改成x64,然后清理并重新生成解决方案。

  • 手动部署ONNX Runtime的原生库
    有时候NuGet的自动复制机制会出问题,导致输出目录里没有正确的onnxruntime.dll。你可以手动找到NuGet包的安装路径:你的项目目录\packages\onnxruntime.gpu.1.5.2\runtimes\win-x64\native,把里面的onnxruntime.dll复制到项目的bin\x64\Debug(或Release)文件夹下,再运行试试。

  • 清理NuGet缓存并重新安装包
    偶尔NuGet缓存会损坏,导致包没有正确安装。打开Visual Studio的工具 -> NuGet包管理器 -> 包管理器设置,点击清除所有NuGet缓存,然后重新安装Microsoft.MLonnxruntime.gpu两个包。

  • 检查.NET目标框架兼容性
    Microsoft.ML 1.5.2支持.NET Core 3.1、.NET 5及以上版本,如果你用的是.NET Framework(比如4.x),可能会有兼容性问题,建议切换到.NET Core 3.1或更高版本的项目。

另外,你的Pipeline代码看起来没问题,gpuDeviceId:0在单GPU机器上是正确的,等DLL加载问题解决后,应该就能正常启用GPU加速了。我当时就是因为用了不兼容的CUDA版本,加上项目是Any CPU设置,才踩了这个坑,按照上面的步骤调整后就成功跑起来了。

内容的提问来源于stack exchange,提问作者hamishkeith

火山引擎 最新活动