编译 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:无法打开共享对象文件的主要内容,如果未能解决你的问题,请参考以下文章

golang编译dll失败问题解决

编译失败,无法安装APK

MinGW编译C失败

Cef编译 CefSharp编译失败,检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”

在 Windows 下,Android 的 boost 编译失败

编译ARM版的qt4.8失败求助