python3 libreria python numpy blas atlas

python - libreria - numpy version



Compilando numpy con integraciĆ³n OpenBLAS (2)

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

Este 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 no tiene derechos de administrador, puede establecer PREFIX= en un directorio donde tenga privilegios de escritura (simplemente modifique los pasos correspondientes a continuación).

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

    • Para hacer esto localmente, puede editar su archivo ~/.bashrc para contener la línea

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

      La LD_LIBRARY_PATH entorno LD_LIBRARY_PATH se actualizará cuando inicie una nueva sesión de terminal (use $ source ~/.bashrc para forzar una actualización dentro de la misma sesión).

    • Otra opción que funcionará para múltiples usuarios es crear un archivo .conf en /etc/ld.so.conf.d/ contenga 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, ejecute

    $ sudo ldconfig

  3. numpy código fuente numpy :

    $ git clone https://github.com/numpy/numpy $ cd numpy

  4. Copie site.cfg.example en site.cfg y edite la copia:

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

    Descomente estas líneas:

    .... [openblas] libraries = openblas library_dirs = /opt/OpenBLAS/lib include_dirs = /opt/OpenBLAS/include ....

  5. Verificar configuración, compilación, instalación (opcionalmente dentro de un virtualenv )

    $ python setup.py config

    El resultado debería verse más o menos así:

    ... 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 con pip es preferable a usar la instalación de 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: puede usar este script para probar el rendimiento para diferentes recuentos 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 un mayor número de hilos. 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.

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

Cuando se siguió el procedimiento de instalación, 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 si la integración OpenBLAS ha sido perfecta. ¿Podría alguien proporcionar un archivo site.cfg para lograr lo mismo.

PD: La integración de OpenBLAS en otros kits de herramientas como Theano , que se basa en Python, proporciona un impulso sustancial en el rendimiento al aumentar el número de subprocesos en la misma máquina.


En caso de que esté usando ubuntu o mint, puede tener numpy fácilmente enlazado a openblas instalando tanto numpy como openblas a través de apt-get como

sudo apt-get install numpy libopenblas-dev

En una nueva plataforma ubuntu, probé la siguiente secuencia de comandos copiada de la publicación del blog this

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 , verifiqué el enlace numpy con

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 el enlace a openblas. Sin embargo, el nuevo resultado de la secuencia de comandos muestra que numpy debe haber usado 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