2012-07-11 2 views
44

numpyOpenBLAS과 함께 설치하려고하는데, site.cfg 파일을 작성하는 방법이 손실되었습니다.OpenBLAS 통합으로 numpy 컴파일

installation procedure을 따르는 경우 오류없이 설치가 완료되지만 OpenBLAS에서 사용하는 스레드 수가 1 (환경 변수 OMP_NUM_THREADS에 의해 제어 됨)이 증가하면 성능이 저하됩니다.

OpenBLAS 통합이 완벽했는지 확실하지 않습니다. 어느 하나도 site.cfg 파일을 제공 할 수 있습니다.

P .: OpenBLAS는 Python을 기반으로하는 Theano과 같은 다른 툴킷과 통합되어 동일한 시스템에서 스레드 수를 늘리는 데 상당한 성능 향상을 제공합니다.

+0

때 당신은 문제가 추가 스레드를 보장 할만큼 큰 것을 확신, 성능 저하가 있었다라고? 너무 작은 문제의 경우 여분의 스레드를 사용할 때 성능 저하가 발생하며 openblas가 유용 할 때 여분의 스레드 만 사용할만큼 똑똑한 지 여부는 알 수 없습니다. – DaveP

+0

다양한 크기 (100x100, 100x1000, 1000x1000, 1000x10000,10000x10000)의 무작위로 생성 된 행렬에 numpy.linalg.svd 함수를 사용하여 시도한 문제의 크기와 성능 차이가 있는지 확인하려면이 모든 경우에 가장 좋은 실행 시간은 openblas에서 단일 스레드로 달성됩니다. 계산 부하가 많은 경우 (예 : 10000x10000 행렬 SVD) 단일 스레드는 5000 초가 걸리고 3 스레드는 6000 초 걸립니다. 이 점이 나에게 조금 걱정 스럽다. 오픈 블라스 통합이 올바른지 확인하고 싶다. – Vijay

답변

82

virtualenvOpenBLAS 통합 내에서 numpy 방금 ​​컴파일 된 및 확인을 작동하는 것. 당신은 당신이 쓰기 권한이있는 디렉토리에 PREFIX=을 설정할 수 있습니다 관리자 권한이없는 경우

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

(바로 수정 :

  1. 컴파일 OpenBLAS :

    내 처리했다 그에 상응하는 단계들).

  2. libopenblas.so이 들어있는 디렉토리가 공유 라이브러리 검색 경로에 있는지 확인하십시오.

    • 당신은 라인을 포함하여 ~/.bashrc 파일을 편집 할 수 로컬이 작업을 수행하려면 새 터미널 세션 (업데이 트를 강제로 $ source ~/.bashrc를 사용을 시작할 때 LD_LIBRARY_PATH 환경 변수가 업데이트됩니다
      export LD_LIBRARY_PATH=/opt/OpenBLAS/lib:$LD_LIBRARY_PATH 
      

      동일한 세션 내에서).

    • .conf 파일을 인 /etc/ld.so.conf.d/에 생성하는 것입니다.: 당신은

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

    을 옵션 중 하나를 함께 할

    $ sudo ldconfig 
    
  3. 잡고 numpy 소스 코드를 실행하면 :

    $ git clone https://github.com/numpy/numpy 
    $ cd numpy 
    
  4. 복사 site.cfg.examplesite.cfg과 사본을 편집 :

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

    의 주석이 라인 :

    .... 
    [openblas] 
    libraries = openblas 
    library_dirs = /opt/OpenBLAS/lib 
    include_dirs = /opt/OpenBLAS/include 
    .... 
    
  5. 확인 구성, 구축, 출력은 다음과 비슷한 모습이 될 것입니다

    $ python setup.py config 
    

    (A virtualenv 내부 옵션) 설치 :

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

    지혜로 설치 pippython setup.py install을 사용하여 preferable으로 변경됩니다. pip은 패키지 메타 데이터를 추적하고 이후에 쉽게 numpy를 제거하거나 업그레이드 할 수 있습니다. 옵션

    $ pip install . 
    
  6. : 당신은 다른 스레드 카운트의 성능을 테스트하기 위해 this script를 사용할 수 있습니다.

    $ 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 
    

높은 스레드 카운트 성능이 눈에 띄게 개선 될 것 같다. 그러나 이것을 매우 체계적으로 테스트하지는 않았으므로 더 작은 행렬의 경우 더 많은 스레드 오버 헤드가 발생하면 성능 오버 헤드가 더 커질 수 있습니다.

+4

테스트 스크립트 /linalg/lapack_lite.so에서 foolowing 오류가있는 부분을 적용합니다. undefined symbol : zgelsd_ – erogol

+1

위의 내용을 입력해도 정확하게 다음 행을 사용합니다. libopenblas.so.0 => /usr/lib/libopenblas.so.0 (0x00007f77e08fc000) – erogol

+0

질문이 하나 더 있습니다. OpenBlas는 OpenMPI에 의존합니까? 아니면 사용하면 성능이 향상됩니까? – erogol

4

그냥 경우에 당신이 우분투 나 민트를 사용하고, 쉽게 NumPy와와 openblas를 통해 모두 설치하여 openblas 연결 NumPy와이 할 수있는 새로운 고정 표시기 우분투에

sudo apt-get install numpy libopenblas-dev 

으로 APT를-얻을, 나는 다음과 같은 스크립트를 테스트 openblas없이 "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)) 

을 게시 블로그에서 복사 한 결과는 다음과 같습니다

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 
내가 apt install openblas-dev와 openblas를 설치 한 후

, 나는

import numpy as np 
np.__config__.show() 

와 NumPy와 연결을 확인하고 정보를

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 

그것은 openblas에 연결이 표시되지 않습니다이다.그러나 스크립트의 새로운 결과는 NumPy와는 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 
관련 문제