Сборка 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.