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