Comment vérifier la liaison BLAS / LAPACK dans NumPy et SciPy?

126

Je construis mon environnement numpy / scipy basé sur blas et lapack plus ou moins basé sur cette promenade.

Quand j'ai terminé, comment puis-je vérifier que mes fonctions numpy / scipy utilisent vraiment les fonctionnalités blas / lapack précédemment construites?

Woltan
la source

Réponses:

293

La méthode numpy.show_config()(ou numpy.__config__.show()) génère des informations sur la liaison collectées au moment de la construction. Ma sortie ressemble à ceci. Je pense que cela signifie que j'utilise le BLAS / LAPACK fourni avec 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
la source
4
Compte tenu de son utilité généralisée, numpy.__config__devrait vraiment être une API publique. Néanmoins, vous gagnez ce tour, davost .
Cecil Curry
2
Donc, le simple fait que cela lapack_opt_infosoit montré signifie que numpy est lié à lapack?
DanHickstein
42
Comment interprétez-vous la sortie?
Edward Newell
18
@CecilCurry Vous pouvez utiliser numpy.show_config(), qui est probablement une fonction API publique en raison de l'absence de traits de soulignement de départ. Mais il n'est pas documenté en ligne et n'a pas de docstring, il n'est donc pas surprenant qu'il soit si difficile à trouver. J'espère qu'ils vont résoudre ce problème.
Praveen
8
Comment savoir quel package est réellement utilisé lorsque plusieurs packages sont affichés?
Jonasson
28

Voici ce que vous recherchez: informations système

J'ai compilé numpy / scipy avec atlas et je peux le vérifier avec:

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

Consultez la documentation pour plus de commandes.

rabra
la source
35
Cela ne semble pas indiquer si numpy utilise actuellement ATLAS, juste si ATLAS sera lié lors de la prochaine compilation numpy. J'avais compilé numpy avant ATLAS. Cela a fonctionné très lentement jusqu'à ce que je recompile numpy (chose sûre), mais avant et après la recompilation de numpy, sysinfo.get_info ('atlas') a montré la même sortie. Comment vérifier l'état actuel des choses?
dmytro
4
Comment interpréter la sortie?
Eric O Lebigot
2
Vous pouvez avoir installé «blas» au lieu de «atlas» (cela se produit si vous installez openblas sur des distributions basées sur Debian).
Malcolm
4
La réponse de davost aurait probablement dû être acceptée à la place de cette réponse, qui ne répond pas à la question en question. Étant donné que cette réponse révèle des mécanismes intéressants d'utilisation pour résoudre d' autres questions connexes, un merci chaleureux tout de même!
Cecil Curry
2
@rabra sysinfo.get_info('atlas')n'a rien retourné pour moi mais sysinfo.get_info('blas')est revenu {'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']} et sysinfo.get_info('lapack')est revenu {'language': 'f77', 'libraries': ['lapack', 'lapack'], 'library_dirs': ['/usr/lib']} Qu'est-ce que cela signifie?
SebMa
11

Comme il utilise les versions chargées dynamiquement, vous pouvez simplement faire ceci:

$ ldd anyoftheCmodules.so

anyoftheCmodules.sopourrait être, par exemple numpy/core/_dotblas.so, vers quel lien libblas.so.

