Jak sprawdzić połączenie BLAS / LAPACK w NumPy i SciPy?

128

Buduję swoje środowisko numpy / scipy w oparciu o blas i lapack mniej więcej na podstawie tego przejścia.

Kiedy skończę, jak mogę sprawdzić, czy moje funkcje numpy / scipy naprawdę używają wcześniej zbudowanych funkcji blas / lapack?

Woltan
źródło

Odpowiedzi:

296

Metoda numpy.show_config()(lub numpy.__config__.show()) wyświetla informacje o powiązaniach zebrane w czasie kompilacji. Mój wynik wygląda tak. Myślę, że to oznacza, że ​​używam BLAS / LAPACK, który jest dostarczany z systemem Mac OS.

>>> 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
źródło
4
Biorąc pod uwagę jego powszechną użyteczność, numpy.__config__powinien naprawdę być publicznym API. Niemniej jednak wygrywasz tę rundę, Davost .
Cecil Curry,
2
Czyli sam fakt, który lapack_opt_infojest pokazany, oznacza, że ​​numpy jest powiązany z lapackiem?
DanHickstein
43
Jak interpretujesz wynik?
Edward Newell
18
@CecilCurry Możesz użyć numpy.show_config(), co jest prawdopodobnie publiczną funkcją API ze względu na brak początkowych podkreśleń. Ale nie jest to udokumentowane online i nie ma dokumentów, więc nie jest zaskoczeniem, że tak trudno je znaleźć. Miejmy nadzieję, że to naprawią.
Praveen
8
jak mogę sprawdzić, który pakiet jest faktycznie używany, gdy wyświetlanych jest wiele pakietów?
Jonasson,
28

To, czego szukasz, to: informacje o systemie

Skompilowałem numpy / scipy z atlasem i mogę to sprawdzić za pomocą:

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

Więcej poleceń znajdziesz w dokumentacji.

rabra
źródło
36
Wydaje się, że nie pokazuje to, czy numpy obecnie używa ATLAS-a, tylko czy ATLAS zostanie połączony z nim podczas następnej kompilacji numpy. Skompilowałem numpy przed ATLASEM. Działało bardzo wolno, dopóki nie skompilowałem ponownie numpy (pewnie), ale zarówno przed, jak i po ponownej kompilacji numpy sysinfo.get_info ('atlas') pokazał to samo wyjście. Jak sprawdzić aktualny stan rzeczy?
dmytro
5
Jak zinterpretować wynik?
Eric O Lebigot
3
Być może masz zainstalowany „blas” zamiast „atlas” (dzieje się tak, gdy instalujesz openblas na dystrybucjach opartych na Debianie).
Malcolm
4
odpowiedź Davosta należała prawdopodobnie przyjąć zamiast tej odpowiedzi, która nie odpowiada na aktualne pytanie. Ponieważ ta odpowiedź odkrywa interesującą maszynerię do rozwiązywania innych powiązanych pytań, serdecznie dziękuję!
Cecil Curry,
2
@rabra sysinfo.get_info('atlas')nic dla mnie nie sysinfo.get_info('blas')zwrócił, ale wrócił {'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']} i sysinfo.get_info('lapack')wrócił {'language': 'f77', 'libraries': ['lapack', 'lapack'], 'library_dirs': ['/usr/lib']} Co to znaczy?
SebMa
9

Możesz użyć narzędzia zależności modułu ładującego link, aby przyjrzeć się komponentom przechwytującym na poziomie C twojej kompilacji i sprawdzić, czy mają one zewnętrzne zależności od wybranego blas i lapack. Nie jestem teraz w pobliżu Linux-a, ale na komputerze z systemem OS X możesz to zrobić w katalogu site-packages, w którym znajdują się instalacje:

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

zastąp lddzamiast otoolw systemie gnu / Linux i powinieneś otrzymać odpowiedzi, których potrzebujesz.

talonmies
źródło
1
A co jeśli nie ma pliku numpy/core/_dotblas.so? (patrz komentarz pod odpowiedzią Ricardos)
Woltan
@Woltan: albo coś jest poważnie zepsute, albo szukasz w złym miejscu. W każdej instalacji numpy w systemie Linux i OS X, jaką kiedykolwiek widziałem, pojawi się _dotblas.sointerfejs, który jest opakowaniem interfejsu do dowolnego blas, który został użyty do zbudowania dystrybucji. W _dotblas.pydsystemie Windows zostanie wywołany , ale funkcja jest taka sama.
talonmies
3
Wygląda na to, że _dotblas.sojest zbudowany tylko wtedy, gdy używasz [atlas]sekcji w site.cfg(i biblioteki BLAS z obsługą CBLAS). Dlatego powinieneś tego używać, nawet jeśli nie używasz ATLAS (z wyjątkiem sytuacji, gdy używasz Intel MKL, który ma dedykowaną sekcję).
Kenneth Hoste
Rzeczywiście, kiedy BLAS nie jest dostępny podczas budowania NumPy, buduje własne procedury iloczynu skalarnego. Mogą być o dwa rzędy wielkości wolniejsze niż ATLAS.
Fred Foo
5
_dotblas.sojuż nie istnieje w numpy v1.10 i nowszych , ale możesz sprawdzić powiązanie multiarray.sozamiast
ali_m
6

Możesz wyświetlić połączenie BLAS, LAPACK, MKL za pomocą show_config():

import numpy as np
np.show_config()

Co dla mnie daje wynik:

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
źródło
1
Jak Pan interpretuje ('HAVE_CBLAS', None)]?
seralouk
@serafeim Zobacz link . Zasadniczo oznacza to, że HAVE_CBLASjest definiowane, ale nie ma wartości (pomyśl C #define HAVE_CBLAS:). Nie wymaga wartości, ponieważ jest używana tylko jako flaga. Zinterpretowałbym to jako HAVE_CBLAS=True. Gdybyś nie miał CBLAS, w ogóle nie miałbyś tam krotki.
MT,
Chcę tylko wiedzieć, czy moje numpy jest połączone z blasem, aby obliczenia algebry liniowej były wystarczająco szybkie. Rozumiem: imgur.com/a/SsrDqg5 . Jak to interpretujesz?
seralouk
@makis numpy jest powiązany z openblas
MT
0

Jeśli zainstalowałeś anaconda-navigator (na www.anaconda.com/anaconda/install/ dla linux, Windows lub macOS) - wszystkie blas, scipy i numpy zostaną zainstalowane i możesz je zobaczyć, klikając zakładkę środowiska po lewej stronie ekranu głównego nawigatora strona (poszukaj każdego katalogu w kolejności alfa). Zainstalowanie pełnej anakondy (w przeciwieństwie do minikondy lub pojedynczych pakietów) zajmie się zainstalowaniem wielu niezbędnych pakietów potrzebnych do nauki o danych.

Dan T
źródło