OpenBLAS를 이용하여 numpy와 scipy 설치
제대로 된 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 의 글을 그대로 가져다 편집한 내용이다.
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
numpy 다운로드
:$ git clone https://github.com/numpy/numpy $ cd numpy
site.cfg
에 아래와 같이 설정:.... [openblas] libraries = openblas library_dirs = /home/dwlee/softwares/library/openblas/lib # 설치 환경에 따라 다름
# 설치 환경에 따라 다름
include_dirs = /home/dwlee/softwares/library/openblas/includeconfiguration 확인하고 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
scipy도 numpy와 동일하게 설치
#!/home/dwlee/python/python27/bin/pythonimport numpyimport sysimport timeittry:import numpy.core._dotblasprint 'FAST BLAS'except ImportError:print 'slow blas'print "version:", numpy.__version__print "maxint:", sys.maxintx = numpy.random.random((1000,1000))setup = "import numpy; x = numpy.random.random((1000,1000))"count = 5t = timeit.Timer("numpy.dot(x, x.T)", setup=setup)print "dot:", t.timeit(count)/count, "sec"
#!/home/dwlee/python/python27/bin/pythonimport timeitsetup = "import numpy;\import scipy.linalg as linalg;\x = numpy.random.random((1000,1000));\z = numpy.dot(x, x.T)"count = 5t = 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