Ricardo Cárdenes
la source
1
Et s'il n'y a pas de fichier numpy/core/_dotblas.so? (voir le commentaire ci-dessous la réponse de talonmies)
Woltan
1
Il ne doit y avoir qu'un certain nombre de .sofichiers là-dedans. Recherchez simplement dans le répertoire NumPy (par exemple, en utilisant find /path/to/numpy -name "*.so"). Quelques-uns d'entre eux ( _dotblas.so, lapack_lite.sosous celui précompilé d'Ubuntu, par exemple) utilisent BLAS / LAPACK
Ricardo Cárdenes
6
_dotblas.son'existe plus dans numpy v1.10 et plus récent , mais vous pouvez vérifier le lien de à la multiarray.soplace
ali_m
Il faut mentionner que cette solution est à la fois spécifique à Linux et fragile. Vous voulez vraiment, vraiment simplement accéder à l' numpy.__config__objet canonique au moment de l'exécution. (Voir l'excellente réponse de davost .)
Cecil Curry
C'est, en effet, spécifique à Linux, et je suis d'accord que la méthode @davost est meilleure. Je ne comprends pas pourquoi ma réponse continue d'être votée.
Ricardo Cárdenes
8

Vous pouvez utiliser l'outil de dépendance du chargeur de lien pour examiner les composants hook de niveau C de votre build et voir s'ils ont des dépendances externes sur votre blas et lapack de votre choix. Je ne suis pas près d'une boîte Linux pour le moment, mais sur une machine OS X, vous pouvez le faire dans le répertoire site-packages qui contient les installations:

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

remplacez ldd- otoolle par un système gnu / Linux et vous devriez obtenir les réponses dont vous avez besoin.

talonmies
la source
1
Et s'il n'y a pas de fichier numpy/core/_dotblas.so? (voir le commentaire ci-dessous la réponse de Ricardos)
Woltan
@Woltan: soit quelque chose est gravement cassé, soit vous cherchez au mauvais endroit. Sur chaque installation numpy Linux et OS X que j'ai jamais vue, il y aura un _dotblas.soqui est le wrapper d'interface de tout ce qui a été utilisé pour construire la distribution. Sous Windows, il sera appelé _dotblas.pyd, mais la fonction est la même.
talonmies
3
Il semble qu'il _dotblas.sone soit construit que si vous utilisez une [atlas]section dans site.cfg(et une bibliothèque BLAS compatible CBLAS). Donc, vous devriez l'utiliser, même si vous n'utilisez pas ATLAS (sauf lorsque vous utilisez Intel MKL, qui a une section dédiée).
Kenneth Hoste
En effet, lorsqu'aucun BLAS n'est disponible lors de la construction de NumPy, il construit ses propres routines de produit scalaire. Celles-ci peuvent être deux ordres de grandeur plus lentes qu'ATLAS.
Fred Foo
5
_dotblas.son'existe plus dans numpy v1.10 et plus récent , mais vous pouvez vérifier le lien de à la multiarray.soplace
ali_m
6

Vous pouvez afficher la liaison BLAS, LAPACK, MKL en utilisant show_config():

import numpy as np
np.show_config()

Ce qui pour moi donne une sortie:

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
la source
1
Comment interprétez-vous ('HAVE_CBLAS', None)]?
seralouk
@serafeim Voir le lien . Cela signifie essentiellement que cela HAVE_CBLASest défini mais n'a aucune valeur (pensez à C :) #define HAVE_CBLAS. Il n'a pas besoin de valeur car il n'est utilisé que comme indicateur. Je l'interpréterais comme HAVE_CBLAS=True. Si vous n'aviez pas CBLAS, vous n'y auriez pas du tout le tuple.
MT du
Je veux juste savoir si mon numpy est lié à blas pour que le calcul d'algèbre linéaire soit assez rapide. J'obtiens ceci: imgur.com/a/SsrDqg5 . Comment interprétez-vous cela?
seralouk
@makis numpy est lié à openblas
MT
0

Si vous avez installé anaconda-navigator (sur www.anaconda.com/anaconda/install/ pour linux, Windows ou macOS) - blas, scipy et numpy seront tous installés et vous pouvez les voir en cliquant sur l'onglet environnements sur le côté gauche de la page d'accueil du navigateur page (recherchez chaque répertoire dans l'ordre alpha). L'installation complète d'anaconda (par opposition à miniconda ou à des packages individuels) prendra en charge l'installation de nombreux packages essentiels nécessaires à la science des données.

Dan T
la source