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?

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

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.


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.


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']

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.