web-dev-qa-db-ja.com

ATLAS / LAPACKをサポートするnumpyの構築

ATLAS/LAPACKルーチンのサポートを得るためにnumpy v1.12をコンパイルしようとしています。

問題

コンパイルに使用している設定が、ATLAS/LAPACKライ​​ブラリをnumpyに取り込むときに機能しないようです。

セットアップ

作業中のホスト(計算クラスター)に対する管理者権限がありません。

ただし、ノードはGNUモジュールを介してgcc 4.7.2および5.3.0、glibc 2.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

ATLAS/LAPACKライ​​ブラリはGNU Fortranでコンパイルされているため、私は--fcompiler=gnu95を使用しています。 GCCツールキットが正しくコンパイルおよびリンクできるように、CFLAGSおよびLDFLAGS変数をオーバーライドしています。

質問

コンパイル後、numpyライブラリをテストして、1つの方法で何がインストールされているかを確認します。

$ 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に正しくコンパイルする方法、またはnumpyに動作中のATLAS/LAPACKセットアップが統合されていることを本当にテストして、一貫した(信頼できる)答えを得るにはどうすればよいですか?

19
Alex Reynolds

私は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
0
FLemaitre

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
0
zan