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:
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).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íneaexport LD_LIBRARY_PATH=/opt/OpenBLAS/lib:$LD_LIBRARY_PATH
La
LD_LIBRARY_PATH
entornoLD_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
numpy
código fuentenumpy
:$ git clone https://github.com/numpy/numpy $ cd numpy
Copie
site.cfg.example
ensite.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 ....
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 depython setup.py install
, ya quepip
hará un seguimiento de los metadatos del paquete y le permitirá desinstalar o actualizar fácilmente numpy en el futuro.$ pip install .
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