Chỉ trong trường hợp bạn đang sử dụng ubuntu hoặc bạc hà, bạn có thể dễ dàng có openblas liên kết NumPy bằng cách cài đặt cả hai NumPy và openblas qua apt-get như
sudo apt-get install numpy libopenblas-dev
Trên ubuntu Docker tươi, tôi đã thử nghiệm kịch bản sau đây sao chép từ blog gửi "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))
Without openblas kết quả là:
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
Sau khi tôi cài đặt openblas với apt install openblas-dev
, tôi đã kiểm tra các liên kết NumPy với
import numpy as np
np.__config__.show()
và thông tin là
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
Nó không hiển thị liên kết để openblas.Tuy nhiên, kết quả mới của tập lệnh cho thấy rằng phần mềm phải được sử dụng 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
Khi bạn nói rằng có sự sụt giảm hiệu suất, bạn có chắc chắn rằng vấn đề đủ lớn để đảm bảo các chuỗi bổ sung? Đối với các vấn đề quá nhỏ, bạn sẽ gây ra sự xuống cấp hiệu suất khi sử dụng các chuỗi phụ, và tôi không biết liệu openblas có đủ thông minh để chỉ sử dụng các chuỗi phụ khi chúng hữu ích hay không. – DaveP
Để kiểm tra sự thay đổi hiệu suất với kích thước của bài toán, tôi đã thử sử dụng hàm numpy.linalg.svd trên các ma trận được tạo ngẫu nhiên với các kích cỡ khác nhau, (100x100, 100x1000, 1000x1000, 1000x10000,10000x10000) nhưng trong tất cả các trường hợp này thời gian thực hiện tốt nhất đạt được với chuỗi đơn trong openblas. Ngay cả đối với tải tính toán nặng (ví dụ: SVX 10000x10000), chuỗi đơn mất 5000 giây trong khi 3 luồng mất 6000 giây. Điều này làm tôi lo lắng một chút, tôi chỉ muốn kiểm tra xem sự tích hợp Openblas có đúng không. – Vijay