2012-07-11 11 views
44

Estoy tratando de instalar numpy con OpenBLAS, sin embargo, no sé cómo se debe escribir el archivo site.cfg.Compilación de numpy con integración de OpenBLAS

Cuando se siguió el installation procedure, la instalación se completó sin errores, sin embargo, la degradación del rendimiento aumenta el número de subprocesos utilizados por OpenBLAS desde 1 (controlado por la variable de entorno OMP_NUM_THREADS).

No estoy seguro de si la integración con OpenBLAS ha sido perfecta. ¿Podría alguien proporcionar un archivo site.cfg para lograr lo mismo.

P.S .: La integración de OpenBLAS en otros kits de herramientas como Theano, que se basa en Python, proporciona un importante aumento del rendimiento en el aumento del número de subprocesos, en la misma máquina.

+0

Cuando dice que hubo una disminución del rendimiento, ¿está seguro de que el problema era lo suficientemente grande como para justificar los hilos adicionales? En el caso de problemas demasiado pequeños, se degradará el rendimiento cuando se utilicen hilos adicionales, y no sé si openblas es lo suficientemente inteligente como para usar solo hilos adicionales cuando sean útiles. – DaveP

+0

Para comprobar la variación del rendimiento con el tamaño del problema intenté usar la función numpy.linalg.svd en matrices generadas aleatoriamente de varios tamaños, (100x100, 100x1000, 1000x1000, 1000x10000,10000x10000) pero en todos estos casos la los mejores tiempos de ejecución se logran con un solo hilo en OpenBlas. Incluso para cargas pesadas de cómputo (por ejemplo, matriz 10000x10000 SVD), el hilo individual tarda 5000 segundos, mientras que 3 hilos tardan 6000 segundos. Esto me preocupa un poco, solo quiero comprobar si la integración de OpenBlas es correcta. – Vijay

Respuesta

82

Acabo de compilar numpy dentro de un virtualenv con OpenBLAS integración, y parece estar funcionando bien.

Esta fue mi proceso:

  1. Compilar OpenBLAS:

    $ git clone https://github.com/xianyi/OpenBLAS 
    $ cd OpenBLAS && make FC=gfortran 
    $ sudo make PREFIX=/opt/OpenBLAS install 
    

    Si usted no tiene derechos de administrador podría configurar PREFIX= a un directorio en el que tiene privilegios de escritura (basta con modificar el los pasos correspondientes a continuación según corresponda).

  2. Asegúrese de que el directorio que contiene libopenblas.so se encuentre en la ruta de búsqueda de su biblioteca compartida.

    • Para hacer esto a nivel local, se podría editar el archivo ~/.bashrc para contener la línea

      export LD_LIBRARY_PATH=/opt/OpenBLAS/lib:$LD_LIBRARY_PATH 
      

      La variable LD_LIBRARY_PATH ambiente se actualizará cuando se inicia una nueva sesión de terminal (utilizar $ source ~/.bashrc para forzar una actualización dentro de la misma sesión).

    • Otra opción que va a trabajar para múltiples usuarios es crear un archivo .conf en /etc/ld.so.conf.d/ que contiene la línea /opt/OpenBLAS/lib, por ejemplo,:

      $ sudo sh -c "echo '/opt/OpenBLAS/lib' > /etc/ld.so.conf.d/openblas.conf" 
      

    Una vez que haya terminado con cualquiera de las opciones, ejecutar

    $ sudo ldconfig 
    
  3. Coge el código numpy fuente:

    $ git clone https://github.com/numpy/numpy 
    $ cd numpy 
    
  4. Copia site.cfg.example a site.cfg y editar la copia :

    $ cp site.cfg.example site.cfg 
    $ nano site.cfg 
    

    descomentar estas líneas:

    .... 
    [openblas] 
    libraries = openblas 
    library_dirs = /opt/OpenBLAS/lib 
    include_dirs = /opt/OpenBLAS/include 
    .... 
    
  5. Comprobar la configuración, construir, instalar (opcionalmente dentro de una virtualenv)

    $ python setup.py config 
    

    La salida debería ser algo como esto:

    ... 
    openblas_info: 
        FOUND: 
        libraries = ['openblas', 'openblas'] 
        library_dirs = ['/opt/OpenBLAS/lib'] 
        language = c 
        define_macros = [('HAVE_CBLAS', None)] 
    
        FOUND: 
        libraries = ['openblas', 'openblas'] 
        library_dirs = ['/opt/OpenBLAS/lib'] 
        language = c 
        define_macros = [('HAVE_CBLAS', None)] 
    ... 
    

    Instalar ingenio h pip es preferable para usar python setup.py install, ya que pip hará un seguimiento de los metadatos del paquete y le permitirá desinstalar o actualizar fácilmente numpy en el futuro.

    $ pip install . 
    
  6. Opcional: se puede usar this script para probar el rendimiento de diferentes número de hilos.

    $ OMP_NUM_THREADS=1 python build/test_numpy.py 
    
    version: 1.10.0.dev0+8e026a2 
    maxint: 9223372036854775807 
    
    BLAS info: 
    * libraries ['openblas', 'openblas'] 
    * library_dirs ['/opt/OpenBLAS/lib'] 
    * define_macros [('HAVE_CBLAS', None)] 
    * language c 
    
    dot: 0.099796795845 sec 
    
    $ OMP_NUM_THREADS=8 python build/test_numpy.py 
    
    version: 1.10.0.dev0+8e026a2 
    maxint: 9223372036854775807 
    
    BLAS info: 
    * libraries ['openblas', 'openblas'] 
    * library_dirs ['/opt/OpenBLAS/lib'] 
    * define_macros [('HAVE_CBLAS', None)] 
    * language c 
    
    dot: 0.0439578056335 sec 
    

