Come controllare il collegamento BLAS / LAPACK in NumPy e SciPy?


126

Sto costruendo il mio ambiente intorpidito / scipy basato su blas e lapack più o meno sulla base di questa passeggiata.

Quando ho finito, come posso verificare che le mie funzioni numpy / scipy utilizzino davvero le funzionalità blas / lapack precedentemente costruite?

Risposte:


293

Il metodo numpy.show_config()(o numpy.__config__.show()) genera informazioni sul collegamento raccolte al momento della creazione. La mia uscita è simile a questa. Penso che significhi che sto usando BLAS / LAPACK fornito con 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
Data la sua utilità diffusa, numpy.__config__dovrebbe essere davvero un'API pubblica. Tuttavia, vinci questo round, David .
Cecil Curry,

2
Quindi, il semplice fatto che lapack_opt_infoviene mostrato significa che intorpidimento è collegato con il pacco?
Dan Hickstein

42
Come si interpreta l'output?
Edward Newell,

18
@CecilCurry È possibile utilizzare numpy.show_config(), che è probabilmente una funzione API pubblica in virtù dell'assenza di sottolineature iniziali. Ma non è documentato online e non ha docstring, quindi non sorprende che sia così difficile da trovare. Spero che lo risolvano.
Praveen,

8
come faccio a sapere quale pacchetto viene effettivamente utilizzato quando vengono visualizzati più pacchetti?
Jonasson

28

Quello che stai cercando è questo: informazioni di sistema

Ho compilato numpy / scipy con atlante e posso verificarlo con:

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

Controlla la documentazione per ulteriori comandi.


35
Questo non sembra mostrare se numpy attualmente utilizza ATLAS, ma solo se ATLAS verrà collegato durante la successiva compilazione numpy. Avevo compilato numpy prima di ATLAS. Ha funzionato molto lentamente fino a quando ho ricompilato numpy (cosa certa), ma sia prima che dopo la ricompilazione numpy sysinfo.get_info ('atlante') ha mostrato lo stesso risultato. Come verificare lo stato attuale delle cose?
dmytro,

4
Come interpretare l'output?
Eric O Lebigot,

2
Potresti avere 'blas' invece di 'atlas' installato (questo succede se installi openblas su distribuzioni basate su debian).
Malcolm,

4
La risposta di David avrebbe probabilmente dovuto essere accettata al posto di questa risposta, che non riesce a rispondere alla domanda in questione. Dal momento che questa risposta rivela interessanti meccanismi di utilizzo nel risolvere altre domande correlate, un cordiale ringraziamento lo stesso!
Cecil Curry,

2
@rabra sysinfo.get_info('atlas')non ha restituito nulla per me, ma ha sysinfo.get_info('blas')restituito {'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']} e sysinfo.get_info('lapack')restituito {'language': 'f77', 'libraries': ['lapack', 'lapack'], 'library_dirs': ['/usr/lib']} Cosa significa?
SebMa,

11

Poiché utilizza le versioni caricate dinamicamente, puoi semplicemente fare questo:

$ ldd anyoftheCmodules.so

dove anyoftheCmodules.sopotrebbe essere, ad esempio numpy/core/_dotblas.so, che si collega a libblas.so.


1
Cosa succede se non ci sono file numpy/core/_dotblas.so? (vedi commento sotto la risposta delle talonmie)
Woltan,

1
Ci devono essere solo un numero di .sofile. Basta cercare all'interno della directory NumPy (diciamo, usando find /path/to/numpy -name "*.so"). Un paio di quelli ( _dotblas.so, lapack_lite.sosotto un unico precompilato di Ubuntu, per esempio) fanno uso di BLAS / LAPACK
Ricardo Cárdenes

6
_dotblas.sonon esiste più in numpy v1.10 e versioni successive , ma è possibile controllare il collegamento di multiarray.soinvece
ali_m

Va detto che questa soluzione è sia specifica per Linux che fragile. numpy.__config__Invece , vuoi davvero solo accedere all'oggetto canonico in fase di esecuzione. (Vedi la risposta eccellente di David .)
Cecil Curry,

In effetti, è specifico di Linux e sono d'accordo sul fatto che il metodo @davost sia migliore. Non capisco perché la mia risposta continui a essere votata.
Ricardo Cárdenes,

8

Puoi usare lo strumento di dipendenza del caricatore di link per esaminare i componenti hook di livello C della tua build e vedere se hanno dipendenze esterne sul tuo blas e lapack di scelta. Non sono vicino a una scatola di Linux in questo momento, ma su una macchina OS X puoi farlo all'interno della directory dei pacchetti del sito che contiene le installazioni:

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

sostituire lddal posto di otoolun sistema gnu / Linux e dovresti ottenere le risposte di cui hai bisogno.


1
Cosa succede se non ci sono file numpy/core/_dotblas.so? (vedi commento sotto la risposta di Ricardos)
Woltan,

@Woltan: o qualcosa è seriamente rotto, o stai guardando nel posto sbagliato. Su ogni installazione numpy di Linux e OS X che io abbia mai visto, ci sarà un _dotblas.soche è il wrapper di interfaccia per qualsiasi blas sia stato usato per costruire la distribuzione. Su Windows verrà chiamato _dotblas.pyd, ma la funzione è la stessa.
Talonmies

3
Sembra che _dotblas.sosia costruito solo se stai usando una [atlas]sezione in site.cfg(e una libreria BLAS abilitata per CBLAS). Quindi, dovresti usarlo, anche se non stai usando ATLAS (tranne quando stai usando Intel MKL, che ha una sezione dedicata).
Kenneth Hoste,

Infatti, quando nessun BLAS è disponibile quando NumPy è costruito, costruisce le proprie routine di punti-prodotto. Questi possono essere due ordini di grandezza più lenti dell'ATLAS.
Fred Foo,

5
_dotblas.sonon esiste più in numpy v1.10 e versioni successive , ma è possibile controllare il collegamento di multiarray.soinvece
ali_m

6

È possibile visualizzare i collegamenti BLAS, LAPACK, MKL usando show_config():

import numpy as np
np.show_config()

Che per me dà output:

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
Come interpreti ('HAVE_CBLAS', None)]?
seralouk,

@serafeim Vedi link . Significa essenzialmente che HAVE_CBLASviene definito ma non ha valore (pensa C:) #define HAVE_CBLAS. Non ha bisogno di un valore in quanto viene utilizzato solo come flag. Lo interpreterei come HAVE_CBLAS=True. Se non avessi CBLAS, non avresti affatto la tupla lì.
MT

Voglio solo sapere se il mio intorpidimento è collegato al blas in modo che il calcolo dell'algebra lineare sia abbastanza veloce. Ottengo questo: imgur.com/a/SsrDqg5 . Come lo interpreti?
seralouk,

@makis numpy è collegato a openblas
MT

0

Se hai installato anaconda-navigator (su www.anaconda.com/anaconda/install/ per linux, Windows o macOS) - blas, scipy e numpy verranno installati e potrai vederli facendo clic sulla scheda degli ambienti sul lato sinistro della home page di navigator pagina (cercare ciascuna directory in ordine alfabetico). L'installazione di anaconda completa (al contrario di miniconda o singoli pacchetti) si occuperà dell'installazione di molti dei pacchetti essenziali necessari per la scienza dei dati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.