Сборка NumPy с поддержкой ATLAS/LAPACK

Я пытаюсь скомпилировать numpy v1.12 для получения поддержки подпрограмм ATLAS/LAPACK.

Эта проблема

Настройки, которые я использую для компиляции, похоже, не работают, чтобы привести библиотеки ATLAS/LAPACK в numpy.

Настройка

У меня нет прав администратора на хосте (ах), над которым я работаю (вычислительный кластер).

Однако узлы предоставляют доступ к библиотекам и заголовкам gcc 4.7.2 и 5.3.0, glibc 2.17 и 2.22 и ATLAS/LAPACK v3.10.2 через модули GNU.

По причинам совместимости я работаю с виртуальной средой, которая содержит 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. Я переопределяю переменные CFLAGS и LDFLAGS чтобы инструментарий 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, что дает мне непротиворечивый (и надежный) ответ?

Ответ 1

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

Ответ 2

Так как вы можете получить на машине непрямой источник, я бы предположил, что вы можете получить любые файлы, которые вам нравятся, в свое пространство пользователя. Рассматривали ли вы установку NumPy с колеса?

Numpy 1.16.4 поддерживает Python 2.7. Вы не сказали, какова архитектура ваших узлов, но я был бы немного удивлен, если бы не было доступного колеса. Вы должны иметь возможность загрузить его непосредственно из PyPi:

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

После того, как вы загрузили файл колеса и передали его, предполагая, что вы уже установили pip и т.д., Вы можете установить его:

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

Кроме того, я бы не хотел сказать, что ATLAS/LAPACK - лучший вариант. Это было сравнено здесь, и похоже, что OpenBLAS просто отлично: https://markus-beuckelmann.de/blog/boosting-numpy-blas.html.