Parece que hay una mejora notable en el rendimiento para el número de hilos superiores. Sin embargo, no he probado esto de manera sistemática, y es probable que para matrices más pequeñas la sobrecarga adicional supere el beneficio de rendimiento de un mayor número de subprocesos.

+4

Aplico lo que hiciste atendiendo a un error subsiguiente en tu script de prueba /linalg/lapack_lite.so: símbolo indefinido: zgelsd_ – erogol

+1

Tengo la siguiente línea, incluso hago estrictamente lo que escribiste anteriormente. libopenblas.so.0 => /usr/lib/libopenblas.so.0 (0x00007f77e08fc000) – erogol

+0

Una pregunta más. ¿OpenBlas depende de OpenMPI o usarlo aumenta el rendimiento? – erogol

4

Sólo en caso de que esté utilizando ubuntu o la menta, usted puede fácilmente tener openblas numpy vinculados con la instalación tanto numpy y openblas a través de apt-get como

sudo apt-get install numpy libopenblas-dev 

En un ubuntu ventana acoplable fresca, he probado el siguiente script copiado de la entrada de blog "Installing Numpy and OpenBLAS"

import numpy as np 
import numpy.random as npr 
import time 

# --- Test 1 
N = 1 
n = 1000 

A = npr.randn(n,n) 
B = npr.randn(n,n) 

t = time.time() 
for i in range(N): 
    C = np.dot(A, B) 
td = time.time() - t 
print("dotted two (%d,%d) matrices in %0.1f ms" % (n, n, 1e3*td/N)) 

# --- Test 2 
N = 100 
n = 4000 

A = npr.randn(n) 
B = npr.randn(n) 

t = time.time() 
for i in range(N): 
    C = np.dot(A, B) 
td = time.time() - t 
print("dotted two (%d) vectors in %0.2f us" % (n, 1e6*td/N)) 

# --- Test 3 
m,n = (2000,1000) 

A = npr.randn(m,n) 

t = time.time() 
[U,s,V] = np.linalg.svd(A, full_matrices=False) 
td = time.time() - t 
print("SVD of (%d,%d) matrix in %0.3f s" % (m, n, td)) 

# --- Test 4 
n = 1500 
A = npr.randn(n,n) 

t = time.time() 
w, v = np.linalg.eig(A) 
td = time.time() - t 
print("Eigendecomp of (%d,%d) matrix in %0.3f s" % (n, n, td)) 

Sin openblas el resultado es:

dotted two (1000,1000) matrices in 563.8 ms 
dotted two (4000) vectors in 5.16 us 
SVD of (2000,1000) matrix in 6.084 s 
Eigendecomp of (1500,1500) matrix in 14.605 s 

Después de instalar openblas con apt install openblas-dev, he comprobado la vinculación con numpy

import numpy as np 
np.__config__.show() 

y la información es

atlas_threads_info: 
    NOT AVAILABLE 
openblas_info: 
    NOT AVAILABLE 
atlas_blas_info: 
    NOT AVAILABLE 
atlas_3_10_threads_info: 
    NOT AVAILABLE 
blas_info: 
    library_dirs = ['/usr/lib'] 
    libraries = ['blas', 'blas'] 
    language = c 
    define_macros = [('HAVE_CBLAS', None)] 
mkl_info: 
    NOT AVAILABLE 
atlas_3_10_blas_threads_info: 
    NOT AVAILABLE 
atlas_3_10_blas_info: 
    NOT AVAILABLE 
openblas_lapack_info: 
    NOT AVAILABLE 
lapack_opt_info: 
    library_dirs = ['/usr/lib'] 
    libraries = ['lapack', 'lapack', 'blas', 'blas'] 
    language = c 
    define_macros = [('NO_ATLAS_INFO', 1), ('HAVE_CBLAS', None)] 
blas_opt_info: 
    library_dirs = ['/usr/lib'] 
    libraries = ['blas', 'blas'] 
    language = c 
    define_macros = [('NO_ATLAS_INFO', 1), ('HAVE_CBLAS', None)] 
atlas_info: 
    NOT AVAILABLE 
blas_mkl_info: 
    NOT AVAILABLE 
lapack_mkl_info: 
    NOT AVAILABLE 
atlas_3_10_info: 
    NOT AVAILABLE 
lapack_info: 
    library_dirs = ['/usr/lib'] 
    libraries = ['lapack', 'lapack'] 
    language = f77 
atlas_blas_threads_info: 
    NOT AVAILABLE 

No muestra la vinculación con openblas.Sin embargo, el nuevo resultado del script muestra que numpy debe haber utilizado openblas:

dotted two (1000,1000) matrices in 15.2 ms 
dotted two (4000) vectors in 2.64 us 
SVD of (2000,1000) matrix in 0.469 s 
Eigendecomp of (1500,1500) matrix in 2.794 s