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

发布于 2021-01-29 15:21:24

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安装文件夹的 _config _.py中。那么修改它可以解决我的问题吗?如果是,请告诉我如何?
关注者
0
被浏览
45
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    假设您正在运行某种形式的linux,可以采用以下一种方法:

    1. 找出当前使用链接的BLAS库numpy ldd

      • 对于低于v1.10的numpy版本:
            $ ldd /<path_to_site-packages>/numpy/core/_dotblas.so
        

    例如,如果我通过安装numpy apt-get,它将链接到

                ...
        libblas.so.3 => /usr/lib/libblas.so.3 (0x00007fed81de8000)
        ...
    

    如果_dotblas.so不存在,则可能意味着numpy最初安装时未检测到任何BLAS库,在这种情况下,它根本没有构建任何依赖于BLAS的组件。如果在pip不手动指定BLAS库的情况下使用numpy安装numpy,则通常会发生这种情况(请参见下文)。如果您要链接到外部BLAS库,恐怕您别无选择,只能重建numpy。


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

    _dotblas.so 已从最新版本的numpy中 删除 ,但是您应该可以检查numpy的依赖项multiarray.so

                $ ldd /<path_to_site-packages>/numpy/core/multiarray.so
    
    1. 如果尚未安装ATLAS / MKL / OpenBLAS。顺便说一句,我肯定会推荐OpenBLAS而不是ATLAS-看一下这个答案(尽管基准数据现在可能有点过时了)。

    2. 使用update-alternatives创建一个符号链接到您所选择的新的BLAS库。例如,如果您安装libopenblas.so到中/opt/OpenBLAS/lib,则可以执行以下操作:

      $ sudo update-alternatives --install /usr/lib/libblas.so.3 \
                                       libblas.so.3 \
                                       /opt/OpenBLAS/lib/libopenblas.so \
                                       50
      

    您可以为单个目标库配置多个符号链接,从而可以在多个已安装的BLAS库之间手动切换。

    例如,当我致电时$ sudo update-alternatives --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的“最新”版本,也可以看看我有关通过OpenBLAS集成从源代码编译numpy的答案

    使用pip安装具有BLAS支持的numpy

    正如@tndoan在评论中提到的,可以pip通过在其中放置配置文件来尊重numpy的特定配置~/.numpy- site.cfg-有关更多详细信息,请参见此答案

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看