NumPyとSciPyでBLAS / LAPACKリンケージを確認する方法は?


126

私はblasに基づいて私のnumpy / scipy環境を構築していますが、これに多少基づいていますウォークスルーにています。

完了したら、numpy / scipy関数が以前に構築されたblas / lapack機能を実際に使用していることをどのように確認できますか?

回答:


293

メソッドnumpy.show_config()(またはnumpy.__config__.show())は、ビルド時に収集されたリンケージに関する情報を出力します。出力は次のようになります。Mac OSに同梱されているBLAS / LAPACKを使用しているということです。

>>> import numpy as np
>>> np.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)]

4
その広範な有用性を考えると、numpy.__config__実際にはパブリックAPIである必要があります。それにもかかわらず、あなたはこのラウンドに勝ちます、davost
セシルカレー

2
それで、lapack_opt_info示されている単なる事実は、numpyがlapackにリンクされていることを意味しますか?
DanHickstein 2016年

42
出力をどのように解釈しますか?
エドワードニューウェル

18
@CecilCurryを使用できますnumpy.show_config()。これは、開始アンダースコアがないため、おそらくパブリックAPI関数です。しかし、オンラインで文書化されておらず、docstringもないため、見つけるのが難しいのは当然のことです。うまくいけば、彼らはそれを修正します。
Praveen 2017

8
複数のパッケージが表示されているときに実際に使用されているパッケージを確認するにはどうすればよいですか?
ジョナソン

28

あなたが探しているのはこれです: システム情報

私はアトラスでnumpy / scipyをコンパイルしました、そして私はこれを次のようにチェックできます:

import numpy.distutils.system_info as sysinfo
sysinfo.get_info('atlas')

その他のコマンドについては、ドキュメントを確認してください。


35
これは、numpyが現在ATLASを使用しているかどうかを示しているようではなく、次のnumpyコンパイル時にATLASがリンクされるかどうかだけを示しています。ATLASの前にnumpyをコンパイルしました。numpy(確かなもの)を再コンパイルするまでは非常に遅く動作しましたが、numpy再コンパイルの前と後の両方で、sysinfo.get_info( 'atlas')は同じ出力を示しました。現状を確認するには?
dmytro 2013年

4
出力を解釈する方法は?
Eric O Lebigot 2013年

2
「atlas」の代わりに「blas」がインストールされている可能性があります(これは、debianベースのディストリビューションにopenblasをインストールした場合に発生します)。
マルコム

4
davostの回答は、おそらくこの回答の代わりに受け入れられるべきでしたが、これは当面の問題に対処することができません。この回答は、他の関連する質問を解決する上で役立つ興味深い仕組みを明らかにしているので、心から感謝します。
Cecil Curry、

2
@rabra sysinfo.get_info('atlas')は何も返さなかったが、sysinfo.get_info('blas')戻っ{'include_dirs': ['/usr/local/include', '/usr/include', '/opt/local/include', '/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/include'], 'libraries': ['blas', 'blas'], 'library_dirs': ['/usr/lib']}sysinfo.get_info('lapack')きて戻っ てきた {'language': 'f77', 'libraries': ['lapack', 'lapack'], 'library_dirs': ['/usr/lib']} どういう意味ですか?
SebMa 2017年

11

動的にロードされたバージョンを使用するので、これを行うことができます:

$ ldd anyoftheCmodules.so

どこanyoftheCmodules.so可能性があり、例えば、numpy/core/_dotblas.soへ、どのリンクlibblas.so


1
ファイルがない場合はどうなりますnumpy/core/_dotblas.soか?(タロニーの回答の下のコメントを参照)
Woltan

1
そこにはいくつかの.soファイルがなければなりません。NumPyディレクトリ内を検索するだけです(たとえば、を使用find /path/to/numpy -name "*.so")。(これらのカップルの_dotblas.solapack_lite.so例えばUbuntuのプリコンパイルされた1下)BLAS / LAPACKのメイク使用
リカルドCárdenes

