2012-07-11 15 views
44

Sto cercando di installare numpy con OpenBLAS, tuttavia sono in perdita su come il file site.cfg deve essere scritto.Compilazione numpy con integrazione OpenBLAS

Quando è stato seguito il installation procedure, l'installazione è stata completata senza errori, tuttavia si verifica un peggioramento delle prestazioni all'aumentare del numero di thread utilizzati da OpenBLAS da 1 (controllato dalla variabile di ambiente OMP_NUM_THREADS).

Non sono sicuro che l'integrazione di OpenBLAS sia stata perfetta. Qualcuno potrebbe fornire un file site.cfg per ottenere lo stesso risultato.

P.S .: l'integrazione di OpenBLAS in altri toolkit come Theano, che è basata su Python, fornisce un sostanziale aumento delle prestazioni all'aumentare del numero di thread, sulla stessa macchina.

+0

Quando si dice che c'era un degrado delle prestazioni, sei sicuro che il problema era abbastanza grande da giustificare i thread aggiuntivi? Per problemi troppo piccoli causerai un peggioramento delle prestazioni quando usi thread aggiuntivi, e non so se openblas sia abbastanza intelligente da usare solo thread aggiuntivi quando sono utili. – DaveP

+0

Per verificare la variazione delle prestazioni con le dimensioni del problema, ho provato a utilizzare la funzione numpy.linalg.svd su matrici generate casualmente di varie dimensioni (100x100, 100x1000, 1000x1000, 1000x10000,10000x10000) ma in tutti questi casi il i migliori tempi di esecuzione si ottengono con il thread singolo in openblas. Anche per carichi di calcolo pesanti (ad es. 10000x10000 matrice SVD) il singolo thread impiega 5000 secondi mentre 3 thread impiegano 6000 secondi. Questo mi preoccupa un po ', voglio solo verificare se l'integrazione di openblas è giusta. – Vijay

risposta

82

Ho appena compilato numpy all'interno di un virtualenv con l'integrazione OpenBLAS e sembra funzionare correttamente.

Questo è stato il mio processo:

  1. Compile OpenBLAS:

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

    Se non si dispone di diritti di amministratore si possono impostare PREFIX= in una directory in cui si dispone dei privilegi di scrittura (solo modificare il corrispondenti passaggi di seguito di conseguenza).

  2. Assicurarsi che la directory contenente libopenblas.so si trovi nel percorso di ricerca della libreria condivisa.

    • Per fare questo a livello locale, è possibile modificare il file ~/.bashrc per contenere la linea di

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

      La variabile LD_LIBRARY_PATH ambiente verrà aggiornato quando si avvia una nuova sessione di terminale (utilizzare $ source ~/.bashrc per forzare un aggiornamento all'interno della stessa sessione).

    • Un'altra opzione che funziona per più utenti è quello di creare un file .conf nel /etc/ld.so.conf.d/ che contiene la linea /opt/OpenBLAS/lib, per esempio:

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

    Una volta che hai finito con entrambe le opzioni, esegue

    $ sudo ldconfig 
    
  3. prendere il codice numpy fonte:

    $ git clone https://github.com/numpy/numpy 
    $ cd numpy 
    
  4. Copia site.cfg.example a site.cfg e modificare la copia :

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

    togliere il commento alle righe:

    .... 
    [openblas] 
    libraries = openblas 
    library_dirs = /opt/OpenBLAS/lib 
    include_dirs = /opt/OpenBLAS/include 
    .... 
    
  5. Controllare la progettazione, costruire, installare (a scelta all'interno di un virtualenv)

    $ python setup.py config 
    

    L'output dovrebbe essere simile a questa:

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

    Installazione di arguzia h pip utilizza python setup.py install, poiché pip terrà traccia dei metadati del pacchetto e consentirà di disinstallare o aggiornare facilmente numpy in futuro.

    $ pip install . 
    
  6. Opzionale: è possibile utilizzare this script per testare le prestazioni per i vari conteggi del filetto.

    $ 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 
    

Sembra che ci sia un notevole miglioramento in termini di prestazioni per i conteggi del filetto più elevati. Tuttavia, non l'ho testato molto sistematicamente, ed è probabile che per le matrici più piccole il sovraccarico aggiuntivo superi il vantaggio prestazionale derivante da un numero superiore di thread.

+4

Applico ciò che hai fatto cercando di scorgere errori nel tuo script di test /linalg/lapack_lite.so: simbolo non definito: zgelsd_ – erogol

+1

Ho la seguente riga anche io faccio rigorosamente ciò che hai digitato sopra la risposta. libopenblas.so.0 => /usr/lib/libopenblas.so.0 (0x00007f77e08fc000) – erogol

+0

Un'altra domanda. OpenBlas dipende da OpenMPI o il suo utilizzo aumenta le prestazioni? – erogol

4

Nel caso in cui si utilizza Ubuntu o alla menta, si può facilmente avere openblas NumPy collegato con l'installazione sia NumPy e openblas tramite apt-get come

sudo apt-get install numpy libopenblas-dev 

Su un ubuntu finestra mobile fresca, ho provato il seguente script copiato dal blog postare "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)) 

Senza openblas il risultato è:

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 

Dopo aver installato openblas con apt install openblas-dev, ho controllato il legame con NumPy

import numpy as np 
np.__config__.show() 

e le informazioni sono

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 

Non mostra linkage to openblas.Tuttavia, il nuovo risultato dello script mostra che NumPy deve aver usato 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