首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将ATLAS/MKL链接到已安装的Numpy

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

Stack Overflow用户
提问于 2014-02-10 15:12:12
回答 2查看 19.1K关注 0票数 23

TL;DR如何将ATLAS/MKL链接到现有的Numpy而无需重建。

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

代码语言:javascript
复制
>>>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的安装文件夹中的
  • 中。那么修改它能解决我的问题吗?如果是,你能告诉我怎么做吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-10 17:41:30

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

使用ldd.,

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

//numpy/core/_dotblas.so

代码语言:javascript
复制
- **For versions of numpy older than v1.10:**

$ ldd

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

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

如果 numpy 不存在,这可能意味着它在最初安装时未能检测到任何BLAS库,在这种情况下,它根本不会构建任何依赖于BLAS的组件。如果您使用pip安装numpy,而不手动指定BLAS库(见下文),则通常会发生这种情况。如果你想链接到一个外部的BLAS库,我担心你将别无选择,只能重建numpy。

来自最新版本的

代码语言:javascript
复制
- **For numpy v1.10 and newer:**

,但您应该能够检查multiarray.so的依赖关系:

$ ldd //numpy/core/multiarray.so

  1. 如果你还没有安装ATLAS/MKL/OpenBLAS,就安装它。顺便说一下,我绝对推荐OpenBLAS而不是ATLAS --看看this answer (尽管基准测试数据现在可能有点过时了)。
  2. 使用update-alternatives创建一个指向您选择的新BLAS库的符号链接。例如,如果在/opt/OpenBLAS/lib中安装了libopenblas.so,则应执行以下操作:

$ 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个库中选择一个:

选择路径优先级状态0 /opt/OpenBLAS/lib/libopenblas.so 40自动模式1/opt/OpenBLAS/lib/libopenblas.so 40手动模式2 /usr/lib/atlas-base/atlas/libblas.so.3 35手动模式*3 /usr/lib/libblas/libblas.so.3 10手动模式

如果你真的想要numpy的“最新”版本,你也可以看看my answer on compiling numpy from source with OpenBLAS integration

使用pip安装支持BLAS的numpy

正如@tndoan在评论中提到的,可以通过在~/.numpy-site.cfg中放置一个配置文件来使pip遵守numpy的特定配置-有关更多详细信息,请参阅this answer

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

票数 27
EN

Stack Overflow用户

发布于 2016-03-28 12:52:53

答案取决于NumPy最初是如何构建的。如果它是针对BLAS和LAPACK构建的,那么至少没有办法强制numpy.dot在以后使用ATLAS/MKL而不进行重建。其他函数不使用numpy.dot,您可以使用update-alternatives更改符号链接libblas.so.3liblapack.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,则不能构建_dotblas.so(提供numpy.dot的BLAS版本)(1.10之前),或者multiarray.so(1.10及更高版本)根本不链接到libblas.so.3。请参阅github:https://github.com/numpy/numpy/issues/1265上的问题和引用的Debian bug报告:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=464784。也许有人可以钻研源代码来制作一个patch...Anyway,这只是一个受影响的函数(numpy.dot),现在你总是可以使用更快的OpenBLAS轻松地重建整个NumPy,所以可能根本没什么大不了的。

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

更新:实际上你可以强制numpy构建_dotblas.so。我为numpy-1.9.2做了一个补丁:

代码语言:javascript
复制
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 configuration(parent_package='',top_
     #blas_info = {}
     def get_dotblas_sources(ext, build_dir):
         if blas_info:
-            if ('NO_ATLAS_INFO', 1) in blas_info.get('define_macros', []):
-                return None # dotblas needs ATLAS, Fortran compiled blas will not be sufficient.
+            #if ('NO_ATLAS_INFO', 1) in blas_info.get('define_macros', []):
+            #    return None # dotblas needs ATLAS, Fortran compiled blas will not be sufficient.
             return ext.depends[:3]
         return None # no extension module will be built

现在_dotblas.so已链接到libblas.so.3,您可以使用update-alternatives来测试它们之间的区别。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21671040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档