[PYTHON] ATLAS / MKL을 설치된 Numpy에 연결하십시오
PYTHONATLAS / MKL을 설치된 Numpy에 연결하십시오
TL, DR 재건없이 ATLAS / MKL을 기존 Numpy에 연결하는 방법.
Numpy를 사용하여 큰 행렬을 계산했는데 Numpy가 계산을하기 위해 1 개의 코어만을 사용하기 때문에 속도가 매우 느린 것으로 나타났습니다. 많은 검색을 한 후에 ATLAS / MKL과 같은 최적화 된 라이브러리에 내 Numpy가 연결되어 있지 않은 것으로 나타났습니다. numpy의 설정은 다음과 같습니다.
>>>import numpy as np
>>>np.__config__.show()
blas_info:
libraries = ['blas']
library_dirs = ['/usr/lib']
language = f77
lapack_info:
libraries = ['lapack']
library_dirs = ['/usr/lib']
language = f77
atlas_threads_info:
NOT AVAILABLE
blas_opt_info:
libraries = ['blas']
library_dirs = ['/usr/lib']
language = f77
define_macros = [('NO_ATLAS_INFO', 1)]
atlas_blas_threads_info:
NOT AVAILABLE
openblas_info:
NOT AVAILABLE
lapack_opt_info:
libraries = ['lapack', 'blas']
library_dirs = ['/usr/lib']
language = f77
define_macros = [('NO_ATLAS_INFO', 1)]
atlas_info:
NOT AVAILABLE
lapack_mkl_info:
NOT AVAILABLE
blas_mkl_info:
NOT AVAILABLE
atlas_blas_info:
NOT AVAILABLE
mkl_info:
NOT AVAILABLE
이런 이유로 ATLAS / MKL을 Numpy에 연결하려고합니다. 그러나, 내 Numpy는 PIP에서 설치되므로 최신 버전을 사용하기 때문에 수동으로 설치하고 싶지 않습니다. 나는 약간 수색을했다 그러나 그들은 처음부터 건축을 위해서만을 위해이다. 이런 이유로, 제 질문은 :
해결법
-
==============================
1.당신이 리눅스의 어떤 맛을 내고 있다고 가정하면, 당신이 할 수있는 한가지 방법이 있습니다 :
당신이 리눅스의 어떤 맛을 내고 있다고 가정하면, 당신이 할 수있는 한가지 방법이 있습니다 :
numpy의 "최신"버전을 원하면 OpenBLAS 통합 소스에서 numpy를 컴파일 할 때 내 대답을 살펴볼 수도 있습니다.
@tndoan이 주석에서 언급했듯이, ~ / .numpy-site.cfg에 설정 파일을 배치하여 pip를 numpy에 대한 특정 구성으로 만들 수 있습니다. 자세한 내용은이 답변을 참조하십시오.
개인적으로는 numpy를 손으로 구성하고 빌드하는 것이 좋습니다. 특별히 어려운 것은 아니며 numpy의 구성을보다 잘 제어 할 수 있습니다.
-
==============================
2.대답은 NumPy가 초기에 구축 된 방법에 달려 있습니다. BLAS 및 LAPACK에 대해 빌드 된 경우 numpy.dot이 나중에 다시 빌드하지 않고 ATLAS / MKL을 사용하도록 할 수있는 방법이 없습니다. 다른 함수는 numpy.dot를 사용하지 않으므로 update-alternatives를 사용하여 libblas.so.3 및 liblapack.so.3과 같은 심볼릭 링크의 대상을 변경할 수 있습니다. numpy.dot에는 ATLAS 스타일의 CBLAS 또는 OpenBLAS / MKL이 필요하지만 netlib의 BLAS / CBLAS 및 LAPACK은 필요하지 않기 때문입니다.
대답은 NumPy가 초기에 구축 된 방법에 달려 있습니다. BLAS 및 LAPACK에 대해 빌드 된 경우 numpy.dot이 나중에 다시 빌드하지 않고 ATLAS / MKL을 사용하도록 할 수있는 방법이 없습니다. 다른 함수는 numpy.dot를 사용하지 않으므로 update-alternatives를 사용하여 libblas.so.3 및 liblapack.so.3과 같은 심볼릭 링크의 대상을 변경할 수 있습니다. numpy.dot에는 ATLAS 스타일의 CBLAS 또는 OpenBLAS / MKL이 필요하지만 netlib의 BLAS / CBLAS 및 LAPACK은 필요하지 않기 때문입니다.
openSUSE를 사용하고 있으며 netblib에서 표준 cblas-devel을 설치했습니다. 그러나 NumPy에 배송 된 cblas / cblas-devel을 사용하는 것은 불가능한 것처럼 보입니다. 즉, netlib BLAS / LAPACK / CBLAS (공식 패키지로)에 대해 NumPy를 빌드 한 경우 _dotblas.so (BLAS 버전 numpy.dot 제공)를 빌드 할 수 없습니다 (1.10 이전). 또는 multiarray.so (1.10 그리고 나중에) libblas.so.3에 전혀 링크하지 않습니다. github : https://github.com/numpy/numpy/issues/1265 및 인용 된 데비안 버그 보고서 (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=464784)를 참조하십시오. 아마도 누군가가 패치를 작성하기 위해 소스 코드에 뛰어들 수 있습니다 ... 어쨌든 영향을받는 함수 (numpy.dot) 일뿐입니다. 이제 더 빠른 OpenBLAS를 사용하여 NumPy를 쉽게 다시 작성할 수 있습니다. 모든.
결론 : 나중에 다시 빌드하지 않고도 ATLAS / MKL / OpenBLAS에 링크 할 수 있지만 numPy가 ATLAS / MKL / OpenBLAS에 대해 처음으로 빌드되지 않은 경우 numpy.dot가 매우 느립니다 (numpy.dot는 단순히 BLAS를 사용하지 않았기 때문에 첫 번째 장소이고 컴파일이 완료되면 아무 것도 할 수 없습니다).
업데이트 : 사실 numpy가 _dotblas.so를 만들도록 강요 할 수 있습니다. numpy-1.9.2에 대한 패치를 만들었습니다.
diff -Npru numpy-1.9.2.orig/numpy/core/setup.py numpy-1.9.2/numpy/core/setup.py --- numpy-1.9.2.orig/numpy/core/setup.py 2015-02-01 11:38:25.000000000 -0500 +++ numpy-1.9.2/numpy/core/setup.py 2016-03-28 01:31:12.948885383 -0400 @@ -953,8 +953,8 @@ def configuration(parent_package='',top_ #blas_info = {} def get_dotblas_sources(ext, build_dir): if blas_info: - if ('NO_ATLAS_INFO', 1) in blas_info.get('define_macros', []): - return None # dotblas needs ATLAS, Fortran compiled blas will not be sufficient. + #if ('NO_ATLAS_INFO', 1) in blas_info.get('define_macros', []): + # return None # dotblas needs ATLAS, Fortran compiled blas will not be sufficient. return ext.depends[:3] return None # no extension module will be built
_dotblas.so가 libblas.so.3에 연결되었으므로 update-alternatives를 사용하여 차이점을 테스트 할 수 있습니다.
from https://stackoverflow.com/questions/21671040/link-atlas-mkl-to-an-installed-numpy by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] URL에서 Pandas read_csv (0) | 2018.10.08 |
---|---|
[PYTHON] 파이썬의 인터프리터 출력을 캡처하고 텍스트 위젯에 표시하는 방법? (0) | 2018.10.08 |
[PYTHON] ASCII가 아닌 문자를 제거하고 파이썬을 사용하여 마침표와 공백을 남기려면 어떻게합니까? (0) | 2018.10.07 |
[PYTHON] Pyspark : 행으로 여러 배열 열을 분할 (0) | 2018.10.07 |
[PYTHON] 다양한 깊이의 멀티 레벨 defaultdict? (0) | 2018.10.07 |