2012-07-11 24 views
44

Próbuję zainstalować numpy z OpenBLAS, ale nie rozumiem, jak należy zapisać plik site.cfg.Kompilowanie numpy z integracją OpenBLAS

Po wykonaniu instalacji bez błędów, nastąpiła degradacja wydajności przy zwiększaniu liczby wątków używanych przez OpenBLAS od 1 (kontrolowane przez zmienną środowiskową OMP_NUM_THREADS).

Nie jestem pewien, czy integracja OpenBLAS była doskonała. Czy ktokolwiek może dostarczyć plik site.cfg, aby osiągnąć to samo.

P.S .: Integracja OpenBLAS w innych zestawach narzędzi, takich jak Theano, oparta na języku Python, zapewnia znaczny wzrost wydajności w zakresie zwiększania liczby wątków na tym samym komputerze.

+0

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

+0

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

Odpowiedz

82

Właśnie skompilowałem numpy wewnątrz integracji virtualenv z OpenBLAS i wygląda na to, że działa poprawnie.

To był mój sposób:

  1. kompilacji OpenBLAS:

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

    Jeśli nie masz uprawnień administratora można ustawić PREFIX= do katalogu gdzie masz uprawnienia do zapisu (wystarczy zmodyfikować odpowiednie kroki poniżej).

  2. Upewnij się, że katalog zawierający libopenblas.so znajduje się w ścieżce wyszukiwania do biblioteki współużytkowanej.

    • Aby to zrobić lokalnie, można edytować plik ~/.bashrc zawierać linia

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

      Zmienna LD_LIBRARY_PATH środowisko będzie aktualizowany po uruchomieniu nowej sesji terminala (użyj $ source ~/.bashrc aby wymusić aktualizację w ramach tej samej sesji).

    • Inną opcją, która będzie pracować dla wielu użytkowników jest stworzenie pliku .conf w /etc/ld.so.conf.d/ zawierający linię /opt/OpenBLAS/lib, np:

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

    Gdy skończysz z obu opcji, uruchom

    $ sudo ldconfig 
    
  3. Pobierz kod numpy źródło:

    $ git clone https://github.com/numpy/numpy 
    $ cd numpy 
    
  4. Kopiowanie site.cfg.example do site.cfg i edytować kopię :

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

    Odkomentuj te linie:

    .... 
    [openblas] 
    libraries = openblas 
    library_dirs = /opt/OpenBLAS/lib 
    include_dirs = /opt/OpenBLAS/include 
    .... 
    
  5. Sprawdź konfiguracja, budowa, instalacja (ewentualnie wewnątrz virtualenv)

    $ python setup.py config 
    

    Wyjście powinno wyglądać mniej więcej tak:

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

    Instalowanie dowcipu h pip jest preferable do korzystania z , ponieważ pip będzie śledzić metadane pakietu i pozwala łatwo odinstalować lub zaktualizować numpy w przyszłości.

    $ pip install . 
    
  6. Opcjonalnie można użyć this script do testowania wydajności dla różnych liczy wątku.

    $ 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 
    

Wydaje się być zauważalna poprawa wydajności dla większej liczby gwintów. Jednak nie testowałem tego bardzo systematycznie i jest prawdopodobne, że w przypadku mniejszych macierzy dodatkowe obciążenie przewyższy korzyści związane z wydajnością wynikające z większej liczby wątków.

+4

Stosuję to, co robiłeś, wykonując błąd w pisaniu w swoim teście testowym /linalg/lapack_lite.so: niezdefiniowany symbol: zgelsd_ – erogol

+1

Mam następującą linię, nawet ja robię ściśle to, co wpisałeś powyżej. libopenblas.so.0 => /usr/lib/libopenblas.so.0 (0x00007f77e08fc000) – erogol

+0

Jeszcze jedno pytanie. Czy openBlas zależy od OpenMPI, czy używanie go zwiększa wydajność? – erogol

4

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 
Powiązane problemy