编译 cuda_ndarray.cu 失败:libcublas.so.7.5:无法打开共享对象文件
Posted
技术标签:
【中文标题】编译 cuda_ndarray.cu 失败:libcublas.so.7.5:无法打开共享对象文件【英文标题】:Failed to compile cuda_ndarray.cu: libcublas.so.7.5: cannot open shared object file 【发布时间】:2016-06-07 19:03:34 【问题描述】:我正在尝试在 aws 实例中导入 theano 库以使用 GPU。我已经使用 boto 编写了一个 python 脚本来自动化 aws 设置,它本质上将从我的本地机器对实例执行 ssh,然后在我执行“python -c 'import theano'”的地方启动一个 bash 脚本启动 GPU。但我收到以下错误:
错误(theano.sandbox.cuda)::没有这样的文件或 目录
当我尝试直接在实例命令 shell 中导入 theano 模块时,它会自动开始使用 GPU。
使用 gpu 设备 0:GRID K520(CNMeM 已禁用)
我想我错过了通过我的自动化 python 脚本导入时必须进行的其他一些导入。可能的解决方案是什么?
【问题讨论】:
可能是环境问题。尝试 python "import os; print(os.eviron["PATH"])" 看看 "/usr/local/cuda/bin" 是否在 PATH 中。 还要检查LD_LIBRARY_PATH
以确保可以在运行时找到 CUDA 库。
就我而言,这是由我的 CUDA 安装策略引起的问题。当我尝试安装 libcublas.so.10 时,它正在创建 libcublas.so.11。在我的安装脚本中使用DEBIAN_FRONTEND=noninteractive apt -y install cuda-10-1
解决了这个问题。
【参考方案1】:
我会尽量简洁明了地解决这个问题,因为我发现对于开始使用 unix 或不熟悉编译和链接的人来说并不是一个很好的答案。
问题与动态链接有关,可以通过两种方式解决。第一个是通过设置 LD_LIBRARY_PATH 环境变量。假设 cuda 安装在 /usr/local/cuda/ 中,只需在您的环境文件 /etc/enviroment 中添加:
LD_LIBRARY_PATH=/usr/local/cuda/
或者只是在你的 bashrc 中:
export LD_LIBRARY_PATH=/usr/local/cuda/lib64/
unix 专家不推荐此解决方案(我不是一个,我刚刚在互联网上阅读过该解决方案,我关注的是 linux 专家)。所以我找到的解决方法很简单,修改linux ld软件默认搜索库的路径。为此,只需执行(您必须以 root 身份执行):
cd /etc/ld.so.conf.d/
然后选择例如并编辑:
vi libc.conf
在此文件中,只需添加 lib64 根目录的路径,例如:
/usr/local/cuda/lib64/
你会在文件中得到这样的东西:
\# libc default configuration
/usr/local/lib
/usr/local/cuda/lib64/
然后运行:
sudo ldconfig
希望这个答案可以帮助那些开始接触编程或使用高级语言(如 python)的人,这些语言使用下面的 C 代码(就像 theano 一样)并且不熟悉编译、linkig...
【讨论】:
【参考方案2】:我在使用 cuda 7.5 的 Ubuntu 16.04 上遇到了同样的错误,并找到了解决方案 here:
cuda 7.5 不支持默认的 g++ 版本。安装支持的版本并将其设为默认:
sudo apt-get install g++-4.9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 20
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 10
sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30
sudo update-alternatives --set cc /usr/bin/gcc
sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30
sudo update-alternatives --set c++ /usr/bin/g++
解决 glibc 错误 - 使用以下设置在主目录中创建 .theanorc:
[global]
device=gpu
floatX=float32
[nvcc]
flags=-D_FORCE_INLINES
别忘了检查环境变量: PATH 应包含您的 cuda bin 文件夹位置,CUDA_HOME 应包含 cuda home 位置
我以这种方式将它添加到我的 .bashrc 文件中:
export PATH="/usr/local/cuda/bin:$PATH"
export CUDA_HOME="/usr/local/cuda:$CUDA_HOME"
【讨论】:
【参考方案3】:我最近遇到了类似的问题,并且花了很长时间弄清楚出了什么问题(以至于我损坏了我的 Linux 安装并不得不重新安装)。
此错误的潜在解决方案是删除(可能)位于您的主目录中的.theano/
目录:
sudo rm -rf ~/.theano
为防止此错误再次发生,请勿以 root 用户身份运行您的脚本(即没有sudo
)。
以root身份运行脚本将创建具有root权限的隐藏目录,使其无法被其他进程访问。
【讨论】:
【参考方案4】:在 Kumar here 的建议下,我做到了
sudo ldconfig /usr/local/cuda/lib64
它神奇地开始工作了。谢谢库马尔!
【讨论】:
以上是关于编译 cuda_ndarray.cu 失败:libcublas.so.7.5:无法打开共享对象文件的主要内容,如果未能解决你的问题,请参考以下文章
Cef编译 CefSharp编译失败,检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”