如何解决“请确保 libcudnn_cnn_infer.so.8 在您的库路径中!”(WSL Ubuntu)

如何解决“请确保 libcudnn_cnn_infer.so.8 在您的库路径中!”(WSL Ubuntu)

当我尝试运行 PyTorch 程序时,失败了:

Could not load library libcudnn_cnn_infer.so.8. Error: libcuda.so: cannot open shared object file: No such file or directory
Please make sure libcudnn_cnn_infer.so.8 is in your library path!
Aborted

当我apt-get对 cuda 包进行操作时,它位于与库路径不同的目录中。我复制了该文件并尝试将其粘贴到库路径中:/usr/lib/wsl/lib

事实证明,该文件夹是只读的,无论我做什么(例如chmod),它都保持这种状态。如果路径是只读的,我应该如何编辑库路径?

***如果我遗漏了任何信息,请询问

答案1

我通过输入 bash 解决了这个问题export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/some/directory/

答案2

错误: 错误 无法加载库 libcudnn_ops_infer.so.8。错误:libcudnn_ops_infer.so.8:无法打开共享对象文件:没有此文件或目录 请确保 libcudnn_ops_infer.so.8 在您的库路径中!已中止(核心转储)

解决方案: 找到此文件(libcudnn_ops_infer.so.8)的位置并将其添加到库路径。您可以按照以下步骤操作:

步骤 01(查找库路径): 您可以使用带有 -name 选项的 find 命令来搜索 libcudnn_ops_infer.so.8 所在的库路径,例如:

sudo find / -type f -name libcudnn_ops_infer.so.8

现在运行上述命令后,根据您的具体环境和要求选择适当的路径。

步骤02(添加库路径): 您可以更新 LD_LIBRARY_PATH 环境变量以包含库所在的路径。

例如: 导出 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/u/.conda/envs/bot/lib/python3.10/site-packages/torch/lib

就我而言,路径是: “” 导出 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/u/.conda/envs/work_virtual_env/lib/python3.10/site-packages/nvidia/cudnn/lib/””

笔记:我的操作系统是 Ubantu 22.04 LTS

答案3

我不得不用

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/x86_64_linux-gnu/

答案4

您可以使用Python 包,用于检查 .so/.dll 文件中的符号。或者您可以实现自己的 C 库,并将其添加到所有包/程序中。

要安装它,您可以使用pip 安装 dlsym

dlsym 允许 Python C 扩展模块使用已加载的 C 库中存在的符号,而无需实际链接这些库。举一个简单的例子,使用 pybind11:

double (* my_atan2)(double, double);
my_atan2 = reinterpret_cast<decltype(my_atan2)>(
    py::module::import("dlsym").attr("dlsym")("atan2").cast<uintptr_t>());

显然,链接到 libm 来访问 atan2 并不是特别困难,但是这种方法还允许人们使用例如导入 numpy 后可用的 numpy 提供的 BLAS/LAPACK 函数(无论底层实现是 OpenBLAS、MKL 还是其他什么),导入 pyfftw 后可用的 fftw 函数,或导入 tkinter 后可用的 Tcl/Tk 函数(请参阅测试中的示例)。

这里的主要目标是简化在机器上此类扩展模块的编译,在机器上 C 库可能默认不存在,但可以通过在相应的 Python 包上声明 install_requires 来“请求”它们。

请注意,共享库的路径实际上并未作为参数传递给 dlsym(与 POSIX dlsym(3) 不同)。这是因为 Windows 上的符号搜索无论如何都必须枚举所有已加载的模块,因为不能只传递一个以传递方式加载符号的模块。在 POSIX 上,我们遵循相同的策略以保持一致性(但枚举 sys.modules 中的所有扩展模块)。

相关内容