Como verificar a ligação BLAS / LAPACK no NumPy e SciPy?

126

Estou construindo meu ambiente numpy / scipy com base em blas e lapack mais ou menos com base nessa caminhada.

Quando termino, como posso verificar se minhas funções numpy / scipy realmente usam as funcionalidades blas / lapack criadas anteriormente?

Woltan
fonte

Respostas:

293

O método numpy.show_config()(ou numpy.__config__.show()) gera informações sobre a ligação coletada no momento da construção. Minha saída é assim. Acho que significa que estou usando o BLAS / LAPACK que acompanha o 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
fonte
4
Dada a sua utilidade generalizada, numpy.__config__deve realmente ser uma API pública. No entanto, você vence esta rodada, davost .
Cecil Curry
2
Então, o simples fato de que lapack_opt_infoé mostrado significa que numpy está vinculado com lapack?
precisa saber é o seguinte
42
Como você interpreta a saída?
Edward Newell
18
@CecilCurry Você pode usar numpy.show_config(), provavelmente uma função pública da API, devido à ausência de sublinhados iniciais. Mas ele não está documentado on-line e não possui docstring, portanto, não é surpresa que seja tão difícil de encontrar. Espero que eles consertem isso.
Praveen
8
como descobrir qual pacote é realmente usado quando vários pacotes são exibidos?
quer
28

O que você está procurando é o seguinte: informações do sistema

Eu compilei numpy / scipy com atlas e posso verificar isso com:

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

Verifique a documentação para mais comandos.

rabra
fonte
35
Isso não parece mostrar se o numpy atualmente usa o ATLAS, apenas se o ATLAS será vinculado durante a próxima compilação do numpy. Eu tinha numpy compilado antes do ATLAS. Funcionou muito devagar até recompilar o numpy (com certeza), mas antes e depois da recompilação do numpy sysinfo.get_info ('atlas') mostrou a mesma saída. Como verificar o estado atual das coisas?
Dmytro
4
Como interpretar a saída?
Eric O Lebigot
2
Você pode ter 'blas' em vez de 'atlas' instalado (isso acontece se você instalar o openblas nas distribuições baseadas no debian).
Malcolm
4
a resposta da davost provavelmente deveria ter sido aceita no lugar dessa resposta, que falha ao abordar a questão em questão. Como essa resposta revela mecanismos interessantes de uso para resolver outras questões relacionadas, muito obrigado!
Cecil Caril
2
@rabra sysinfo.get_info('atlas')não retornou nada para mim, mas sysinfo.get_info('blas')retornou {'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')retornou {'language': 'f77', 'libraries': ['lapack', 'lapack'], 'library_dirs': ['/usr/lib']} O que isso significa?
SebMa
11

Como ele usa as versões carregadas dinamicamente, você pode fazer isso:

$ ldd anyoftheCmodules.so

onde anyoftheCmodules.sopoderia estar, por exemplo, o numpy/core/_dotblas.solink para libblas.so.

Ricardo Cárdenes
fonte
1
E se não houver arquivo numpy/core/_dotblas.so? (veja o comentário abaixo resposta das garras)
Woltan
1
Deve haver um número de .soarquivos lá. Basta pesquisar dentro do diretório NumPy (digamos, usando find /path/to/numpy -name "*.so"). Um par daqueles ( _dotblas.so, lapack_lite.sosob um pré-compilado do Ubuntu, por exemplo) fazer uso de BLAS / LAPACK
Ricardo Cárdenes
6
_dotblas.sojá não existe no v1.10 numpy e mais recente , mas você pode verificar a ligação de multiarray.sovez
ali_m
Deve-se mencionar que esta solução é específica para Linux e frágil. Você realmente deseja acessar o numpy.__config__objeto canônico em tempo de execução. (Veja a excelente resposta de davost .)
Cecil Curry
É, de fato, específico do Linux, e eu concordo que o método @davost é melhor. Não entendo por que minha resposta continua sendo votada.
Ricardo Cárdenes
8

Você pode usar a ferramenta de dependência do carregador de links para examinar os componentes de gancho no nível C de sua compilação e verificar se eles têm dependências externas nos blas e lapack de sua escolha. Eu não estou perto de uma caixa linux no momento, mas em uma máquina OS X você pode fazer isso dentro do diretório site-packages que contém as instalações:

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

substitua lddno lugar de otoolum sistema gnu / Linux e você deverá obter as respostas necessárias.

talonmies
fonte
1
E se não houver arquivo numpy/core/_dotblas.so? (ver comentário abaixo resposta Ricardos)
Woltan
@Woltan: ou algo está seriamente quebrado, ou você está procurando no lugar errado. Em toda instalação numpy de Linux e OS X que eu já vi, haverá um _dotblas.soque é o wrapper de interface para qualquer blas que tenha sido usado para construir a distribuição. No Windows, ele será chamado _dotblas.pyd, mas a função é a mesma.
talonmies
3
Parece que _dotblas.sosó é construído se você estiver usando uma [atlas]seção site.cfg(e uma biblioteca BLAS habilitada para CBLAS). Portanto, você deve usá-lo, mesmo se não estiver usando o ATLAS (exceto quando estiver usando o Intel MKL, que possui uma seção dedicada).
Kenneth Hoste
De fato, quando nenhum BLAS está disponível quando o NumPy é criado, ele cria suas próprias rotinas de produtos pontuais. Podem ser duas ordens de magnitude mais lentas que o ATLAS.
Fred Foo
5
_dotblas.sojá não existe no v1.10 numpy e mais recente , mas você pode verificar a ligação de multiarray.sovez
ali_m
6

Você pode exibir a ligação BLAS, LAPACK, MKL usando show_config():

import numpy as np
np.show_config()

O que para mim dá saída:

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
fonte
1
Como você interpreta ('HAVE_CBLAS', None)]?
seralouk 26/07/19
@serafeim Ver link . Significa essencialmente que HAVE_CBLASestá sendo definido, mas não tem valor (pense em C #define HAVE_CBLAS:). Ele não precisa de um valor, pois é usado apenas como sinalizador. Eu interpretaria isso como HAVE_CBLAS=True. Se você não tivesse o CBLAS, não teria a tupla lá.
MT
Quero apenas saber se meu numpy está vinculado a blas para que a computação em álgebra linear seja rápida o suficiente. Eu recebo o seguinte: imgur.com/a/SsrDqg5 . Como você interpreta isso?
21419 seralouk
@makis numpy está ligada a openblas
MT
0

Se você instalou o anaconda-navigator (em www.anaconda.com/anaconda/install/ para linux, Windows ou macOS) - blas, scipy e numpy serão instalados e você poderá vê-los clicando na guia ambientes no lado esquerdo da página inicial do navegador página (procure cada diretório em ordem alfa). A instalação do anaconda completo (em oposição ao miniconda ou aos pacotes individuais) cuidará da instalação de muitos dos pacotes essenciais necessários para a ciência de dados.

Dan T
fonte