如何确保numpy BLAS库可用作动态加载库?

24

theano installation documentation指出,如果“BLAS libraries可作为动态加载库”,theano将默认使用来自numpy的BLAS库。但这在我的机器上似乎无法正常工作,出现错误消息。

  • 如何查看numpy BLAS库是否可作为动态加载库?
  • 如果它们不是动态加载库,如何重新编译numpy BLAS库?

如果需要更多信息,请指出!

错误消息

我们没有在用于blas的library_dir中找到动态库。如果您使用ATLAS,请确保使用动态库进行编译。 /usr/bin/ld: 无法找到-lblas

附录

theano库需要numpy和BLAS库等其他组件。我发现如果你在Ubuntu下使用sudo apt-get install python-numpy python-scipy安装numpy,那么它会带有BLAS。

这是位于/usr/lib64/python2.6/dist-packages/scipy/lib/blas的文件列表。
cblas.so  info.py   __init__.py   scons_support.py   setup.py     
fblas.so  info.pyc  __init__.pyc  scons_support.pyc  setup.pyc  
setupscons.py  test
setupscons.pyc

以下是distutils.__config__.show()的输出结果

blas_info:
    libraries = ['blas']
    library_dirs = ['/usr/lib64']
    language = f77

lapack_info:
    libraries = ['lapack']
    library_dirs = ['/usr/lib64']
    language = f77

atlas_threads_info:
  NOT AVAILABLE

blas_opt_info:
    libraries = ['blas']
    library_dirs = ['/usr/lib64']
    language = f77
    define_macros = [('NO_ATLAS_INFO', 1)]

atlas_blas_threads_info:
  NOT AVAILABLE

lapack_opt_info:
    libraries = ['lapack', 'blas']
    library_dirs = ['/usr/lib64']
    language = f77
    define_macros = [('NO_ATLAS_INFO', 1)]

atlas_info:
  NOT AVAILABLE

lapack_mkl_info:
  NOT AVAILABLE

blas_mkl_info:
  NOT AVAILABLE

atlas_blas_info:
  NOT AVAILABLE

mkl_info:
  NOT AVAILABLE

安装 libblas-dev 和可能的 liblapack-dev - jww
5个回答

14

在下载了Anaconda的Python库后,我在64位Ubuntu 12.04 LTS上遇到了同样的问题。将Theano指向包含libblas.so文件的目录就可以解决问题。

$ THEANO_FLAGS=blas.ldflags="-L/usr/lib/ -lblas" python rbm.py


2
我在theanorc文件中添加了[blas] ldflags=-L/usr/lib/ -lblas,错误已经消失。 - user27665
没错,这对我有用,你可以在你的.bashrc文件中设置这个环境变量。这样,每次运行脚本时就不需要输入整个命令了。 - ramgorur

3

在Ubuntu中,libblas.so包含在libblas3gf软件包中。如果某种原因没有创建libblas.so文件,但是创建了libblas.so.X,则需要手动创建符号链接,如下所示:

cd /usr/lib64
sudo ln -s libblas.so.3gf libblas.so

注意:这对我来说一直运行良好,但请阅读下面的评论。请记住,此软件包将不会针对您的特定硬件进行优化(例如,请参阅建议使用ATLAS的其他答案)。


10
错误。安装相应的“-dev”包,这里是libblas-dev - Dirk Eddelbuettel
libblas-dev的描述是“基本线性代数子程序3,静态库”,需要的是共享库而不是静态库。 - tiho
2
当然,但是静态库在这里是无关紧要的。重要的是一个人永远不应该用手动软链接来折腾,因为-dev包只安装那些内容。这里没有BLAS特定的内容,所有Debian/Ubuntu的-dev包都是这样工作的。 - Dirk Eddelbuettel
这个方法在CentOS上对我也起作用了,不过使用实际的*-devel库似乎是更简单的解决方案。 - turtlemonvh

2
在您的情况下,您应该查看/usr/lib64并查看libblas等是否可用为.so.so.X文件。
重新编译BLAS并不容易,但您可以尝试安装适用于您发行版的相关ATLAS软件包。

1

如果安装了足够新的numpy版本,则Theano将在所有情况下正常工作。

从这里开始,关心使用的blas的唯一原因是速度。默认的blas非常慢。许多发行版再次编译numpy以使用此缓慢的blas版本。

获得更快的blas实现的简单/快速方法是安装有关atlas和atlas devel的发行版软件包。这是一个优化的blas实现。

在较新版本的Ubuntu中,atlas的安装方式使numpy开始使用它。因此,在Theano方面不需要更改任何内容。我不知道其他发行版是否会这样做。

检查Theano使用的blas是否快速的最佳方法是计时。为此,请在bash下运行以下命令:

X=`python -c "import theano;import os.path; print os.path.split(theano.__file__)[0]"`
python ${X}/misc/check_blas.py

然后比较运行所需的速度,并打印出其他比较结果。


1

你的主要问题实际上是关于发行版维护者是否正确安装了依赖项 - 对此我没有答案或解决方案。

但是,我有一个建议。ATLAS不难构建。获取源代码,解压缩,确保满足其依赖项,然后启动配置和制作步骤。依赖部分可能是过程中最耗时的手动部分。

当然,然后您必须重新链接numpy、theano等。虽然我认识到这很痛苦(相信我,我为Theano和Hannes Shulz & Andy Mueller的CSV都经历过这个过程),但您获得的好处是针对您的硬件进行优化的BLAS。


“ATLAS构建起来并不是很难”——没错,但是让它发挥出良好的性能却很棘手。 - dwf
@dwf - 我倾向于不同意。在我的第一次尝试中,我只调整了两个主要的事情:确保必要的设置正确(依赖项等),并确保它使用了线程化的BLAS/ATLAS。然后矩阵乘法任务的性能与Matlab开箱即用的性能相当。 - Brian Vandenberg
我想问题在于MATLAB是否是一个非常好的基准测试(特别是如果它是MKL捆绑版本之前的版本,我不认为是)。我倾向于按照作者捆绑的基准测试进行评估,并且我知道在类似的CPU上接近这些基准测试结果有点棘手。 - dwf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接