2012-07-11 27 views
44

Tôi đang cố gắng cài đặt numpy với OpenBLAS, tuy nhiên tôi bị mất về cách ghi tệp site.cfg.Biên dịch gọn gàng với tích hợp OpenBLAS

Khi installation procedure được theo sau quá trình cài đặt hoàn thành không có lỗi, tuy nhiên có sự xuống cấp hiệu suất khi tăng số lượng chuỗi được sử dụng bởi OpenBLAS từ 1 (được kiểm soát bởi biến môi trường OMP_NUM_THREADS).

Tôi không chắc liệu tích hợp OpenBLAS có hoàn hảo hay không. Bất kỳ ai cũng có thể cung cấp tệp site.cfg để đạt được điều tương tự.

P.S .: Tích hợp OpenBLAS trong các bộ công cụ khác như Theano, dựa trên Python, cung cấp hiệu suất đáng kể để tăng số lượng chủ đề, trên cùng một máy.

+0

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

+0

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

Trả lời

82

Tôi vừa biên soạn numpy bên trong một số virtualenv với tích hợp OpenBLAS và có vẻ như hoạt động OK.

Đây là quá trình của tôi:

  1. Compile OpenBLAS:

    $ git clone https://github.com/xianyi/OpenBLAS 
    $ cd OpenBLAS && make FC=gfortran 
    $ sudo make PREFIX=/opt/OpenBLAS install 
    

    Nếu bạn không có quyền quản trị bạn có thể thiết PREFIX= vào một thư mục nơi bạn có quyền ghi (chỉ cần thay đổi các bước tương ứng bên dưới cho phù hợp).

  2. Đảm bảo rằng thư mục chứa libopenblas.so nằm trong đường dẫn tìm kiếm trong thư viện được chia sẻ của bạn.

    • Để làm điều này tại địa phương, bạn có thể chỉnh sửa tập tin ~/.bashrc của bạn để chứa dòng

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

      Biến LD_LIBRARY_PATH môi trường sẽ được cập nhật khi bạn bắt đầu một phiên ga mới (sử dụng $ source ~/.bashrc để buộc một bản cập nhật trong cùng một phiên).

    • Một tùy chọn khác sẽ hoạt động cho nhiều người dùng là tạo tệp .conf trong /etc/ld.so.conf.d/ chứa dòng /opt/OpenBLAS/lib, ví dụ::

      $ sudo sh -c "echo '/opt/OpenBLAS/lib' > /etc/ld.so.conf.d/openblas.conf" 
      

    Khi bạn đang thực hiện với hai tùy chọn, chạy

    $ sudo ldconfig 
    
  3. Grab mã numpy nguồn:

    $ git clone https://github.com/numpy/numpy 
    $ cd numpy 
    
  4. Sao chép site.cfg.example để site.cfg và chỉnh sửa các bản sao :

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

    Bỏ ghi chú những dòng này:

    .... 
    [openblas] 
    libraries = openblas 
    library_dirs = /opt/OpenBLAS/lib 
    include_dirs = /opt/OpenBLAS/include 
    .... 
    
  5. Kiểm tra cấu hình, xây dựng, lắp đặt (tùy chọn bên trong một virtualenv)

    $ python setup.py config 
    

    Đầu ra nên trông một cái gì đó như thế này:

    ... 
    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)] 
    ... 
    

    Cài đặt wit h pippreferable để sử dụng python setup.py install, vì pip sẽ theo dõi siêu dữ liệu gói và cho phép bạn dễ dàng gỡ cài đặt hoặc nâng cấp gọn gàng trong tương lai.

    $ pip install . 
    
  6. Tùy chọn: bạn có thể sử dụng this script để kiểm tra hiệu suất cho số lượng chỉ khác nhau.

    $ 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 
    

Dường như có một sự cải thiện đáng kể hiệu suất cho đếm chủ đề cao hơn. Tuy nhiên, tôi đã không thử nghiệm này rất có hệ thống, và nó có khả năng là cho ma trận nhỏ hơn chi phí bổ sung sẽ lớn hơn lợi ích hiệu suất từ ​​một số thread cao hơn.

+4

Tôi áp dụng những gì bạn đã làm bu xu hướng với lỗi foollowing tại tập lệnh thử nghiệm của bạn /linalg/lapack_lite.so: biểu tượng không xác định: zgelsd_ – erogol

+1

Tôi có dòng sau ngay cả tôi làm đúng những gì bạn đã gõ ở trên câu trả lời. libopenblas.so.0 => /usr/lib/libopenblas.so.0 (0x00007f77e08fc000) – erogol

+0

Một câu hỏi nữa. OpenBlas có phụ thuộc vào OpenMPI hay sử dụng nó làm tăng hiệu năng? – erogol

4

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 
Các vấn đề liên quan