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 segundos

Tambié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átil

numpy.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

Respuestas a la pregunta(1)

Su respuesta a la pregunta