Python 将ATLAS/MKL链接到已安装的Numpy

Python 将ATLAS/MKL链接到已安装的Numpy,python,performance,numpy,linear-algebra,blas,Python,Performance,Numpy,Linear Algebra,Blas,TL;DR如何在不重建的情况下将ATLAS/MKL链接到现有Numpy 我使用Numpy来计算大型矩阵,我发现它非常慢,因为Numpy只使用1个核来进行计算。在做了大量搜索之后,我发现我的Numpy没有链接到一些优化的库,比如ATLAS/MKL。这是我的numpy配置: >>>import numpy as np >>>np.__config__.show() blas_info: libraries = ['blas'] library_di

TL;DR如何在不重建的情况下将ATLAS/MKL链接到现有Numpy

我使用Numpy来计算大型矩阵,我发现它非常慢,因为Numpy只使用1个核来进行计算。在做了大量搜索之后,我发现我的Numpy没有链接到一些优化的库,比如ATLAS/MKL。这是我的numpy配置:

>>>import numpy as np
>>>np.__config__.show()
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)]
atlas_info:
  NOT AVAILABLE
lapack_mkl_info:
  NOT AVAILABLE
blas_mkl_info:
  NOT AVAILABLE
atlas_blas_info:
  NOT AVAILABLE
mkl_info:
  NOT AVAILABLE
因此,我想将ATLAS/MKL链接到Numpy。但是,我的Numpy是从PIP安装的,所以我不想手动安装,因为我想使用最新版本。我做了一些搜索,但它们只是为了从头开始建造。因此,我的问题是:

  • 有没有办法在不重建的情况下将ATLAS/MKL链接到Numpy
  • 我发现配置信息保存在Numpy的已安装文件夹中的\u config_uupy中。那么修改它能解决我的问题吗?如果是的话,你能告诉我怎么做吗

假设您运行的是某种风格的linux,下面是一种方法:

  • 使用
    ldd
    查找BLAS库numpy当前链接的对象

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

      $ ldd /<path_to_site-packages>/numpy/core/_dotblas.so
      
      如果
      \u dotblas.so
      不存在
      ,这可能意味着numpy在最初安装时未能检测到任何BLAS库,在这种情况下,它根本不构建任何BLAS相关组件。如果使用
      pip
      安装numpy而不手动指定BLAS库(见下文),则经常会发生这种情况。如果你想链接到外部BLAS库,恐怕你别无选择,只能重建numpy


    • 适用于numpy v1.10及更新版本:

      $ ldd /<path_to_site-packages>/numpy/core/_dotblas.so
      
      从最新版本的numpy,但您应该能够检查
      多数组的依赖项。因此
      应改为:

      $ ldd /<path_to_site-packages>/numpy/core/multiarray.so
      
      您可以为单个目标库配置多个符号链接,允许您在多个已安装的BLAS库之间手动切换

      例如,当我调用
      $sudo update alternations--config libblas.so.3
      时,我可以从3个库中选择一个:

        Selection    Path                                    Priority   Status
      ------------------------------------------------------------
        0            /opt/OpenBLAS/lib/libopenblas.so         40        auto mode
        1            /opt/OpenBLAS/lib/libopenblas.so         40        manual mode
        2            /usr/lib/atlas-base/atlas/libblas.so.3   35        manual mode
      * 3            /usr/lib/libblas/libblas.so.3            10        manual mode
      
    • 如果你真的想要“最新”版本的numpy,你也可以看看

      使用pip安装具有BLAS支持的numpy 正如@tndoan在评论中提到的,通过在
      ~/.numpy site.cfg
      中放置一个配置文件,可以使
      pip
      尊重numpy的特定配置-有关更多详细信息,请参阅


      我个人的偏好是手动配置和构建numpy。这并不特别困难,而且它可以让您更好地控制numpy的配置。

      答案取决于numpy最初是如何构建的。如果它是针对BLAS和LAPACK构建的,那么至少没有办法强迫
      numpy.dot
      以后在不重建的情况下使用ATLAS/MKL。其他函数不使用
      numpy.dot
      ,您可以使用
      updatealternations
      更改符号链接
      libblas.so.3
      liblapack.so.3
      的目标。这是因为
      numpy.dot
      需要ATLAS样式的CBLAS或OpenBLAS/MKL,但不需要netlib中的BLAS/CBLAS和LAPACK

      我使用的是openSUSE,我已经从netlib安装了标准的cblas-devel。然而,强制NumPy使用已装运的cblas/cblas-devel似乎是不可能的。也就是说,如果您根据netlib BLAS/LAPACK/CBLAS(作为官方软件包)构建NumPy,那么
      \u dotblas.so
      (提供
      NumPy.dot的BLAS版本)无法构建(1.10之前),或者
      多数组。因此
      (1.10及更高版本)根本不链接到
      libblas.so.3
      。请参阅github上的问题:以及引用的Debian bug报告:。也许有人可以潜入源代码中制作补丁……不管怎样,这只是一个受影响的函数(
      numpy.dot
      ),你现在可以使用更快的OpenBLAS轻松地重建整个numpy,所以可能没什么大不了的

      结论:您可以稍后链接到ATLAS/MKL/OpenBLAS而无需重建,但是
      numpy.dot
      如果最初不是针对ATLAS/MKL/OpenBLAS构建numpy,则速度仍然非常慢(因为
      numpy.dot
      一开始根本没有使用任何BLAS,一旦编译完成,你就无能为力了)

      更新:实际上,您可以强制numpy构建
      \u dotblas。因此
      。我为numpy-1.9.2制作了一个补丁:

      diff-Npru numpy-1.9.2.orig/numpy/core/setup.py numpy-1.9.2/numpy/core/setup.py
      ---numpy-1.9.2.orig/numpy/core/setup.py 2015-02-01 11:38:25.000000000-0500
      +++numpy-1.9.2/numpy/core/setup.py 2016-03-28 01:31:12.948885383-0400
      @@-953,8+953,8@@def配置(父_包=“”,顶部_
      #blas_info={}
      def get_dotblas_源(外部,构建目录):
      如果blas_信息:
      -如果blas_INFO.get('define_macros',[])中的('NO_ATLAS_INFO',1):
      -返回None#dotblas需要ATLAS,Fortran编译的blas将不够。
      +#如果blas_INFO.get('define_macros',[])中的('NO_ATLAS_INFO',1):
      +#返回无#dotblas需要ATLAS,Fortran编译的blas不够。
      返回ext.dependens[:3]
      返回无#将不生成任何扩展模块
      

      既然
      \u dotblas.so
      链接到了
      libblas.so.3
      ,您可以使用
      更新备选方案来测试差异。

      谢谢您的帮助。在转到
      numpy.\u路径\uuuu
      中的文件夹核心后,我找不到\u dotblas.so。我已经使用PIP安装了numpy,它在其他文件夹中吗?您的答案与.I相同将尝试手动构建。感谢您的支持。对于仍希望使用配置文件重新安装的
      pip
      的用户,这是他们的解决方案。@ali\m:请编辑您的帖子,将此链接添加到您的答案中。感谢您提供使用openBl的建议
        Selection    Path                                    Priority   Status
      ------------------------------------------------------------
        0            /opt/OpenBLAS/lib/libopenblas.so         40        auto mode
        1            /opt/OpenBLAS/lib/libopenblas.so         40        manual mode
        2            /usr/lib/atlas-base/atlas/libblas.so.3   35        manual mode
      * 3            /usr/lib/libblas/libblas.so.3            10        manual mode