如何在NumPy和SciPy中检查BLAS/LAPACK链接?

140

我正在基于这篇文章搭建基于BLAS和LAPACK的numpy/scipy环境。

在完成后,我该如何检查我的numpy/scipy函数确实使用了先前构建的BLAS/LAPACK功能?

5个回答

315

numpy.show_config()方法(或numpy.__config__.show())可以输出构建时收集的链接信息。我的输出结果如下。我认为这意味着我正在使用随Mac OS附带的BLAS / LAPACK。

>>> import numpy as np
>>> np.show_config()

lapack_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3']
    define_macros = [('NO_ATLAS_INFO', 3)]
blas_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers']
    define_macros = [('NO_ATLAS_INFO', 3)]

4
考虑到它的广泛实用性,numpy.config 应该成为一个公共API。尽管如此,“你赢了这一回合,davost”。 - Cecil Curry
2
那么,“lapack_opt_info”被显示出来这一事实意味着numpy已经与lapack链接了吗? - DanHickstein
55
你如何解释输出结果? - Edward Newell
19
你可以使用 numpy.show_config(),这可能是一个公共的 API 函数,因为它没有下划线前缀。但它没有在线文档并且没有文档字符串,所以难以找到也不奇怪。希望他们会解决这个问题。 - Praveen
8
当显示多个软件包时,我该如何找出实际使用的软件包? - Jonasson
显示剩余3条评论

29
你要找的是这个: system info 我使用atlas编译了numpy/scipy,并且可以通过以下方式进行检查:
import numpy.distutils.system_info as sysinfo
sysinfo.get_info('atlas')

查看文档以获取更多命令。


36
这似乎并不表明numpy当前是否正在使用ATLAS,只是表明在下一次numpy编译期间是否将与ATLAS链接。我以前已经编译过numpy而没有ATLAS。它的速度非常慢,直到我重新编译了numpy(确实如此),但是在numpy重新编译之前和之后,sysinfo.get_info('atlas')显示相同的输出。如何检查当前情况? - dmytro
7
如何解释输出结果? - Eric O. Lebigot
3
如果你在基于Debian发行版的系统上安装了OpenBLAS,可能会安装了'blas'而不是'atlas'。 - Malcolm
4
考虑到这个回答并未解决问题,所以davost的回答可能应该被接受。尽管这个回答揭示了用于解决其他相关问题的有趣机制,还是要表示衷心感谢!请注意,不要改变原来的意思。 - Cecil Curry
2
@rabra sysinfo.get_info('atlas') 对我来说没有返回任何内容,但是 sysinfo.get_info('blas') 返回了以下内容: '/usr/include', '/opt/local/include', '/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/include'], 'libraries': ['blas', 'blas'], 'library_dirs': ['/usr/lib']}``` 而 `sysinfo.get_info('lapack')` 返回了以下内容: ```{'language': 'f77', 'libraries': ['lapack', 'lapack'], 'library_dirs': ['/usr/lib']}``` 这是什么意思? - SebMa
显示剩余3条评论

11

你可以使用链接加载器工具来查看构建过程中 C 级别钩子组件是否依赖于你选择的 BLAS 和 LAPACK。我现在不在 Linux 系统上,但在 Mac OS X 设备上,你可以在安装位置下的 site-packages 目录内执行以下操作:

$ otool -L numpy/core/_dotblas.so 
numpy/core/_dotblas.so:
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
    /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 268.0.1)

$ otool -L scipy/linalg/flapack.so 
scipy/linalg/flapack.so (architecture i386):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
    /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 242.0.0)
scipy/linalg/flapack.so (architecture ppc):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)

$ otool -L scipy/linalg/fblas.so 
scipy/linalg/fblas.so (architecture i386):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
    /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 242.0.0)
scipy/linalg/fblas.so (architecture ppc):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)

在GNU/Linux系统上用ldd代替otool,你就能得到所需的答案。


2
如果没有文件 numpy/core/_dotblas.so 会怎样?(请参见Ricardo答案下面的评论) - Woltan
@Woltan:要么是有严重的问题,要么你在错误的地方查找。在我所见过的每个Linux和OS X numpy安装中,都会有一个_dotblas.so,它是接口包装器,用于构建分发所使用的任何blas。在Windows上,它将被称为_dotblas.pyd,但功能是相同的。 - talonmies
3
如果您在site.cfg文件的[atlas]部分中使用了启用CBLAS的BLAS库,则似乎只会构建_dotblas.so文件。因此,即使您没有使用ATLAS(除非您使用具有专用部分的Intel MKL),也应该使用它。 - Kenneth Hoste
实际上,当NumPy构建时没有BLAS可用时,它会构建自己的点积例程。这些程序可能比ATLAS慢两个数量级。 - Fred Foo
6
_dotblas.so在numpy v1.10及更高版本中已经不存在,但您可以检查multiarray.so的链接。 - ali_m
这里有一个不错的方法(看起来): nm /path/to/numpy/core/multiarray.so | grep blas_dot。 如果没有 blas_dot 符号,则 numpy 没有链接到 BLAS(对于 v1.10 及以上版本)。 - Kenneth Hoste

9
您可以使用 show_config() 函数来显示 BLAS、LAPACK 和 MKL 的链接情况:
import numpy as np
np.show_config()

对我而言,这个输出结果为:

mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
blas_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
blas_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
lapack_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
lapack_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']

3
你如何解释 ('HAVE_CBLAS', None)] - seralouk
4
@serafeim 请参考链接。这实际上意味着定义了HAVE_CBLAS,但没有值(类似于C语言中的#define HAVE_CBLAS)。它不需要一个值,因为它只被用作标志。我会将其解释为HAVE_CBLAS=True。如果您没有CBLAS,则根本不会在元组中出现。 - M.T
我只想知道我的numpy是否链接到blas,以便线性代数计算足够快。我得到了这个:https://imgur.com/a/SsrDqg5。你如何解释这个? - seralouk
@makis numpy与openblas相连。 - M.T

-2
如果您安装了anaconda-navigator(在www.anaconda.com/anaconda/install/上适用于Linux、Windows或macOS),则blas、scipy和numpy都将被安装,并且您可以通过单击导航器主页左侧的环境选项卡来查看它们(按字母顺序查找每个目录)。安装完整的anaconda(而不是miniconda或单独的软件包)将负责安装许多数据科学所需的基本软件包。

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