2012-07-11 12 views
44

Ich versuche, numpy mit OpenBLAS zu installieren, jedoch bin ich bei Verlust, wie die site.cfg-Datei geschrieben werden muss.Kompilieren von numpy mit OpenBLAS-Integration

Wenn die installation procedure folgte die Installation ohne Fehler abgeschlossen ist, gibt es jedoch Leistungseinbußen bei der Erhöhung der Anzahl der Threads von OpenBLAS von 1 (gesteuert durch die Umgebungsvariable OMP_NUM_THREADS).

Ich bin mir nicht sicher, ob die OpenBLAS-Integration perfekt war. Könnte jemand eine site.cfg Datei zur Verfügung stellen, um das gleiche zu erreichen.

S.S .: OpenBLAS-Integration in andere Toolkits wie Theano, die auf Python basiert, bietet erhebliche Leistungssteigerung bei der Erhöhung der Anzahl der Threads, auf der gleichen Maschine.

+0

Wenn Sie sagen, dass es eine Leistungsverschlechterung ist, sind Sie sicher, dass das Problem groß genug war, um die zusätzlichen Fäden zu rechtfertigen? Bei zu kleinen Problemen führen Sie bei Verwendung von zusätzlichen Threads zu Leistungseinbußen, und ich weiß nicht, ob openblas intelligent genug ist, nur zusätzliche Threads zu verwenden, wenn sie nützlich sind. – DaveP

+0

Um die Leistungsschwankung mit der Größe des Problems zu überprüfen, habe ich versucht, die Funktion numpy.linalg.svd auf zufällig erzeugten Matrizen verschiedener Größen (100x100, 100x1000, 1000x1000, 1000x10000,10000x10000) zu verwenden, aber in allen diesen Fällen Die besten Ausführungszeiten werden mit single thread in openblas erreicht. Selbst für eine hohe Rechenlast (z. B. 10000 × 10000 Matrix SVD) benötigt der einzelne Thread 5000 Sekunden, während 3 Threads 6000 Sekunden benötigen. Das beunruhigt mich ein wenig, ich möchte nur überprüfen, ob die openblas-Integration richtig ist. – Vijay

Antwort

82

Ich habe gerade kompiliert numpy innerhalb einer virtualenv mit OpenBLAS Integration, und es scheint zu funktionieren OK.

Das war mein Prozess:

  1. Compile OpenBLAS:

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

    Wenn Sie Sie PREFIX= nicht über Administratorrechte verfügen, um ein Verzeichnis setzen könnte, wo Sie Schreibrechte haben (nur ändern die entsprechende Schritte unten entsprechend).

  2. Stellen Sie sicher, dass sich das Verzeichnis libopenblas.so in Ihrem Suchpfad für die gemeinsame Bibliothek befindet.

    • dies lokal zu tun, Sie könnten Ihre ~/.bashrc Datei bearbeiten, um die Linie

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

      Die LD_LIBRARY_PATH Umgebungsvariable aktualisiert werden enthalten, wenn Sie eine neue Terminal-Sitzung (verwenden $ source ~/.bashrc zu zwingen, ein Update starten innerhalb derselben Sitzung).

    • Eine weitere Option, die für mehrere Benutzer arbeiten, ist eine .conf Datei in /etc/ld.so.conf.d/ enthält die Zeile /opt/OpenBLAS/lib, zum Beispiel zu erstellen:

      $ git clone https://github.com/numpy/numpy 
      $ cd numpy 
      
    • Kopieren site.cfg.example zu site.cfg und bearbeiten Sie die Kopie:

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

    Sobald Sie sind entweder mit Option,

    $ sudo ldconfig 
    
  3. greifen die numpy Quellcode laufen getan :

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

    Kommentar- diese Zeilen:

    .... 
    [openblas] 
    libraries = openblas 
    library_dirs = /opt/OpenBLAS/lib 
    include_dirs = /opt/OpenBLAS/include 
    .... 
    
  4. Konfiguration prüfen, bauen, installieren (optional in einem virtualenv)

    $ python setup.py config 
    

    Die Ausgabe wie folgt aussehen sollte:

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

    Installation mit h pip ist preferable zu verwenden python setup.py install, seit pip wird die Paket-Metadaten zu verfolgen und können Sie einfach in Zukunft numpy zu deinstallieren oder zu aktualisieren.

    $ pip install . 
    
  5. Optional: Sie können this script verwenden Leistung für unterschiedliche Fadenzahlen zu testen.

    $ 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 
    

Es scheint für höhere Fadenzahlen eine spürbare Verbesserung der Leistung. Allerdings habe ich dies nicht sehr systematisch getestet, und es ist wahrscheinlich, dass bei kleineren Matrizen der zusätzliche Overhead den Leistungsvorteil einer höheren Threadanzahl überwiegen würde.

+4

Ich wende an, was du getan hast, das mit tollowing-Fehler bei deinem Testskript /linalg/lapack_lite.so: undefined symbol: zgelsd_ – erogol

+1

Ich habe folgende Linie sogar ich tue streng, was du oben getippt antwortest. libopenblas.so.0 => /usr/lib/libopenblas.so.0 (0x00007f77e08fc000) – erogol

+0

Noch eine Frage. Ist openBlas abhängig von OpenMPI oder erhöht sich die Performance? – erogol

4

Gerade falls Sie verwenden ubuntu oder Minze, Sie leicht openblas verknüpft numpy durch die Installation sowohl numpy und openblas via apt-get als

sudo apt-get install numpy libopenblas-dev 

Auf einem frischen Docker ubuntu haben kann, testete ich das folgende Skript Post aus dem Blog kopiert "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)) 

Ohne openblas das Ergebnis:

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 

Nachdem ich openblas mit apt install openblas-dev installiert, überprüfte ich die numpy Verknüpfung mit

import numpy as np 
np.__config__.show() 

und die Informationen

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 

Es zeigt keine Bindung an openblas.Allerdings zeigt das neue Ergebnis des Skripts, dass numpy openblas verwendet haben muß:

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