Python
numpy
Ubuntu14.04
OpenBLAS

numpy, scipyでOpenBLASを使う

More than 1 year has passed since last update.

numpy,scipyが遅いと感じた場合,blasの設定を確認するとよい.試した環境はubuntu14.04.

確認方法は,python立ち上げて

>>> import numpy
>>> numpy.show_config()

lapack_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3']
    define_macros = [('NO_ATLAS_INFO', 3)]
blas_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers']
    define_macros = [('NO_ATLAS_INFO', 3)]

にて確認する.

調べた結果,update-alternativesを使う方法等が様々出てきたが,そちらの方は挙動がおかしかったので,直接OpenBLASを設定してnumpyをコンパイルする方法を備忘録として記載

参考

  • ubuntu 14.04でBLASを使う(link)
  • Installing Numpy and OpenBLAS(link)
  • (numpy, scipyちょっと遅い気がするって時はblas, lapack, atlasが入っているか見直しましょうlink)

事前準備

OpenBLASをインストールする前準備として, python-devとgfortranをインストールする.

~$ sudo apt-get install git python-dev gfortran

OpenBLASインストール

gitからOpenBLASをダウンロードし,gfortranにてmake,installする./opt/openblas/にインストールされていることを確認する.

~$ git clone https://github.com/xianyi/OpenBLAS
~$ cd OpenBLAS
~$ make FC=gfortran
~$ sudo make PREFIX=/opt/openblas install

その後,OpenBLASへのpathを設定しておく.~/.bashrc等に記載しておくとよい.

~$ export LD_LIBRARY_PATH=/opt/OpenBLAS/lib:$LD_LIBRARY_PATH

複数ユーザで使う場合は,

~$ sudo -s "echo '/opt/OpenBLAS/lib' > /etc/ld.so.conf.d/openblas.conf"

設定が終わった後,

~$ sudo ldconfig

を実行する.

numpyインストール

gitからnumpyをダウンロードし,site.cfgにopenblas設定を記載

~$ git clone https://github.com/numpy/numpy
~$ cd numpy
~$ cp site.cfg.example site.cfg
~$ vi site.cfg

site.cfgの以下の部分をコメント解除する.

[openblas]
libraries = openblas
library_dirs = /opt/OpenBLAS/lib
include_dirs = /opt/OpenBLAS/include

その後,~$ python setup.py configにて設定変更がうまくいっているかを確認する.

openblas_info:
  FOUND:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/opt/openblas/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]

  FOUND:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/opt/openblas/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]

上記を確認後,~$ python setup.py build && python setup.py installにてビルド・インストールする.

動作確認

ここにあるコードで,速度を確認する.使用するスレッドの数はOMP_NUM_THREADSにて指定する(下の例は5000*5000の行列計算).

~$ OMP_NUM_THREADS=1 python test_numpy.py
version: 1.12.0.dev0+3c394f7
maxint:  9223372036854775807

BLAS info:
 * libraries ['openblas', 'openblas']
 * library_dirs ['/opt/openblas/lib']
 * define_macros [('HAVE_CBLAS', None)]
 * language c

dot: 4.537050 sec
~$ OMP_NUM_THREADS=8 python test_numpy.py
version: 1.12.0.dev0+3c394f7
maxint:  9223372036854775807

BLAS info:
 * libraries ['openblas', 'openblas']
 * library_dirs ['/opt/openblas/lib']
 * define_macros [('HAVE_CBLAS', None)]
 * language c

dot: 1.855611 sec

scipyインストール

上記でnumpyがインストールできれば,あとはpipでscipyをインストールするだけです.

pip install scipy