TL;DR如何将ATLAS/MKL链接到现有的Numpy而无需重建。
我使用Numpy来计算大型矩阵,我发现它非常慢,因为Numpy只使用一个核心进行计算。在做了大量的搜索之后,我发现我的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安装的,所以我不想手动安装,因为我想使用最新版本。我已经做了一些搜索,但它们只是为了从头开始构建。因此,我的问题是:
发布于 2014-02-10 17:41:30
假设您运行的是某种风格的linux,下面是一种方法:
使用ldd
.,
//numpy/core/_dotblas.so
- **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。
来自最新版本的
- **For numpy v1.10 and newer:**
$ ldd //numpy/core/multiarray.so
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的配置。
发布于 2016-03-28 12:52:53
答案取决于NumPy最初是如何构建的。如果它是针对BLAS和LAPACK构建的,那么至少没有办法强制numpy.dot
在以后使用ATLAS/MKL而不进行重建。其他函数不使用numpy.dot
,您可以使用update-alternatives
更改符号链接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,则不能构建_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做了一个补丁:
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
来测试它们之间的区别。
https://stackoverflow.com/questions/21671040
复制相似问题