Parece que a velocidade do cálculo muda dependendo do BLAS usado para Numpy [Python]

2019 ano 6 mês 4 dia

Em "numpy", uma biblioteca de cálculos numéricos chamada BLAS é responsável pelo processamento real.

O BLAS usado depende se você instala o numpy com "conda install" ou "pip install", e dependendo de qual BLAS você usa, a velocidade de processamento será afetada não apenas pelo numpy, mas também pelas bibliotecas que dependem dele.

Desta vez, vou apresentar o BLAS e a diferença de velocidade real e como verificar qual BLAS você está usando.

BLAS e seus tipos

O que é BLAS?

Em relação ao BLAS, a explicação no site a seguir foi muito fácil de entender, então vou citá-la.

BLAS é uma abreviatura de Basic Linear Algebra Subprograms.Para ser franco, é uma biblioteca de operações lineares básicas, ou simplesmente um conjunto de funções que fazem os cálculos básicos de matrizes e vetores.Por exemplo, multiplicação de matrizes, cálculo de norma vetorial e assim por diante.A ideia é parar de implementar esses cálculos (reinventar a roda) e usar a biblioteca para uma codificação eficiente e eficiente.

BLAS fácil de usar

Visto que BLAS também é usado atrás de numpy, diz-se que o tempo de cálculo será diferente dependendo de qual BLAS é chamado quando numpy é executado.

Tipo BLAS

Vários tipos de BLAS foram desenvolvidos.Vamos dar uma olhada em alguns dos típicos.

Abrir BLAS

Uma implementação de código aberto do BLAS.No numpy instalado com pip, o OpenBLAS é chamado internamente para realizar operações.
É compatível com vários processadores e afirma-se que pode fornecer a mesma velocidade que o Intel MKL para o CPU Sandy Bridge da Intel.É bem conhecido por sua função multithread e parece que o número de núcleos é bem proporcional ao aumento de velocidade.

Intel MKL (Intel Math Kernel Library)

BLAS desenvolvido pela Intel. Apenas CPUs Intel são suportadas e não podem ser usadas com CPUs feitas por outras empresas. Por ser otimizado para CPUs Intel como Xeon, Core i series e Atom, é mais rápido usar intel MKL como uma biblioteca aritmética em um computador que usa essas CPUs.Intel MKL é usado para numpy instalado por "conda install" com Anaconda ou Miniconda.

ATLAS (Software de Álgebra Linear Ajustado Automaticamente)

Um dos BLAS gratuitos.Como o nome sugere, o ajuste define os parâmetros ideais para o hardware a ser instalado e realiza cálculos em alta velocidade.

Diferença no tempo de cálculo devido à diferença no BLAS

O fato do BLAS usado na parte de trás do numpy afetar a velocidade de processamento significa que está relacionado à velocidade de execução da biblioteca que depende do numpy.Em outras palavras, também afeta scipy, pandas, scikit-learn e tensorflow.

Muitos técnicos estão comparando benchmarks para diferenças BLAS (diferenças entre conda install e pip install), mas pegue aquele publicado na Intel® Developer Zone como exemplo.
O cálculo da matriz por scipy mostra o tempo necessário para a multiplicação de matrizes complicadas conforme vai para a direita, e intel MKL pode processar mais rápido do que ATLAS.

Comparação do cálculo da matriz por scipy em intel MKL e ATLAS
Comparação do cálculo da matriz por scipy em intel MKL e ATLAS
Fonte:https://software.intel.com/en-us/articles/numpyscipy-with-intel-mkl/

O seguinte é do oficial da Anaconda. Comparamos o número de imagens treinadas por segundo em cada modelo de aprendizado profundo com tensorflow instalado por conda install ou pip install, e a diferença é de até 1 vezes.

Diferença entre pip (OpenBLAS) e conda (intel MKL) em cada modelo de aprendizado profundo
Diferença entre pip (OpenBLAS) e conda (intel MKL) em cada modelo de aprendizado profundo
(CPU é Intel® Xeon® Gold 6130)
Fonte:https://www.anaconda.com/tensorflow-in-anaconda/

Outras comparações incluem pandas e scikit learn (O desempenho da Intel x Anaconda x vanilla Python - meu benchmark pessoal). Como o conda tem sua própria instalação e gerenciamento de biblioteca, parece ser um resultado favorável em muitos casos.

Como verificar BLAS em Python

__config__.show()Apenas corra.

importar numpy como np np .__ config __. show ()

>>
mkl_info: libraries = ['mkl_rt'] library_dirs = ['C: / Users /'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['C: \\ Arquivos de programas ( 'C: \\ Arquivos de programas (' x86) \\ IntelSWTools \\ compilers_and_libraries_2019.0.117 \\ windows \\ mkl ',' C: \\ Arquivos de programas (x86) \\ IntelSWTools \\ compilers_and_libraries_2019.0.117 \\ windows \\ mkl \\ include ',' C: \\ Program Files (x86) \\ IntelSWTools \\ compilers_and_libraries_2019.0.117 \\ windows \\ mkl \\ lib ',' C: / Users / programming / Miniconda3 / envs / ML \\ Biblioteca \\ incluir ']

Se mkl_info for exibido, intel MKL será usado.