6
_dotblas.sonumpy v1.10以降に存在しませんが、multiarray.so代わりにリンケージを確認できます
ali_m

このソリューションはLinux固有であり、脆弱であることに注意してください。numpy.__config__代わりに、実行時に正規オブジェクトにアクセスしたいだけです。(davostの優れた回答を参照してください。)
セシルカレー

それは確かにLinux固有であり、@ davostメソッドの方が優れていることに同意します。なぜ私の回答が支持され続けるのかわかりません。
RicardoCárdenes、2016

8

リンクローダー依存関係ツールを使用して、ビルドのCレベルのフックコンポーネントを調べ、選択したblasおよびlapackに外部依存関係があるかどうかを確認できます。私は現在、Linuxボックスの近くではありませんが、OS Xマシンでは、インストールを保持するsite-packagesディレクトリ内でこれを行うことができます。

$ otool -L numpy/core/_dotblas.so 
numpy/core/_dotblas.so:
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
    /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 268.0.1)

$ otool -L scipy/linalg/flapack.so 
scipy/linalg/flapack.so (architecture i386):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
    /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 242.0.0)
scipy/linalg/flapack.so (architecture ppc):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)

$ otool -L scipy/linalg/fblas.so 
scipy/linalg/fblas.so (architecture i386):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
    /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 242.0.0)
scipy/linalg/fblas.so (architecture ppc):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)

gnu / Linuxシステムの代わりに置き換えるとlddotool必要な答えが得られるはずです。


1
ファイルがない場合はどうなりますnumpy/core/_dotblas.soか?(リカルドスの回答の下のコメントを参照)
Woltan

@ウォルタン:何かが深刻に壊れているか、間違った場所を探しています。私がこれまでに見たすべてのLinuxおよびOS Xのnumpyインストール_dotblas.soでは、ディストリビューションの構築に使用されたあらゆるブラスへのインターフェースラッパーであるa が存在します。Windowsではと呼ばれます_dotblas.pydが、機能は同じです。
talonmies 2012年

3
のセクション(およびCBLAS対応のBLASライブラリ)_dotblas.soを使用している場合にのみビルドされるようです。したがって、ATLASを使用していない場合でも(Intel MKLを使用している場合を除き、専用セクションがあるので)使用する必要があります。[atlas]site.cfg
Kenneth Hoste 2013年

実際、NumPyが構築されたときにBLASが利用できない場合、それは独自のドット積ルーチンを構築します。これらは、ATLASよりも2桁遅くなる可能性があります。
Fred Foo 2013

5
_dotblas.sonumpy v1.10以降に存在しませんが、multiarray.so代わりにリンケージを確認できます
ali_m

6

次を使用して、BLAS、LAPACK、MKLリンケージを表示できますshow_config()

import numpy as np
np.show_config()

私にとってはこれが出力を与えます:

mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
blas_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
blas_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
lapack_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
lapack_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']

1
どのように解釈し('HAVE_CBLAS', None)]ますか?
seralouk

@serafeim リンクを参照してください。それは本質的にそれHAVE_CBLASが定義されているが価値がないことを意味します(C:と考えてください#define HAVE_CBLAS)。フラグとしてのみ使用されるため、値は必要ありません。と解釈しますHAVE_CBLAS=True。CBLASがなければ、タプルはまったくありません。
MT

線形代数計算が十分に高速になるように、私のnumpyがblasにリンクされているかどうかを知りたいだけです。私はこれを取得します:imgur.com/a/SsrDqg5。これをどのように解釈しますか?
seralouk

@makis numpyはopenblasにリンクされています
MT

0

anaconda-navigator(Linux、WindowsまたはmacOSの場合はwww.anaconda.com/anaconda/install/)をインストールした場合-blas、scipy、およびnumpyがすべてインストールされ、navigatorホームの左側にある[環境]タブをクリックすると表示されますページ(各ディレクトリをアルファベット順に探します)。(ミニコンダや個々のパッケージではなく)完全なアナコンダをインストールすると、データサイエンスに必要な必須パッケージの多くがインストールされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.