티스토리 뷰

제대로 된 BLAS계열 패키지를 설치하지 않으면 numpy와 scipy의 성능이 제대로 나오지 않는다.

요즘 대부분의 서버가 멀티코어 시스템으로 구성되어 있기 때문에 코어를 충분히 활용할 수 있도록 numpy와 scipy를 설치해 주어야 한다.

아래 내용은 openblas를 이용하여 numpy와 scipy를 설치하는 방법이다.


하지만! openblas에 문제가 있는 것인지, 테스트(최하단 소스코드 참고)를 해보면 scipy 테스트에서 에러가 발생하고,

numpy.test(verbose=2)와 scipy.test(verbose=2) 등의 테스트도 제대로 통과하지 못한다 (CentOS 5.7 (Final)에 설치).

잘 설치되시는 분 저 좀 알려주시길..! ㅠ



<openblas, numpy, scipy 설치>


아래 내용은 http://stackoverflow.com/questions/11443302/compiling-numpy-with-openblas-integration 의 글을 그대로 가져다 편집한 내용이다.



  1. OpenBlas 컴파일:

    $ git clone git://github.com/xianyi/OpenBLAS # wget으로 다운로드 해도 됨.
    $ cd OpenBLAS && make FC=gfortran
    $ sudo make PREFIX=/home/dwlee/softwares/library/openblas install
    $ sudo ldconfig
  2. numpy 다운로드:

    $ git clone https://github.com/numpy/numpy
    $ cd numpy
  3. site.cfg 에 아래와 같이 설정:

    ....
    [openblas]
    libraries = openblas
    library_dirs = /home/dwlee/softwares/library/openblas/lib # 설치 환경에 따라 다름
    include_dirs = /home/dwlee/softwares/library/openblas/include
    # 설치 환경에 따라 다름
  4. configuration 확인하고  build & install

    $ python setup.py config

    아래와 같이 openblas에 대한 경로가 잡혀있는지 확인해 본다.

    FOUND:
    libraries = ['openblas']
    library_dirs = ['/home/dwlee/softwares/library/openblas/lib']
    language = c
    define_macros = [('NO_ATLAS_INFO', -1)]
    include_dirs = ['/home/dwlee/softwares/library/openblas/include']

    ATLAS가 잡혀있지 않았나 확인한다 (잡혀있으면 안 됨).

    $ python setup.py build && python setup.py install
  5. scipy도 numpy와 동일하게 설치



<성능 테스트>
numpy와 scipy가 openblas를 꿀덕~ 잘 '먹었는지(?)' 확인하기 위하여 아래 코드로 간단한 성능테스트를 수행해 본다.

출처: https://gist.github.com/osdf/3842524#file_test_scipy.py


#!/home/dwlee/python/python27/bin/python
import numpy
import sys
import timeit
 
try:
import numpy.core._dotblas
print 'FAST BLAS'
except ImportError:
print 'slow blas'
 
print "version:", numpy.__version__
print "maxint:", sys.maxint
print
 
x = numpy.random.random((1000,1000))
 
setup = "import numpy; x = numpy.random.random((1000,1000))"
count = 5
 
t = timeit.Timer("numpy.dot(x, x.T)", setup=setup)
print "dot:", t.timeit(count)/count, "sec"




#!/home/dwlee/python/python27/bin/python
import timeit
  
setup = "import numpy;\
import scipy.linalg as linalg;\
x = numpy.random.random((1000,1000));\
z = numpy.dot(x, x.T)"
count = 5
 
t = timeit.Timer("linalg.cholesky(z, lower=True)", setup=setup)
print "cholesky:", t.timeit(count)/count, "sec"
 
t = timeit.Timer("linalg.svd(z)", setup=setup)
print "svd:", t.timeit(count)/count, "sec"





<Numpy 테스트 결과의 예>

FAST BLAS
version: 1.8.0.dev-3f10c36
maxint: 9223372036854775807

dot: 0.0949754238129 sec

<Scipy 테스트 결과의 예>
cholesky: 0.080588388443 sec
svd: 1.13443040848 sec



참고:

http://osdf.github.io/blog/numpyscipy-with-openblas-for-ubuntu-1204.html

http://mkseo.pe.kr/stats/?p=970



'Python > 요리 방법' 카테고리의 다른 글

bisect 모듈의 insort 함수  (0) 2015.06.19
Cython 간단한 예제  (0) 2015.02.28
몬티홀(Monty Hall) 문제 코드  (0) 2014.02.17
An algorithm of Permutation in DNA Computing  (0) 2011.12.23
Eclipse + Python  (0) 2011.09.22
댓글