使用 ATLAS/LAPACK 支持构建 numpy



我正在尝试编译numpyv1.12以获得对ATLAS/LAPACK例程的支持。

问题所在

我用于编译的设置似乎无法将 ATLAS/LAPACK 库带入numpy

设置的

我对正在处理的主机(计算群集)没有管理员权限。

但是,这些节点通过 GNU 模块提供对gcc4.7.2 和 5.3.0、glibc2.17 和 2.22 以及 ATLAS/LAPACK 库和标头 v3.10.2 的访问。

出于兼容性原因,我正在使用包含Python 2.7.16的虚拟环境。同样,出于同样的原因,我正在安装旧版本的numpy。如果一切顺利,我可能会探索numpy的新版本,但此时,这就是我正在使用的。

我的numpy源目录有一个名为site.cfg的配置文件,其中包含以下指令:

[ALL]
library_dirs = /usr/local/lib:/net/module/sw/glibc/2.22/lib64:/net/module/sw/atlas-lapack/3.10.2/lib
include_dirs = /usr/local/include:/net/module/sw/glibc/2.22/include:/net/module/sw/atlas-lapack/3.10.2/include
[atlas]
libraries = lapack,f77blas,cblas,atlas
library_dirs = /net/module/sw/atlas-lapack/3.10.2/lib
include_dirs = /net/module/sw/atlas-lapack/3.10.2/include

我正在通过以下命令编译numpy

$ CFLAGS="${CFLAGS} -std=c99 -fPIC" LDFLAGS="-L/home/areynolds/.conda/envs/genotyping_environment/lib -Wl,-rpath=/home/areynolds/.conda/envs/genotyping_environment/lib -Wl,--no-as-needed -Wl,--sysroot=/,-L/net/module/sw/glibc/2.22/lib64" python setup.py build --fcompiler=gnu95

我正在使用--fcompiler=gnu95因为ATLAS/LAPACK库是用GNU Fortran编译的。我正在覆盖CFLAGSLDFLAGS变量,以便 GCC 工具包能够正确编译和链接。

问题

编译后,我测试numpy库以查看通过一种方法安装了什么:

$ python
...
>>> import numpy.distutils.system_info as sysinfo
>>> sysinfo.get_info('atlas')
ATLAS version 3.10.2 built by root on Wed Jun  1 15:39:08 PDT 2016:
UNAME    : Linux module0.altiusinstitute.org 3.10.0-327.10.1.el7.x86_64 #1 SMP Tue Feb 16 17:03:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
INSTFLG  : -1 0 -a 1 -l 1
ARCHDEFS : -DATL_OS_Linux -DATL_ARCH_UNKNOWNx86 -DATL_CPUMHZ=2876 -DATL_AVXMAC -DATL_AVX -DATL_SSE3 -DATL_SSE2 -DATL_SSE1 -DATL_USE64BITS -DATL_GAS_x8664
F2CDEFS  : -DAdd_ -DF77_INTEGER=int -DStringSunStyle
CACHEEDGE: 229376
F77      : /net/module/sw/gcc/5.3.0/bin/gfortran, version GNU Fortran (GCC) 5.3.0
F77FLAGS : -O -mavx2 -mfma -m64 -fPIC
SMC      : /usr/bin/x86_64-redhat-linux-gcc, version x86_64-redhat-linux-gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
SMCFLAGS : -O -fomit-frame-pointer -mavx2 -mfma -m64 -fPIC
SKC      : /usr/bin/x86_64-redhat-linux-gcc, version x86_64-redhat-linux-gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
SKCFLAGS : -O -fomit-frame-pointer -mavx2 -mfma -m64 -fPIC                                                                                                                                                    
{'libraries': ['lapack', 'f77blas', 'cblas', 'atlas', 'f77blas', 'cblas'], 'library_dirs': ['/net/module/sw/atlas-lapack/3.10.2/lib'], 'define_macros': [('ATLAS_INFO', '"\"3.10.2\""')], 'language': 'f77', 'include_dirs': ['/net/module/sw/atlas-lapack/3.10.2/include']}

这看起来没问题,也许吧?

但是当我通过另一种方法检查时,我得到了不同的答案:

