Wie überprüfe ich die BLAS / LAPACK-Verknüpfung in NumPy und SciPy?

126

Ich baue meine numpy / scipy Umgebung basierend auf Blas und Lapack mehr oder weniger basierend auf diesem Durchgang auf.

Wenn ich fertig bin, wie kann ich überprüfen, ob meine Numpy / Scipy-Funktionen wirklich die zuvor erstellten Blas / Lapack-Funktionen verwenden?

Woltan
quelle

Antworten:

293

Die Methode numpy.show_config()(oder numpy.__config__.show()) gibt Informationen zur Verknüpfung aus, die zum Zeitpunkt der Erstellung erfasst wurden. Meine Ausgabe sieht so aus. Ich denke, es bedeutet, dass ich das BLAS / LAPACK verwende, das mit Mac OS geliefert wird.

>>> 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)]
Davost
quelle
4
Aufgrund seiner weit verbreiteten Nützlichkeit numpy.__config__sollte es sich wirklich um eine öffentliche API handeln. Trotzdem gewinnst du diese Runde, Davost .
Cecil Curry
2
Die bloße Tatsache, lapack_opt_infodie gezeigt wird, bedeutet also, dass Numpy mit Lapack verbunden ist?
DanHickstein
41
Wie interpretieren Sie die Ausgabe?
Edward Newell
18
@CecilCurry Sie können verwenden numpy.show_config(), was wahrscheinlich eine öffentliche API-Funktion ist, da keine Startunterstriche vorhanden sind . Aber es ist nicht online dokumentiert und hat keine Dokumentzeichenfolge, daher ist es keine Überraschung, dass es so schwer zu finden ist. Hoffentlich werden sie das beheben.
Praveen
7
Wie finde ich heraus, welches Paket tatsächlich verwendet wird, wenn mehrere Pakete angezeigt werden?
Jonasson
28

Was Sie suchen, ist Folgendes: Systeminformationen

Ich habe numpy / scipy mit atlas zusammengestellt und kann dies überprüfen mit:

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

Weitere Befehle finden Sie in der Dokumentation.

Rabra
quelle
35
Dies scheint nicht zu zeigen, ob numpy derzeit ATLAS verwendet, sondern nur, ob ATLAS bei der nächsten numpy-Kompilierung verknüpft wird. Ich hatte numpy vor ATLAS zusammengestellt. Es funktionierte sehr langsam, bis ich numpy neu kompilierte (sicher), aber sowohl vor als auch nach der numpy-Neukompilierung zeigte sysinfo.get_info ('atlas') dieselbe Ausgabe. Wie kann man den aktuellen Stand der Dinge überprüfen?
Dmytro
4
Wie ist die Ausgabe zu interpretieren?
Eric O Lebigot
2
Möglicherweise haben Sie 'blas' anstelle von 'atlas' installiert (dies geschieht, wenn Sie openblas auf debian-basierten Distributionen installieren).
Malcolm
4
Die Antwort von Davost hätte wahrscheinlich anstelle dieser Antwort akzeptiert werden müssen, die die vorliegende Frage nicht beantwortet. Da diese Antwort interessante Mechanismen zur Lösung anderer verwandter Fragen aufdeckt, ist es trotzdem ein herzliches Dankeschön!
Cecil Curry
2
@ Rabra hat sysinfo.get_info('atlas')nichts für mich zurückgegeben, aber sysinfo.get_info('blas')zurückgegeben {'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']} und sysinfo.get_info('lapack')zurückgegeben {'language': 'f77', 'libraries': ['lapack', 'lapack'], 'library_dirs': ['/usr/lib']} Was bedeutet das?
SebMa
11

Da die dynamisch geladenen Versionen verwendet werden, können Sie Folgendes tun:

$ ldd anyoftheCmodules.so

wo anyoftheCmodules.sokönnte zum Beispiel sein numpy/core/_dotblas.so, welche Links zu libblas.so.

