54

でインストールしようとしnumpyていますが、ファイルOpenBLASをどのように書き込む必要があるかわかりません。site.cfg

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

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

PS: Python ベースのTheanoなどの他のツールキットに OpenBLAS を統合すると、同じマシン上でスレッド数を増やすとパフォーマンスが大幅に向上します。

4

3 に答える 3

100

統合されnumpyた内部でvirtualenvコンパイルしたところ、問題なく動作しているようです。OpenBLAS

これが私のプロセスでした:

  1. コンパイルOpenBLAS:

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

    管理者権限がない場合PREFIX=は、書き込み権限のあるディレクトリに設定できます (それに応じて、以下の対応する手順を変更してください)。

  2. を含むディレクトリが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
    
  3. ソースnumpyコードを取得します。

    $ git clone https://github.com/numpy/numpy
    $ cd numpy
    
  4. コピー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
    ....
    
  5. 構成の確認、ビルド、インストール (オプションで a 内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)]
    ...
    

    パッケージのメタデータを追跡し、将来 numpy を簡単にアンインストールまたはアップグレードできるようにするためpip、を使用するよりも を使用してインストールすることをお勧めします。python setup.py installpip

    $ pip install .
    
  6. オプション:このスクリプトを使用して、さまざまなスレッド数のパフォーマンスをテストできます。

    $ 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
    

スレッド数が多いほど、パフォーマンスが著しく向上するようです。ただし、これを体系的にテストしたことはありません。行列が小さい場合、追加のオーバーヘッドが、スレッド数を増やすことによるパフォーマンスの利点を上回る可能性があります。

于 2013-01-18T02:50:38.297 に答える
9

ubuntuまたはmintを使用している場合に備えて、apt-get asを介してnumpyとopenblasの両方をインストールすることにより、openblasを簡単にnumpyにリンクできます

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

でopenblasをインストールした後apt install openblas-dev、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
于 2016-07-04T17:34:26.320 に答える