¿Cómo verificar el enlace BLAS / LAPACK en NumPy y SciPy?

126

Estoy construyendo mi entorno numpy / scipy basado en blas y lapack más o menos basado en este recorrido.

Cuando termine, ¿cómo puedo verificar que mis funciones numpy / scipy realmente usan las funcionalidades blas / lapack construidas anteriormente?

Woltan
fuente

Respuestas:

293

El método numpy.show_config()(o numpy.__config__.show()) genera información sobre la vinculación recopilada en el momento de la compilación. Mi salida se ve así. Creo que significa que estoy usando BLAS / LAPACK que viene 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)]
davost
fuente
44
Dada su utilidad generalizada, numpy.__config__realmente debería ser una API pública. No obstante, ganas esta ronda, davost .
Cecil Curry
2
Entonces, ¿el simple hecho que lapack_opt_infose muestra significa que numpy está vinculado con lapack?
DanHickstein
42
¿Cómo interpretas la salida?
Edward Newell el
18
@CecilCurry Puede usar numpy.show_config(), que probablemente sea una función API pública en virtud de la ausencia de guiones bajos iniciales. Pero no está documentado en línea y no tiene una cadena de documentación, por lo que no es sorprendente que sea tan difícil de encontrar. Esperemos que arreglen eso.
Praveen
8
¿Cómo puedo saber qué paquete se usa realmente cuando se muestran varios paquetes?
Jonasson
28

Lo que está buscando es esto: información del sistema

Compilé numpy / scipy con atlas y puedo verificar esto con:

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

Consulte la documentación para más comandos.

rabra
fuente
35
Esto no parece mostrar si numpy usa ATLAS actualmente, solo si ATLAS se vinculará durante la próxima compilación de numpy. Había compilado numpy antes de ATLAS. Funcionó muy lentamente hasta que volví a compilar numpy (seguro), pero antes y después de la recompilación numpy sysinfo.get_info ('atlas') mostró el mismo resultado. ¿Cómo verificar el estado actual de las cosas?
dmytro
44
¿Cómo interpretar la salida?
Eric O Lebigot
2
Es posible que tenga 'blas' en lugar de 'atlas' instalado (esto sucede si instala openblas en distribuciones basadas en Debian).
Malcolm
44
La respuesta de davost probablemente debería haber sido aceptada en lugar de esta respuesta, que no responde a la pregunta en cuestión. Dado que esta respuesta descubre una maquinaria de uso interesante para resolver otras preguntas relacionadas, de todos modos, ¡ muchas gracias!
Cecil Curry
2
@rabra sysinfo.get_info('atlas')no me devolvió nada, pero sysinfo.get_info('blas')regresó {'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']} y sysinfo.get_info('lapack')regresó {'language': 'f77', 'libraries': ['lapack', 'lapack'], 'library_dirs': ['/usr/lib']} ¿Qué significa?
SebMa
11

Como utiliza las versiones cargadas dinámicamente, puede hacer esto:

$ ldd anyoftheCmodules.so

dónde anyoftheCmodules.sopodría estar, por ejemplo numpy/core/_dotblas.so, a qué enlaces libblas.so.

Ricardo Cárdenes
fuente
1
¿Qué pasa si no hay un archivo numpy/core/_dotblas.so? (ver comentario debajo de la respuesta de talonmies)
Woltan
1
Debe haber una cantidad de .soarchivos allí. Simplemente busque dentro del directorio NumPy (digamos, usando find /path/to/numpy -name "*.so"). Un par de ellos ( _dotblas.so, lapack_lite.sobajo un precompilado de Ubuntu, por ejemplo) hacen uso de BLAS / LAPACK
Ricardo Cárdenes
66
_dotblas.soya no existe en v1.10 numpy y más reciente , pero se puede comprobar la vinculación de multiarray.solugar
ali_m
Cabe mencionar que esta solución es específica de Linux y frágil. Realmente, realmente solo quieres acceder al numpy.__config__objeto canónico en tiempo de ejecución. (Ver la excelente respuesta de davost .)
Cecil Curry
De hecho, es específico de Linux, y estoy de acuerdo en que el método @davost es mejor. No entiendo por qué mi respuesta sigue siendo votada.
Ricardo Cárdenes
8

Puede usar la herramienta de dependencia del cargador de enlaces para ver los componentes de enlace de nivel C de su compilación y ver si tienen dependencias externas en su blas y paquete de opciones. No estoy cerca de una caja de Linux en este momento, pero en una máquina con OS X puede hacer esto dentro del directorio de paquetes del sitio que contiene las instalaciones:

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

sustituya ldden lugar de otoolen un sistema gnu / Linux y debería obtener las respuestas que necesita.

talonmies
fuente
1
¿Qué pasa si no hay un archivo numpy/core/_dotblas.so? (ver comentario debajo de la respuesta de Ricardos)
Woltan
@Woltan: o algo está seriamente roto o estás buscando en el lugar equivocado. En cada instalación de Linux y OS X numpy que haya visto, habrá una _dotblas.soenvoltura de interfaz para cualquier blas que se haya utilizado para construir la distribución. En Windows se llamará _dotblas.pyd, pero la función es la misma.
Talonmies
3
Parece que _dotblas.sosolo se crea si está utilizando una [atlas]sección en site.cfg(y una biblioteca BLAS habilitada para CBLAS). Por lo tanto, debe usar eso, incluso si no está usando ATLAS (excepto cuando está usando Intel MKL, que tiene una sección dedicada).
Kenneth Hoste
De hecho, cuando no hay BLAS disponible cuando se construye NumPy, crea sus propias rutinas de productos de punto. Estos pueden ser dos órdenes de magnitud más lentos que ATLAS.
Fred Foo
55
_dotblas.soya no existe en v1.10 numpy y más reciente , pero se puede comprobar la vinculación de multiarray.solugar
ali_m
6

Puede mostrar enlaces BLAS, LAPACK, MKL usando show_config():

import numpy as np
np.show_config()

Lo que para mí da salida:

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']
MONTE
fuente
1
¿Cómo lo interpretas ('HAVE_CBLAS', None)]?
seralouk
@serafeim Ver enlace . Básicamente significa que HAVE_CBLASse está definiendo pero no tiene valor (piense en C:) #define HAVE_CBLAS. No necesita un valor ya que solo se usa como bandera. Lo interpretaría como HAVE_CBLAS=True. Si no tuviera CBLAS, no tendría la tupla allí en absoluto.
MT
Solo quiero saber si mi numpy está vinculado a blas para que el cálculo de álgebra lineal sea lo suficientemente rápido. Me sale esto: imgur.com/a/SsrDqg5 . como interpretas esto?
seralouk
@makis numpy está vinculado a openblas
MT
0

Si instaló anaconda-navigator (en www.anaconda.com/anaconda/install/ para linux, Windows o macOS), se instalarán blas, scipy y numpy y podrá verlos haciendo clic en la pestaña de entornos en el lado izquierdo de la página de inicio del navegador página (busque cada directorio en orden alfabético). La instalación de anaconda completa (a diferencia de miniconda o paquetes individuales) se encargará de instalar muchos de los paquetes esenciales necesarios para la ciencia de datos.

Dan T
fuente