当我尝试运行 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 中的所有扩展模块)。