numpy
とともにOpenBLAS
をインストールしようとしていますが、site.cfg
ファイルを書き込む必要があります。
インストール手順 を実行すると、エラーなしでインストールが完了しましたが、OpenBLASが使用するスレッド数を1(環境変数OMP_NUM_THREADSで制御)から増やすとパフォーマンスが低下します。
OpenBLASの統合が完璧かどうかはわかりません。誰でもsite.cfg
ファイルで同じことを実現します。
追伸:Pythonに基づいた Theano などの他のツールキットへのOpenBLASの統合は、同じマシン上でスレッド数の増加に対して大幅なパフォーマンス向上を実現します。
numpy
統合でvirtualenv
内でOpenBLAS
をコンパイルしたところ、正常に動作しているようです。
これは私のプロセスでした:
OpenBLAS
のコンパイル:
$ git clone https://github.com/xianyi/OpenBLAS
$ cd OpenBLAS && make FC=gfortran
$ Sudo make PREFIX=/opt/OpenBLAS install
管理者権限がない場合は、PREFIX=
を書き込み権限のあるディレクトリに設定できます(以下の対応する手順を適宜変更します)。
libopenblas.so
を含むディレクトリが共有ライブラリの検索パスにあることを確認してください。
これをローカルで行うには、~/.bashrc
ファイルを編集して次の行を含めることができます
export LD_LIBRARY_PATH=/opt/OpenBLAS/lib:$LD_LIBRARY_PATH
LD_LIBRARY_PATH
環境変数は、新しいターミナルセッションを開始すると更新されます(同じセッション内で強制的に更新するには、$ source ~/.bashrc
を使用します)。
複数のユーザーに対して機能する別のオプションは、.conf
行に/etc/ld.so.conf.d/
を含む/opt/OpenBLAS/lib
ファイルを作成することです。例:
$ Sudo sh -c "echo '/opt/OpenBLAS/lib' > /etc/ld.so.conf.d/openblas.conf"
いずれかのオプションが完了したら、実行します
$ Sudo ldconfig
numpy
ソースコードを取得します。
$ git clone https://github.com/numpy/numpy
$ cd numpy
site.cfg.example
をsite.cfg
にコピーして、コピーを編集します。
$ cp site.cfg.example site.cfg
$ nano site.cfg
これらの行のコメントを解除します。
....
[openblas]
libraries = openblas
library_dirs = /opt/OpenBLAS/lib
include_dirs = /opt/OpenBLAS/include
....
設定の確認、ビルド、インストール(オプションでvirtualenv
内)
$ 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)]
...
pip
はパッケージメタデータを追跡するため、pip
を使用したインストールはpython setup.py install
の使用よりも preferable です。将来、numpyを簡単にアンインストールまたはアップグレードできるようにします。
$ pip install .
オプション: このスクリプト を使用して、さまざまなスレッド数のパフォーマンスをテストできます。
$ OMP_NUM_THREADS=1 python build/test_numpy.py
version: 1.10.0.dev0+8e026a2
maxint: 9223372036854775807
BLAS info:
* libraries ['openblas', 'openblas']
* library_dirs ['/opt/OpenBLAS/lib']
* define_macros [('HAVE_CBLAS', None)]
* language c
dot: 0.099796795845 sec
$ OMP_NUM_THREADS=8 python build/test_numpy.py
version: 1.10.0.dev0+8e026a2
maxint: 9223372036854775807
BLAS info:
* libraries ['openblas', 'openblas']
* library_dirs ['/opt/OpenBLAS/lib']
* define_macros [('HAVE_CBLAS', None)]
* language c
dot: 0.0439578056335 sec
スレッド数を増やすと、パフォーマンスが著しく向上するようです。ただし、これを体系的にテストしたことはありません。小さなマトリックスの場合、追加のオーバーヘッドが、スレッド数の増加によるパフォーマンスの利点を上回る可能性があります。
Ubuntuまたはmintを使用している場合に備えて、numpyとopenblasの両方をapt-getを介してapt-get経由でインストールすることで、numblaにリンクされたopenblasを簡単に作成できます。
Sudo apt-get install numpy libopenblas-dev
新しいdocker ubuntuで、ブログの投稿からコピーした次のスクリプトをテストしました "Installing Numpy and OpenBLAS"
import numpy as np
import numpy.random as npr
import time
# --- Test 1
N = 1
n = 1000
A = npr.randn(n,n)
B = npr.randn(n,n)
t = time.time()
for i in range(N):
C = np.dot(A, B)
td = time.time() - t
print("dotted two (%d,%d) matrices in %0.1f ms" % (n, n, 1e3*td/N))
# --- Test 2
N = 100
n = 4000
A = npr.randn(n)
B = npr.randn(n)
t = time.time()
for i in range(N):
C = np.dot(A, B)
td = time.time() - t
print("dotted two (%d) vectors in %0.2f us" % (n, 1e6*td/N))
# --- Test 3
m,n = (2000,1000)
A = npr.randn(m,n)
t = time.time()
[U,s,V] = np.linalg.svd(A, full_matrices=False)
td = time.time() - t
print("SVD of (%d,%d) matrix in %0.3f s" % (m, n, td))
# --- Test 4
n = 1500
A = npr.randn(n,n)
t = time.time()
w, v = np.linalg.eig(A)
td = time.time() - t
print("Eigendecomp of (%d,%d) matrix in %0.3f s" % (n, n, td))
Openblasがなければ、結果は次のようになります。
dotted two (1000,1000) matrices in 563.8 ms
dotted two (4000) vectors in 5.16 us
SVD of (2000,1000) matrix in 6.084 s
Eigendecomp of (1500,1500) matrix in 14.605 s
apt install openblas-dev
でopenblasをインストールした後、numpyリンケージをチェックしました
import numpy as np
np.__config__.show()
そして情報は
atlas_threads_info:
NOT AVAILABLE
openblas_info:
NOT AVAILABLE
atlas_blas_info:
NOT AVAILABLE
atlas_3_10_threads_info:
NOT AVAILABLE
blas_info:
library_dirs = ['/usr/lib']
libraries = ['blas', 'blas']
language = c
define_macros = [('HAVE_CBLAS', None)]
mkl_info:
NOT AVAILABLE
atlas_3_10_blas_threads_info:
NOT AVAILABLE
atlas_3_10_blas_info:
NOT AVAILABLE
openblas_lapack_info:
NOT AVAILABLE
lapack_opt_info:
library_dirs = ['/usr/lib']
libraries = ['lapack', 'lapack', 'blas', 'blas']
language = c
define_macros = [('NO_ATLAS_INFO', 1), ('HAVE_CBLAS', None)]
blas_opt_info:
library_dirs = ['/usr/lib']
libraries = ['blas', 'blas']
language = c
define_macros = [('NO_ATLAS_INFO', 1), ('HAVE_CBLAS', None)]
atlas_info:
NOT AVAILABLE
blas_mkl_info:
NOT AVAILABLE
lapack_mkl_info:
NOT AVAILABLE
atlas_3_10_info:
NOT AVAILABLE
lapack_info:
library_dirs = ['/usr/lib']
libraries = ['lapack', 'lapack']
language = f77
atlas_blas_threads_info:
NOT AVAILABLE
OpenBlasへのリンクは表示されません。ただし、スクリプトの新しい結果は、numpyがopenblasを使用している必要があることを示しています。
dotted two (1000,1000) matrices in 15.2 ms
dotted two (4000) vectors in 2.64 us
SVD of (2000,1000) matrix in 0.469 s
Eigendecomp of (1500,1500) matrix in 2.794 s
これは@ALi_mの答えよりも簡単なアプローチで、macOSで動作します。
Gfortranコンパイラーがない場合はインストールします。例えば。 macOSでhomebrewを使用:
$ brew install gcc
ソースからOpenBLAS
をコンパイルします[リリースのインストールは、未リリースのバグ修正が必要でない限り機能します]:
$ git clone https://github.com/xianyi/OpenBLAS
$ cd OpenBLAS && make FC=gfortran
$ Sudo make PREFIX=/opt/OpenBLAS install
Sudoをしない/できない場合は、PREFIX=
別のディレクトリに移動し、次の手順でパスを変更します。
OpenBLASは、コンパイラインクルードパスまたはリンカーライブラリパス上にある必要はありません。
ダウンロード https://github.com/numpy/numpy/blob/master/site.cfg.example to ~/.numpy-site.cfg
、これらの行のコメントを外し、編集して手順2で使用したPREFIXパスを指定します。
[openblas]
libraries = openblas
library_dirs = /opt/OpenBLAS/lib
include_dirs = /opt/OpenBLAS/include
pip-install numpyとscipyをソースから(できればvirtualenvに)手動でダウンロードすることなく[リリースバージョンも指定できます]:
pip install numpy scipy --no-binary numpy,scipy
それをテストする方法については、他の回答をご覧ください。