将ATLAS / MKL链接到已安装的Numpy
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中。那么修改它可以解决我的问题吗?如果是,请告诉我如何?
-
假设您正在运行某种形式的linux,可以采用以下一种方法:
-
找出当前使用链接的BLAS库numpy
ldd
。- 对于低于v1.10的numpy版本:
$ ldd /<path_to_site-packages>/numpy/core/_dotblas.so
- 对于低于v1.10的numpy版本:
例如,如果我通过安装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
-
如果尚未安装ATLAS / MKL / OpenBLAS。顺便说一句,我肯定会推荐OpenBLAS而不是ATLAS-看一下这个答案(尽管基准数据现在可能有点过时了)。
-
使用
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的配置。
-