Ricardo Cárdenes
quelle
1
Was ist, wenn keine Datei vorhanden ist numpy/core/_dotblas.so? (siehe Kommentar unten Talonmies Antwort)
Woltan
1
Es müssen nur einige .soDateien darin sein. Suchen Sie einfach im NumPy-Verzeichnis (z. B. mit find /path/to/numpy -name "*.so"). Ein paar von denen ( _dotblas.so, lapack_lite.sounter Ubuntu vorkompilierte ein, zum Beispiel) nutzt BLAS / LAPACK
Ricardo Cárdenes
6
_dotblas.soexistiert nicht mehr in numpy v1.10 und neuer , aber Sie können die Verknüpfung von multiarray.sostattdessen überprüfen
ali_m
Es sollte erwähnt werden, dass diese Lösung sowohl Linux-spezifisch als auch fragil ist. Sie möchten wirklich, wirklich nur zur numpy.__config__Laufzeit auf das kanonische Objekt zugreifen . (Siehe Davosts ausgezeichnete Antwort .)
Cecil Curry
Es ist in der Tat Linux-spezifisch und ich stimme zu, dass die @ davost-Methode besser ist. Ich verstehe nicht, warum meine Antwort immer wieder positiv bewertet wird.
Ricardo Cárdenes
8

Sie können das Link Loader-Abhängigkeitstool verwenden, um die C-Level-Hook-Komponenten Ihres Builds zu überprüfen und festzustellen, ob sie externe Abhängigkeiten von Ihren Blas und dem Lapack Ihrer Wahl aufweisen. Ich bin momentan nicht in der Nähe einer Linux-Box, aber auf einem OS X-Computer können Sie dies im Verzeichnis site-packages tun, in dem sich die Installationen befinden:

$ 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)

Ersetzen Sie lddanstelle otooleines Gnu / Linux-Systems und Sie sollten die Antworten erhalten, die Sie benötigen.

Talonmien
quelle
1
Was ist, wenn keine Datei vorhanden ist numpy/core/_dotblas.so? (siehe Kommentar unter Ricardos Antwort)
Woltan
@Woltan: Entweder ist etwas ernsthaft kaputt oder du suchst am falschen Ort. Bei jeder Linux- und OS X-Numpy-Installation, die ich je gesehen habe, wird es einen _dotblas.soInterface-Wrapper für alle Blas geben, die zum Erstellen der Distribution verwendet wurden. Unter Windows wird es aufgerufen _dotblas.pyd, aber die Funktion ist dieselbe.
Talonmies
3
Es scheint, dass _dotblas.soes nur erstellt wird, wenn Sie einen [atlas]Abschnitt in site.cfg(und eine CBLAS-fähige BLAS-Bibliothek) verwenden. Sie sollten dies also verwenden, auch wenn Sie ATLAS nicht verwenden (außer wenn Sie Intel MKL verwenden, das über einen eigenen Abschnitt verfügt).
Kenneth Hoste
Wenn beim Erstellen von NumPy kein BLAS verfügbar ist, werden eigene Punktproduktroutinen erstellt. Diese können zwei Größenordnungen langsamer sein als ATLAS.
Fred Foo
5
_dotblas.soexistiert nicht mehr in numpy v1.10 und neuer , aber Sie können die Verknüpfung von multiarray.sostattdessen überprüfen
ali_m
6

Sie können die BLAS-, LAPACK- und MKL-Verknüpfung anzeigen mit show_config():

import numpy as np
np.show_config()

Was für mich Ausgabe gibt:

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']
MT
quelle
1
Wie interpretierst du ('HAVE_CBLAS', None)]?
Seralouk
@serafeim Siehe Link . Es bedeutet im Wesentlichen, dass HAVE_CBLASdefiniert wird, aber keinen Wert hat (denken Sie an C :) #define HAVE_CBLAS. Es wird kein Wert benötigt, da es nur als Flag verwendet wird. Ich würde es als interpretieren HAVE_CBLAS=True. Wenn Sie kein CBLAS hätten, hätten Sie das Tupel dort überhaupt nicht.
MT
Ich möchte nur wissen, ob meine Zahl mit blas verknüpft ist, damit die Berechnung der linearen Algebra schnell genug ist. Ich verstehe das: imgur.com/a/SsrDqg5 . Wie interpretieren Sie das?
Seralouk
@makis numpy ist mit openblas verbunden
MT
0

Wenn Sie anaconda-navigator installiert haben (unter www.anaconda.com/anaconda/install/ für Linux, Windows oder macOS), werden blas, scipy und numpy installiert und Sie können sie anzeigen, indem Sie auf die Registerkarte Umgebungen auf der linken Seite der Navigator-Startseite klicken Seite (suchen Sie nach jedem Verzeichnis in Alpha-Reihenfolge). Durch die Installation der vollständigen Anaconda (im Gegensatz zu Miniconda oder einzelnen Paketen) werden viele der für die Datenwissenschaft erforderlichen wesentlichen Pakete installiert.

Dan T.
quelle