Python 将ATLAS/MKL链接到已安装的Numpy
TL;DR如何在不重建的情况下将ATLAS/MKL链接到现有Numpy 我使用Numpy来计算大型矩阵,我发现它非常慢,因为Numpy只使用1个核来进行计算。在做了大量搜索之后,我发现我的Numpy没有链接到一些优化的库,比如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
>>>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中。那么修改它能解决我的问题吗?如果是的话,你能告诉我怎么做吗
ldd
查找BLAS库numpy当前链接的对象
- 对于早于v1.10的numpy版本:
如果$ ldd /<path_to_site-packages>/numpy/core/_dotblas.so
不存在,这可能意味着numpy在最初安装时未能检测到任何BLAS库,在这种情况下,它根本不构建任何BLAS相关组件。如果使用\u dotblas.so
安装numpy而不手动指定BLAS库(见下文),则经常会发生这种情况。如果你想链接到外部BLAS库,恐怕你别无选择,只能重建numpypip
- 适用于numpy v1.10及更新版本:
从最新版本的numpy,但您应该能够检查$ ldd /<path_to_site-packages>/numpy/core/_dotblas.so
应改为:多数组的依赖项。因此
您可以为单个目标库配置多个符号链接,允许您在多个已安装的BLAS库之间手动切换 例如,当我调用$ ldd /<path_to_site-packages>/numpy/core/multiarray.so
时,我可以从3个库中选择一个:$sudo update alternations--config libblas.so.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