>>> np.show_config()
lapack_opt_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
define_macros = [('HAVE_CBLAS', None)]
language = c
blas_opt_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
define_macros = [('HAVE_CBLAS', None)]
language = c
openblas_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
define_macros = [('HAVE_CBLAS', None)]
language = c
blis_info:
NOT AVAILABLE
openblas_lapack_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
define_macros = [('HAVE_CBLAS', None)]
language = c
lapack_mkl_info:
NOT AVAILABLE
blas_mkl_info:
NOT AVAILABLE

尽管在site.cfg中描述了手动设置,但没有提到ATLAS,LAPACK也没有明显指向正确的模块目录(/net/module/sw/atlas-lapack/3.10.2)。

我如何正确地将对ATLAS/LAPACK的支持编译成numpy,或者真正测试我是否将ATLAS/LAPACK设置集成到numpy中,这给了我一个一致(和可靠)的答案?

一个正交建议,但它通常可能会有所帮助,而不仅仅是针对您的特定问题。

看看斯派克。 它是一个从源代码构建包的包管理器。这是一个非常有趣和有前途的项目,它允许您通过几个步骤构建各种各样的库/软件。

我刚刚检查过,py-numpy是一个受支持的软件包(即spack list numpy)。如果要使用默认选项进行安装(使用spack info py-numpy检查它们),只需使用简单的spack install py-numpy安装它,它将与missig依赖项一起构建。

如果你想改变某些东西,例如你可能想要使用BLAS/LAPACK的特定实现或版本,你可以很容易地指定想要的依赖关系(即spack install py-numpy ^openblas)

我可以向你保证,它会为你省去很多麻烦,它为我做了很多次。我在我工作的 HPC 和本地计算机上使用它。

我刚刚向您展示了一些命令,但我只是刮掉了您可以使用它轻松执行的操作的表面(您可能使用不同的 BLAS 实现构建了多个 numpy 变体,或者具有不同选项的相同实现,或者......以防我建议您开始查看"规范语法")。

BLAS/LAPACK 是 numpy 的可选依赖项。因此,根据您要执行的操作,您可能会完全忽略ATLAS。

如果你想确保你的numpy是针对正确的库编译的,我会在Python和numpy之外,在编译的库上使用ldd

我使用的是最新的numpy和Python 3.7,所以文件名对你来说会有所不同。

> cd <numpy_dir>
> find . -name "*.so"
./core/_dummy.cpython-37m-darwin.so
./core/_multiarray_tests.cpython-37m-darwin.so
./core/_multiarray_umath.cpython-37m-darwin.so
./core/_operand_flag_tests.cpython-37m-darwin.so
./core/_rational_tests.cpython-37m-darwin.so
./core/_struct_ufunc_tests.cpython-37m-darwin.so
./core/_umath_tests.cpython-37m-darwin.so
./fft/fftpack_lite.cpython-37m-darwin.so
./linalg/_umath_linalg.cpython-37m-darwin.so
./linalg/lapack_lite.cpython-37m-darwin.so
./random/mtrand.cpython-37m-darwin.so

然后我在每个文件上运行ldd(我用了otool -L,因为我使用的是macOS)。以下 3 个文件是针对 BLAS 库编译的。

core/_multiarray_umath.cpython-37m-darwin.so
linalg/_umath_linalg.cpython-37m-darwin.so
linalg/lapack_lite.cpython-37m-darwin.so

我用 numpy 1.11.1 做到了(这意味着我的答案在您的情况下可能不是 100% 准确的),接收如下:

export ATLAS=<folder with the atlas/lapack libraries>
export LAPACK=$ATLAS
cat > site.cfg <<EOF
[atlas]
atlas_libs = lapack, f77blas, cblas, atlas
EOF
python setup.py bdist_wheel

由于您可以将 numpy 源代码放到机器上,因此我认为您可以将您喜欢的任何文件放入您的用户空间。您是否考虑过从轮子上安装 numpy?

Numpy 1.16.4支持Python 2.7。你还没有说你的节点是什么架构,但是如果没有可用的轮子,我会有点惊讶。您应该能够自己直接从 PyPi 下载它:

https://pypi.org/project/numpy/1.16.4/#files

下载并传输 wheel 文件后,假设您已经安装了pip等,您可以安装它:

pip install --no-index --user (file).whl

另外,我不愿意说ATLAS/LAPACK是最好的选择。它已经在这里进行了基准测试,看起来OpenBLAS很好:https://markus-beuckelmann.de/blog/boosting-numpy-blas.html。

最新更新