2012-07-11 15 views
44

ile numpy yüklemeye çalışıyorum, ancak site.cfg dosyasının nasıl yazılacağı konusunda kaygı duyuyorum.OpenBLAS tümleştirmesiyle uyuşmazlık

installation procedure izlendiğinde, yükleme işlemi hatasız tamamlandığında, OpenBLAS tarafından kullanılan (OMP_NUM_THREADS ortam değişkeni tarafından denetlenen) iş parçacıklarının sayısını artırmada performans düşüşü vardır.

OpenBLAS entegrasyonunun mükemmel olup olmadığından emin değilim. Biri aynı ulaşmak için site.cfg dosya sağlayabilir.

Ürün kodu: Python'u temel alan Theano gibi diğer araç takımlarındaki OpenBLAS tümleştirmesi, aynı makinede iplik sayısını artırmaya yönelik önemli bir performans artışı sağlar.

+0

zaman sorunun ek konuları gerektirecek kadar büyük olduğunu eminiz, bir performans düşüşü olduğunu söylemek? Çok küçük sorunlar için, fazladan iş parçacığı kullanırken performans düşüşüne neden olacaksınız ve openblas'ın yalnızca yararlı olduklarında fazladan iş parçacığı kullanacak kadar akıllı olup olmadığını bilmiyorum. – DaveP

+0

Performansın varyasyon boyutunu kontrol etmek için, numpy.linalg.svd işlevini çeşitli boyutlardaki (100x100, 100x1000, 1000x1000, 1000x10000,10000x10000) rastgele oluşturulmuş matrisler üzerinde denedim ancak tüm bu durumlarda En iyi yürütme süreleri, openblas'taki tek thread ile elde edilir. Ağır hesaplama yükü (ör. 10000x10000 matris SVD) için bile tek iplik 5000 saniye alırken, 3 iplik 6000 saniye alır. Bu beni biraz endişelendiriyor, sadece openblas entegrasyonunun doğru olup olmadığını kontrol etmek istiyorum. – Vijay

cevap

82

Sadece virtualenv'un içerisindeki numpy derlemesini derledim ve tamam çalışıyor gibi görünüyor. size yazma ayrıcalıklarına sahip bir dizine PREFIX= ayarlayabilirsiniz yönetici haklarına sahip değilseniz

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

(sadece değiştirin:

  1. Derleme OpenBLAS:

    Bu

    benim süreçti uygun şekilde aşağıdaki adımları).

  2. libopenblas.so içeren dizinin paylaşılan kitaplık arama yolunda bulunduğundan emin olun.

    • Eğer satırını içerecek biçimde ~/.bashrc dosyayı düzenleyebilir, lokal Bunu yapmak için yeni bir terminal oturumu (bir güncelleme zorlamak için $ source ~/.bashrc kullanmak başladıklarında LD_LIBRARY_PATH ortam değişkeni güncellenir
      export LD_LIBRARY_PATH=/opt/OpenBLAS/lib:$LD_LIBRARY_PATH 
      

      aynı oturumda).

    • birden fazla kullanıcı için çalışacak bir başka seçenek, örneğin çizgi /opt/OpenBLAS/lib içeren /etc/ld.so.conf.d/ bir .conf dosyası oluşturmaktır

    • : Eğer

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

    , opsiyon ya ile yapılır

    $ sudo ldconfig 
    
  3. tut numpy kaynak kodu çalıştırmak sonra:

    $ git clone https://github.com/numpy/numpy 
    $ cd numpy 
    
  4. Kopya site.cfg.examplesite.cfg ve kopyasını düzenleyin :

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

    ni bu satırlar:

    .... 
    [openblas] 
    libraries = openblas 
    library_dirs = /opt/OpenBLAS/lib 
    include_dirs = /opt/OpenBLAS/include 
    .... 
    
  5. Kontrol yapılandırma, inşa çıktı bu gibi görünmelidir

    $ python setup.py config 
    

    (a virtualenv içine isteğe) yükleyin:

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

    Zekayı kurma pip kullanmak için preferable, pip, paket meta verilerini takip edecek ve gelecekte kolayca numpy'i kaldırmanıza veya yükseltmenize izin verecektir. Opsiyonel

    $ pip install . 
    
  6. : Farklı iplik sayıları için performansını test etmek this script kullanabilirsiniz.

    $ 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 
    

yüksek iplik sayıları için performansta gözle görülür bir iyileşme var gibi görünüyor. Bununla birlikte, bunu sistematik olarak test etmedim ve daha küçük matrisler için ek yükün daha yüksek bir iplik sayımından performans avantajından daha ağır basması muhtemeldir.

+4

Test komut dosyanızda takip dosyasında hata ayıklama eğilimi olan bir uygulama /linalg/lapack_lite.so: undefined symbol: zgelsd_ – erogol

+1

Aşağıdaki satırlarda bile, kesinlikle yukarıda yazdığınız yanıtı yazarım. libopenblas.so.0 => /usr/lib/libopenblas.so.0 (0x00007f77e08fc000) – erogol

+0

Bir soru daha. OpenBlas OpenMPI'ye bağlı mı yoksa kullanmasını mı artırıyor? – erogol

4

Her ihtimale karşı Ubuntu veya nane kullanıyorsanız, kolayca numpy ve openblas aracılığı hem yükleyerek openblas bağlantılı numpy olabilir taze bir liman işçisi ubuntu üzerinde

sudo apt-get install numpy libopenblas-dev 

olarak apt-get, ben aşağıdaki komut dosyasını test openblas olmadan "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)) 

sonrası blogdan kopyalanan sonucudur:

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 
Ben apt install openblas-dev ile openblas yüklü sonra

, ben

import numpy as np 
np.__config__.show() 

ile numpy bağlantı kontrol ve bilgi

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 

Bu openblas için bağlantıyı göstermez olduğunu.Ancak, senaryonun yeni sonuç numpy openblas kullanmış gerektiğini göstermektedir:

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 
İlgili konular