numpy.dot很慢,但安装了blas和lapack,如何修复



我在ArchLinux上运行,我的python版本是2.7.8的,并且安装了BLASLAPACK

% pacman -Qs blas; pacman -Qs lapack
local/blas 3.5.0-1
    Basic Linear Algebra Subprograms
local/lapack 3.5.0-1
    Linear Algebra PACKage

Numpy 已通过 sudo pip2 install numpy 安装,它确认它同时看到BLASLAPACK

>>> numpy.show_config()
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
openblas_info:
  NOT AVAILABLE
lapack_opt_info:
    libraries = ['lapack', 'blas']
    library_dirs = ['/usr/lib64']
    language = f77
    define_macros = [('NO_ATLAS_INFO', 1)]
openblas_lapack_info:
  NOT AVAILABLE
atlas_info:
  NOT AVAILABLE
lapack_mkl_info:
  NOT AVAILABLE
blas_mkl_info:
  NOT AVAILABLE
atlas_blas_info:
  NOT AVAILABLE
mkl_info:
  NOT AVAILABLE

然而,我对np.dot操作的速度测试远远超过 30 秒,因为我知道在类似的机器上它运行的时间不到 10 秒。如何解决速度问题?在安装具有BLASLAPACK支持的numpy时,我是否错过了什么?

好的,这就是整个故事。首先,初始设置很慢BLAS因为这是一个参考实现,它不是为了快速而设计的。我再说一遍,截至今天,ArchLinux Extra存储库中blas的软件包是参考实现。有关详细信息,请参阅此处的Presentation部分。

其次,有BLAS的优化版本(实际上相当多:ATLAS,OpenBlas,Goto BLAS,MKL等等,毫无疑问(。它们的安装相当棘手。我最终安装了OpenBlas,以下是在ArchLinux上执行此操作的分步概述:

  1. 从 AUR 安装openblas-lapack软件包
  2. 从 AUR 安装 python2-numpy-openblas 包 据我了解,它与普通python2-numpy包的不同之处在于site.cfg配置文件,该文件指示numpy搜索我们在步骤 1 中安装的openblas库。

这些动作为我解决了问题,速度现在好多了——我在问题中提到的测试不到 1 秒。numpy 还显示它已使用 openblas 编译:

>>> np.show_config()
lapack_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/lib']
    language = f77
blas_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/lib']
    language = f77
openblas_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/lib']
    language = f77
openblas_lapack_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/lib']
    language = f77
blas_mkl_info:
  NOT AVAILABLE

我相信为python3建立面向openblas numpy的过程看起来非常相似。

我的建议是从源代码构建"numpy"并将其与 BLAS 和 LAPACK 链接。

最新更新