【问题标题】:How to make sure the numpy BLAS libraries are available as dynamically-loadable libraries?如何确保 numpy BLAS 库可用作动态加载库?
【发布时间】:2011-10-10 23:43:05
【问题描述】:

theano installation documentation 声明,如果“BLAS 库可作为动态加载库使用”,theano 将默认使用 numpy 中的 BLAS 库。这似乎不适用于我的机器,请参阅错误消息。

  • 如何确定 numpy BLAS 库是否可以动态加载?
  • 如果 numpy BLAS 库不可动态加载,我该如何重新编译它们?

如果您需要更多信息,请注明!

错误信息

We did not found a dynamic library into the library_dir of the library we use for blas. If you use ATLAS, make sure to compile it with dynamics library. /usr/bin/ld: cannot find -lblas

附录

theano 库需要 numpy 和 BLAS 库。如果您在 Ubuntu 下使用sudo apt-get install python-numpy python-scipy 安装 numpy,我认为 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

标签: linux numpy shared-libraries blas atlas


【解决方案1】:

下载 Python 库的 Anaconda 发行版后,我刚刚在 Ubuntu 12.04 LTS 64 位上遇到了同样的问题。将 Theano 指向包含 libblas.so 的目录就完成了。

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

【讨论】:

  • 我添加到我的 theanorc 中:[blas] ldflags=-L/usr/lib/ -lblas 。错误消失了。
  • 是的,这对我有用,你可以在 .bashrc 文件中设置这个环境变量。这样您就不需要在每次运行脚本时都输入整个内容。
【解决方案2】:

使用 ubuntu,在包管理器中,libblas.so 带有 libblas3gf 包。 如果不知何故它没有创建 libblas.so,而是创建了 libblas.so.X,请手动创建一个符号链接,如:

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

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

【讨论】:

  • 错了。安装对应的-dev包,这里libblas-dev
  • libblas-dev 的描述是“基本线性代数子例程 3,静态库”,需要的是共享库,而不是静态库。
  • 当然可以,但是静态库在这里无关紧要。重要的是,当-dev 软件包只安装这些时,应该永远 使用手动软链接来解决问题。这里没有特定于 BLAS 的内容,所有 Debian/Ubuntu -dev 软件包都以这种方式工作。
  • 这在 CentOS 上也适用于我,尽管使用实际的 *-devel 库似乎是一个更简单的解决方案。
【解决方案3】:

在您的情况下,您应该查看/usr/lib64 并查看libblas 等是否可以作为.so.so.X 文件使用。

重新编译 BLAS 并非易事,但您可以尝试为您的发行版安装相关的 ATLAS 包。

【讨论】:

    【解决方案4】:

    您的主要问题本质上是发行版维护者是否正确安装了依赖项 - 为此我没有答案或解决方案。

    不过,我确实有一个建议。构建 ATLAS 并不难。获取源代码,解包,确保您满足其依赖关系,然后开始配置和制作步骤。依赖部分可能是流程中最耗时的手动部分。

    当然,然后你必须重新链接 numpy、theano 等。虽然我认识到这很痛苦(相信我,我为 Theano 和 Hannes Shulz & Andy Mueller 的 CSV 都经历过它),但你得到的好处是BLAS 已调整为在您的硬件上以最佳方式运行。

    【讨论】:

    • “构建 ATLAS 并不难”——没错,但要从中获得良好的性能却很棘手。
    • @dwf - 我倾向于不同意。在我的第一次尝试中,我只调整了两个主要的东西:确保正确设置必要的东西(依赖关系等),并确保它使用线程化的 BLAS/ATLAS。矩阵乘法任务的性能与开箱即用的 Matlab 相当。
    • 我想问题是 MATLAB 是否是一个非常好的基准测试(特别是如果它是他们捆绑 MKL 之前的一个版本,我认为不是)。我倾向于使用作者的捆绑基准,而且我知道要接近可比 CPU 上的基准有点棘手。
    【解决方案5】:

    如果安装了最新版本的 numpy,theano 将在所有情况下都能正常工作。

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

    实现更快的 blas 的一种简单/快速的方法是安装关于 atlas 和 atlas devel 的发行包。这是一个优化的 blas 实现。

    较新版本的Unbuntu,在done中安装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
    

    然后将运行速度与打印的其他比较结果进行比较。

    【讨论】:

      猜你喜欢
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多