确定/查找Numpy使用的BLAS库

39

我在不同的环境下(MacOS,Ubuntu,RedHat)都使用numpy和scipy。通常我会使用可用的包管理器(例如mac ports、apt、yum)安装numpy。

然而,如果您没有手动编译Numpy,您如何确定它使用了BLAS库?使用mac ports时,ATLAS会被安装为依赖项。但是,我不确定它是否真正被使用。当我执行一个简单的基准测试时,numpy.dot()函数所需的时间约为使用Eigen C++库计算点积的时间的两倍。我不确定这是否是一个合理的结果。

3个回答

45

numpy.show_config()并不总是提供可靠的信息。例如,如果我在Ubuntu 14.04上使用apt-get install python-numpy进行安装,则np.show_config()的输出看起来像这样:

blas_info:
    libraries = ['blas']
    library_dirs = ['/usr/lib']
    language = f77
lapack_info:
    libraries = ['lapack']
    library_dirs = ['/usr/lib']
    language = f77
atlas_threads_info:
  NOT AVAILABLE
blas_opt_info:
    libraries = ['blas']
    library_dirs = ['/usr/lib']
    language = f77
    define_macros = [('NO_ATLAS_INFO', 1)]
atlas_blas_threads_info:
  NOT AVAILABLE
openblas_info:
  NOT AVAILABLE
lapack_opt_info:
    libraries = ['lapack', 'blas']
    library_dirs = ['/usr/lib']
    language = f77
    define_macros = [('NO_ATLAS_INFO', 1)]
...

看起来numpy正在使用标准的CBLAS库。但是,我确切地知道numpy正在使用OpenBLAS,我是通过安装libopenblas-dev软件包来实现的。


在*nix上检查的最可靠方法是使用ldd查找numpy在运行时链接的共享库(我没有Mac,但我认为你可以使用otool -L代替ldd)。

  • 对于早于v1.10版本的numpy:

    ~$ ldd /<path_to_site-packages>/numpy/core/_dotblas.so
    
    如果_dotblas.so不存在,则可能意味着当numpy最初编译时未能检测到任何BLAS库,因此它就不会构建任何依赖于BLAS的组件。

  • 对于numpy v1.10及更高版本:

    _dotblas.so已被删除,但您可以检查multiarray.so的依赖项。

    ~$ ldd /<path_to_site-packages>/numpy/core/multiarray.so
    
    看一下我通过apt-get安装的numpy版本:
    ~$ ldd /usr/lib/python2.7/dist-packages/numpy/core/_dotblas.so 
        linux-vdso.so.1 =>  (0x00007fff12db8000)
        libblas.so.3 => /usr/lib/libblas.so.3 (0x00007fce7b028000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fce7ac60000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fce7a958000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fce7a738000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fce7ca40000)
    

    /usr/lib/libblas.so.3实际上是一系列符号链接的起点。如果我使用readlink -e跟随它们到达最终目标,我会看到它们指向我的OpenBLAS共享库:

    ~$ readlink -e /usr/lib/libblas.so.3
    /usr/lib/openblas-base/libblas.so.3
    

如果在答案中 ldd /<path_to_site-packages>/numpy/core/multiarray.so 更靠前,我会很感激。 - Martin Thoma
17
在numpy 1.16版本中,multiarray被重新组织了。我需要运行命令ldd numpy/core/_multiarray_umath.cpython-36m-x86_64-linux-gnu.so - Quantum7

6

numpy.show_config() 只是告诉我在我的 Debian Linux 上没有可用的信息。

然而,/usr/lib/python3/dist-packages/scipy/lib 有一个子目录用于 blas,这可能会告诉你想要的信息。子目录 tests 中有几个 BLAS 的测试程序。

希望这可以帮助到你。


4
你需要检查numpy.show_config()来查看哪些库已配置。
最新的mkl应该显示libraries = ['mkl_rt'],在此之前它应该包含几个mkl_库。见这里

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