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