2012-07-11 9 views
44

numpyOpenBLASをインストールしようとしていますが、site.cfgファイルの書き方を忘れています。OpenBLASインテグレーションでnumpyをコンパイルする

インストールがエラーなく完了した後、OpenBLASが使用するスレッド数を1(環境変数OMP_NUM_THREADSによって制御される)から1に増やすと、パフォーマンスが低下します。

OpenBLASの統合が完璧かどうかはわかりません。いずれかが同じを達成するためにファイルsite.cfgを提供することができます。

P .: OpenBLASをTheanoのような他のツールキットと統合することは、Pythonに基づいており、同じマシン上でスレッド数を増やすことでパフォーマンスが大幅に向上します。

+0

とき、あなたは問題が追加のスレッドを正当化するのに十分な大きさだったと確信している、パフォーマンスの低下があったことを言うの?あまりにも小さな問題については、余分なスレッドを使用するとパフォーマンスが低下し、openblasがスマートなので、余分なスレッドを使用するだけで十分であるかどうかはわかりません。 – DaveP

+0

問題のサイズと性能の違いを調べるために、さまざまなサイズ(100x100,100x1000,1000x1000,1000x10000,10000x10000)のランダムに生成された行列に対してnumpy.linalg.svd関数を使用してみましたが、最もよい実行時間はopenblasの単一の糸によって達成されます。計算負荷が高い場合(例えば、10000×10000行列SVD)でも、単一スレッドは5000秒かかる一方、3スレッドは6000秒かかる。これは少し心配です、私はちょうどオープンブレンドの統合が正しいかどうかチェックしたいと思います。 – Vijay

答えて

82

私はちょうどとOpenBLASの統合でnumpyをコンパイルしました。これは正常に動作しているようです。

これは私のプロセスだった:

  1. コンパイルOpenBLAS

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

    あなたが管理者権限を持っていない場合、あなただけの変更(あなたが書き込み権限を持っているディレクトリにPREFIX=を設定することができます対応する以下の対応するステップ)。

  2. libopenblas.soを含むディレクトリが共有ライブラリ検索パスに含まれていることを確認してください。

    • ローカルでこれを行うには、あなたが新しいターミナルセッションを開始するときに、ライン

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

      LD_LIBRARY_PATH環境変数が更新されます含めるためにあなたの~/.bashrcファイルを編集できます(更新を強制するために$ 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 
    
  3. グラブnumpyソースコードを実行します。site.cfg

    $ git clone https://github.com/numpy/numpy 
    $ cd numpy 
    
  4. コピーsite.cfg.exampleをしてコピーを編集:

    $ cp site.cfg.example site.cfg 
    $ nano site.cfg 
    

    のコメントを解除し、これらの行:

    .... 
    [openblas] 
    libraries = openblas 
    library_dirs = /opt/OpenBLAS/lib 
    include_dirs = /opt/OpenBLAS/include 
    .... 
    
  5. チェック設定は、ビルド、出力は次のようになります

    $ python setup.py config 
    

    virtualenvの内側に、必要に応じて)インストールします。

    ... 
    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)] 
    ... 
    

    ウィットをインストールするpippython setup.py installを使用するとpreferableになります。pipはパッケージのメタデータを追跡し、今後numpyを簡単にアンインストールまたはアップグレードすることができます。オプション

    $ pip install . 
    
  6. :あなたは別のスレッドカウントのパフォーマンスをテストするためにthis scriptを使用することができます。

    $ 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のか、ミントを使用している場合には、あなたが簡単にopenblasは、新鮮なドッキングウィンドウのUbuntuで

sudo apt-get install numpy libopenblas-dev 

としてapt-getを経由してnumpyのとopenblasの両方をインストールすることでnumpyのをリンクすることができ

+4

テストスクリプト/linalg/lapack_lite.soでfoolowingエラーを起こしてしまったことを適用します:未定義シンボル:zgelsd_ – erogol

+1

私は厳密に答えの上に入力したものであっても次の行があります。 libopenblas.so.0 => /usr/lib/libopenblas.so.0(0x00007f77e08fc000) – erogol

+0

もう1つ質問があります。 OpenBlasはOpenMPIに依存していますか?それを使用するとパフォーマンスが向上しますか? – erogol

4

、私は次のスクリプトをテスト結果openblasなければ"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)) 

ブログ記事からコピーされます。

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をインストールした後

は、私が

import numpy as np 
np.__config__.show() 

でnumpyのリンケージをチェックした情報は、それがopenblasにリンクが表示されない

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 

です。しかし、スクリプトの新しい結果が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 
関連する問題