web-dev-qa-db-fra.com

Découvrez si / quelle bibliothèque BLAS est utilisée par Numpy

J'utilise numpy et scipy dans différents environnements (MacOS, Ubuntu, RedHat). Habituellement, j'installe numpy en utilisant le gestionnaire de paquets qui est disponible (par exemple, les ports mac, apt, yum).

Cependant, si vous ne compilez pas Numpy manuellement, comment pouvez-vous être sûr qu'il utilise une bibliothèque BLAS? À l'aide des ports mac, ATLAS est installé en tant que dépendance. Cependant, je ne sais pas s'il est vraiment utilisé. Lorsque j'effectue un benchmark simple, la fonction numpy.dot() nécessite env. 2 fois plus de temps qu'un produit scalaire calculé à l'aide de la bibliothèque Eigen C++. Je ne sais pas si c'est un résultat raisonnable ..

Cordialement, Apo

18
Apoptose

numpy.show_config() ne donne pas toujours des informations fiables. Par exemple, si je apt-get install python-numpy Sur Ubuntu 14.04, la sortie de np.show_config() ressemble à ceci:

blas_info:
    libraries = ['blas']
    library_dirs = ['/usr/lib']
    language = f77
lapack_info:
    libraries = ['lapack']
    library_dirs = ['/usr/lib']
    language = f77
atlas_threads_info:
  NOT AVAILABLE
blas_opt_info:
    libraries = ['blas']
    library_dirs = ['/usr/lib']
    language = f77
    define_macros = [('NO_ATLAS_INFO', 1)]
atlas_blas_threads_info:
  NOT AVAILABLE
openblas_info:
  NOT AVAILABLE
lapack_opt_info:
    libraries = ['lapack', 'blas']
    library_dirs = ['/usr/lib']
    language = f77
    define_macros = [('NO_ATLAS_INFO', 1)]
...

Il semble que numpy utilise la bibliothèque CBLAS standard. Cependant, je sais pertinemment que numpy utilise OpenBLAS, que j'ai installé via le package libopenblas-dev.


La façon la plus définitive de vérifier * nix est d'utiliser ldd pour trouver les bibliothèques partagées avec lesquelles les liens numpy sont exécutés (je ne possède pas de Mac, mais je pense que vous pouvez utilisez otool -L à la place de ldd).

  • Pour les versions de numpy antérieures à v1.10:

    ~$ ldd /<path_to_site-packages>/numpy/core/_dotblas.so
    

    Si _dotblas.so N'existe pas, cela signifie probablement que numpy n'a détecté aucune bibliothèque BLAS lors de sa compilation initiale, auquel cas il ne construit tout simplement aucun des composants dépendants de BLAS.

  • Pour numpy v1.10 et plus récent:

    _dotblas.so A été supprimé , mais vous pouvez vérifier les dépendances de multiarray.so À la place:

    ~$ ldd /<path_to_site-packages>/numpy/core/multiarray.so
    

En regardant la version de numpy que j'ai installée via apt-get:

~$ ldd /usr/lib/python2.7/dist-packages/numpy/core/_dotblas.so 
    linux-vdso.so.1 =>  (0x00007fff12db8000)
    libblas.so.3 => /usr/lib/libblas.so.3 (0x00007fce7b028000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fce7ac60000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fce7a958000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fce7a738000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fce7ca40000)

/usr/lib/libblas.so.3 Est en fait le début d'une chaîne de liens symboliques. Si je les suis jusqu'à leur cible ultime en utilisant readlink -e, Je vois qu'ils pointent vers ma bibliothèque partagée OpenBLAS:

~$ readlink -e /usr/lib/libblas.so.3
/usr/lib/openblas-base/libblas.so.3
29
ali_m

numpy.show_config () indique simplement que les informations ne sont pas disponibles sur mon Debian Linux.

Cependant/usr/lib/python3/dist-packages/scipy/lib a un sous-répertoire pour blas qui peut vous dire ce que vous voulez. Il existe quelques programmes de test pour BLAS dans les tests de sous-répertoire.

J'espère que cela t'aides.

3
Jorgen

Vous voulez vérifier numpy.show_config() pour voir quelles bibliothèques sont configurées.

2
JoshAdel