복붙노트

[PYTHON] ATLAS / MKL을 설치된 Numpy에 연결하십시오

PYTHON

ATLAS / 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. ==============================

    1.당신이 리눅스의 어떤 맛을 내고 있다고 가정하면, 당신이 할 수있는 한가지 방법이 있습니다 :

    당신이 리눅스의 어떤 맛을 내고 있다고 가정하면, 당신이 할 수있는 한가지 방법이 있습니다 :

    numpy의 "최신"버전을 원하면 OpenBLAS 통합 소스에서 numpy를 컴파일 할 때 내 대답을 살펴볼 수도 있습니다.

    @tndoan이 주석에서 언급했듯이, ~ / .numpy-site.cfg에 설정 파일을 배치하여 pip를 numpy에 대한 특정 구성으로 만들 수 있습니다. 자세한 내용은이 답변을 참조하십시오.

    개인적으로는 numpy를 손으로 구성하고 빌드하는 것이 좋습니다. 특별히 어려운 것은 아니며 numpy의 구성을보다 잘 제어 할 수 있습니다.

  2. ==============================

    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를 사용하여 차이점을 테스트 할 수 있습니다.

  3. from https://stackoverflow.com/questions/21671040/link-atlas-mkl-to-an-installed-numpy by cc-by-sa and MIT license