rendimiento de NumPy con diferentes implementaciones de BLAS
Estoy ejecutando un algoritmo que se implementa en Python y usa NumPy. La parte más costosa computacionalmente del algoritmo involucraresolviendo un conjunto de sistemas lineales (es decir, una llamada anumpy.linalg.solve()
. Se me ocurrió este pequeño punto de referencia:
import numpy as np
import time
# Create two large random matrices
a = np.random.randn(5000, 5000)
b = np.random.randn(5000, 5000)
t1 = time.time()
# That's the expensive call:
np.linalg.solve(a, b)
print time.time() - t1
He estado ejecutando esto en:
Mi laptop, una MacBook Pro de finales de 2013 de 15 "con 4 núcleos a 2GHz (sysctl -n machdep.cpu.brand_string
me daIntel (R) Core (TM) i7-4750HQ CPU @ 2.00GHz)Un Amazon EC2c3.xlarge
instancia, con 4 vCPU. Amazon los anuncia como "Procesadores Intel Xeon E5-2680 v2 (Ivy Bridge) de alta frecuencia"Línea de fondo:
En la Mac se ejecuta en~ 4.5 segundosEn la instancia EC2 se ejecuta en~ 19.5 segundosTambién lo he probado en otras configuraciones basadas en OpenBLAS / Intel MKL, y el tiempo de ejecución siempre es comparable al que obtengo en la instancia EC2 (módulo de configuración de hardware).
¿Alguien puede explicar por qué el rendimiento en Mac (con Accelerate Framework) es> 4 veces mejor? A continuación se proporcionan más detalles sobre la configuración de NumPy / BLAS en cada uno.
Configuración del portátilnumpy.show_config()
me da
atlas_threads_info:
NOT AVAILABLE
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)]
atlas_blas_threads_info:
NOT AVAILABLE
openblas_info:
NOT AVAILABLE
lapack_opt_info:
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
extra_compile_args = ['-msse3']
define_macros = [('NO_ATLAS_INFO', 3)]
atlas_info:
NOT AVAILABLE
lapack_mkl_info:
NOT AVAILABLE
blas_mkl_info:
NOT AVAILABLE
atlas_blas_info:
NOT AVAILABLE
mkl_info:
NOT AVAILABLE
Configuración de instancia EC2:En Ubuntu 14.04, instalé OpenBLAS con
sudo apt-get install libopenblas-base libopenblas-dev
Al instalar NumPy, creé unsite.cfg
con los siguientes contenidos:
[default]
library_dirs= /usr/lib/openblas-base
[atlas]
atlas_libs = openblas
numpy.show_config()
me da
atlas_threads_info:
libraries = ['lapack', 'openblas']
library_dirs = ['/usr/lib']
define_macros = [('ATLAS_INFO', '"\\"None\\""')]
language = f77
include_dirs = ['/usr/include/atlas']
blas_opt_info:
libraries = ['openblas']
library_dirs = ['/usr/lib']
language = f77
openblas_info:
libraries = ['openblas']
library_dirs = ['/usr/lib']
language = f77
lapack_opt_info:
libraries = ['lapack', 'openblas']
library_dirs = ['/usr/lib']
define_macros = [('ATLAS_INFO', '"\\"None\\""')]
language = f77
include_dirs = ['/usr/include/atlas']
openblas_lapack_info:
NOT AVAILABLE
lapack_mkl_info:
NOT AVAILABLE
blas_mkl_info:
NOT AVAILABLE
mkl_info:
NOT AVAILABLE