Tylko w przypadku używasz ubuntu lub mięty, można łatwo mieć openblas połączoną numpy instalując zarówno numpy i openblas poprzez apt-get jako
sudo apt-get install numpy libopenblas-dev
na świeżym Döcker ubuntu, testowałem następujący skrypt skopiowane z bloga pisać "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))
Bez openblas wynik jest:
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
Po zainstalowaniu openblas z apt install openblas-dev
, sprawdziłem numpy powiązania z
import numpy as np
np.__config__.show()
a informacja jest
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
Nie pokazuje podnośnik do openblas.Jednak nowy wynik skryptu pokazuje, że numpy musiał użyć 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
Kiedy mówisz, że nastąpiło pogorszenie wydajności, jesteś pewien, że problem był wystarczająco duży, aby uzasadnić dodatkowe wątki? Zbyt małe problemy spowodują pogorszenie wydajności przy korzystaniu z dodatkowych wątków i nie wiem, czy openblas jest wystarczająco inteligentny, aby używać tylko dodatkowych wątków, gdy są one przydatne. – DaveP
W celu sprawdzenia zmiany wydajności wraz z rozmiarem problemu spróbowałem użyć funkcji numpy.linalg.svd na losowo wygenerowanych macierzach o różnych rozmiarach (100x100, 100x1000, 1000x1000, 1000x10000, 10000x10000), ale we wszystkich tych przypadkach najlepsze czasy wykonania są osiągane przy pojedynczym wątku w openblas. Nawet w przypadku dużego obciążenia obliczeniowego (na przykład SVD matrycy 10000x10000) pojedynczy wątek zajmuje 5000 sekund, podczas gdy 3 wątki zajmują 6000 sekund. To mnie trochę martwi, chcę tylko sprawdzić, czy integracja openblas jest właściwa. – Vijay