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?
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)]
numpy.__config__
powinien naprawdę być publicznym API. Niemniej jednak wygrywasz tę rundę, Davost .lapack_opt_info
jest pokazany, oznacza, że numpy jest powiązany z lapackiem?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ą.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.
źródło
sysinfo.get_info('atlas')
nic dla mnie niesysinfo.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']}
isysinfo.get_info('lapack')
wrócił{'language': 'f77', 'libraries': ['lapack', 'lapack'], 'library_dirs': ['/usr/lib']}
Co to znaczy?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
ldd
zamiastotool
w systemie gnu / Linux i powinieneś otrzymać odpowiedzi, których potrzebujesz.źródło
numpy/core/_dotblas.so
? (patrz komentarz pod odpowiedzią Ricardos)_dotblas.so
interfejs, który jest opakowaniem interfejsu do dowolnego blas, który został użyty do zbudowania dystrybucji. W_dotblas.pyd
systemie Windows zostanie wywołany , ale funkcja jest taka sama._dotblas.so
jest zbudowany tylko wtedy, gdy używasz[atlas]
sekcji wsite.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ę)._dotblas.so
już nie istnieje w numpy v1.10 i nowszych , ale możesz sprawdzić powiązaniemultiarray.so
zamiastMoż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']
źródło
('HAVE_CBLAS', None)]
?HAVE_CBLAS
jest 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 jakoHAVE_CBLAS=True
. Gdybyś nie miał CBLAS, w ogóle nie miałbyś tam krotki.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.
źródło