Numpy: Numpy 1.10.2 + MKL = 좩돌 (Windows)

에 λ§Œλ“  2016λ…„ 01μ›” 02일  Β·  30μ½”λ©˜νŠΈ  Β·  좜처: numpy/numpy

Anacondas Numpyλ₯Ό μ‚¬μš©ν•˜λ“  여기에 νŒ¨ν‚€μ§€ 된 것을 μ‚¬μš©ν•˜λ“  NumpyλŠ” 일뢀 κΈ°λŠ₯κ³Ό μΆ©λŒν•©λ‹ˆλ‹€. 였λ₯˜ λ©”μ‹œμ§€λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll.

κ³Ό

The procedure entry point mkl_aa_fw_get_max_memory could not be located in the dynamic link library C:\Program Files\Python 3.5\lib\site-packages\numpy\core\mkl_intel_thread.dll.

Numpy 1.9.2 (Python 3.3.5μ—μ„œ ν…ŒμŠ€νŠΈ 됨)λŠ” μ •μƒμ μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€ (ν•˜μ§€λ§Œ ν•΄λ‹Ή 디렉토리에도 .dll이 μ—†μŒ).

λ‹ΉλΆ„κ°„ Numpy 1.9둜 λ‹€μš΄ κ·Έλ ˆμ΄λ“œν–ˆμŠ΅λ‹ˆλ‹€. MKL에 λŒ€ν•΄ ν…ŒμŠ€νŠΈν•˜μ§€ μ•ŠλŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ νžŒνŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

μ‹œμŠ€ν…œ 정보

>>> platform.platform()
'Windows-10.0.10586'

>>> sys.version
'3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64 bit (AMD64)]'

>>> np.__version__
'1.10.2'

>>> np.show_config()
blas_opt_info:
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_rt']
    library_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/lib/intel64_win']
    include_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/include']
lapack_mkl_info:
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_rt', 'mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_rt']
    library_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/lib/intel64_win']
    include_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/include']
lapack_opt_info:
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_rt', 'mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_rt']
    library_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/lib/intel64_win']
    include_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/include']
blas_mkl_info:
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_rt']
    library_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/lib/intel64_win']
    include_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/include']
mkl_info:
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_rt']
    library_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/lib/intel64_win']
    include_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/include']
openblas_lapack_info:
  NOT AVAILABLE
00 - Bug build

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@cgohlke λ‹€μŒμ€ λ‚΄ Windows λ””λ ‰ν„°λ¦¬μ—μžˆλŠ” DLLμž…λ‹ˆλ‹€.

['System32\\libiomp5md.dll',
 'System32\\mkl_core.dll',
 'System32\\mkl_def.dll',
 'System32\\mkl_intel_thread.dll',
 'SysWOW64\\libiomp5md.dll',
 'SysWOW64\\mkl_core.dll',
 'SysWOW64\\mkl_intel_thread.dll',
 'SysWOW64\\mkl_p4.dll',
 'SysWOW64\\mkl_p4m.dll',
 'SysWOW64\\mkl_p4m3.dll',
 'SysWOW64\\mkl_p4p.dll']

νŒŒμ΄μ¬μ„ ν˜ΈμΆœν•˜κΈ° 전에 SET PATH=; λ‚΄ PATHλ₯Ό μž¬μ„€μ •ν•˜λ €κ³ ν•˜λ©΄ μ—¬μ „νžˆ 좩돌이 λ°œμƒν•˜μ§€λ§Œ Windows λ””λ ‰ν† λ¦¬μ—μ„œ μœ„μ˜ DLL을 μ™„μ „νžˆ μ œκ±°ν•˜λ©΄ 좩돌이 μ€‘μ§€λ©λ‹ˆλ‹€. 경둜 μš°μ„  μˆœμœ„ 문제 @carlkl처럼 λ³΄μž…λ‹ˆλ‹€.

λͺ¨λ“  30 λŒ“κΈ€

흠, μ—¬κΈ°μ„œ 무슨 일이 μΌμ–΄λ‚˜κ³  μžˆλŠ”μ§€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. 인텔은 λΉŒλ“œμ— λͺ‡ 가지 λ³€κ²½ 사항을 μ μš©ν–ˆμ§€λ§Œ κ΄€λ ¨ λ‚΄μš©μ΄ μ—†λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. Python 3.5λŠ” Windowsμ—μ„œ μ΅œμ‹  VS둜 컴파일되기 λ•Œλ¬Έμ— κ°€λŠ₯ν•œ λ²”μΈμž…λ‹ˆλ‹€. @cgohlke 생각?

κ°€μž₯ 쒋은 방법은 μž¬ν˜„ κΈ°λ₯Ό μ œκ³΅ν•˜λŠ” 것이라고 μƒκ°ν•©λ‹ˆλ‹€ (이것을 μƒμ„±ν•˜λŠ” "일뢀 κΈ°λŠ₯"은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?). κ·Έλ“€μ˜ MKL λΉŒλ“œμ™€ μš°λ¦¬λŠ” 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€).

"일뢀 κΈ°λŠ₯"에 λŒ€ν•΄ μ£„μ†‘ν•©λ‹ˆλ‹€. :)-matplotlibλ₯Ό 톡해 κ°„μ ‘μ μœΌλ‘œ μΆ©λŒν–ˆμŠ΅λ‹ˆλ‹€.

이것은 λ˜‘κ°™μ΄ μΆ©λŒν•©λ‹ˆλ‹€.

A = np.arange(2*3).reshape(2,3).astype(np.float32)
B = np.arange(2*3*2731).reshape(2,3,2731).astype(np.int16)

np.dot(A, B)

λ‚΄ λ…ΈνŠΈλΆ μ—μ„œ μ΅œμ‹ 

>>> np.show_config()
openblas_lapack_info:
  NOT AVAILABLE
lapack_mkl_info:
    include_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/include']
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_rt', 'mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_rt']
    library_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/lib/intel64_win']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
lapack_opt_info:
    include_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/include']
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_rt', 'mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_rt']
    library_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/lib/intel64_win']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
mkl_info:
    include_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/include']
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_rt']
    library_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/lib/intel64_win']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
blas_mkl_info:
    include_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/include']
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_rt']
    library_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/lib/intel64_win']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
blas_opt_info:
    include_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/include']
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_rt']
    library_dirs = ['C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows/mkl/lib/intel64_win']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
>>> import numpy as np
>>> A = np.arange(2*3).reshape(2,3).astype(np.float32)
>>> B = np.arange(2*3*2731).reshape(2,3,2731).astype(np.int16)
>>> np.dot(A, B)
array([[[  13655.,   13658.,   13661., ...,   21839.,   21842.,   21845.],
        [  38234.,   38237.,   38240., ...,   46418.,   46421.,   46424.]],

       [[  38234.,   38246.,   38258., ...,   70970.,   70982.,   70994.],
        [ 136550.,  136562.,  136574., ...,  169286.,  169298.,  169310.]]], dtype=float32)

λ‘˜ λ‹€ λ‚˜μ—κ²Œ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

λ‚˜λŠ” 였λ₯˜ μΆ”μΈ‘ Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll 잘λͺ»λœ λ•Œλ¬Έμ— μ„€λͺ… 될 수이 버전이 mkl_intel_thread.dll μ—μ„œ 발견 somwhere을 PATH . numpy + MKLμ—μ„œ μˆ˜ν–‰ ν•œ κ²ƒμ²˜λŸΌ PATH λ₯Ό ν™•μž₯ν•˜μ—¬ MKL DLL을 μ°ΎλŠ” 것은 μ‹œμŠ€ν…œμ— λ‹€λ₯Έ MKL λŸ°νƒ€μž„μ΄ μ„€μΉ˜λ˜μ–΄μžˆλŠ” 경우 μ·¨μ•½ν•©λ‹ˆλ‹€.

C : \ Windows * 디렉토리에 libiomp5md.dll λ˜λŠ” mkl_*.dll 파일이 μžˆμŠ΅λ‹ˆκΉŒ?

@cgohlke , numpy + MKLμ—μ„œ numpy.core 을 PATH 에 μΆ”κ°€ν•˜κΈ° μœ„ν•΄ _init_numpy_mkl() λ₯Ό λ„μž…ν–ˆμŠ΅λ‹ˆλ‹€.

DLL 검색 μˆœμ„œλ₯Ό λ³€κ²½ν•˜κΈ° μœ„ν•΄ https://gist.github.com/matham/f6a07f8fb5e403feb440 의 λ‹€μŒ μ ‘κ·Ό 방식을 κ³ λ € ν–ˆμŠ΅λ‹ˆκΉŒ?

λ˜ν•œλ³΄μ‹­μ‹œμ˜€:
https://pytools.codeplex.com/workitem/1627 (좜처)
https://github.com/numpy/numpy/wiki/windows-dll-notes#python -dlls
http://stackoverflow.com/questions/23804438/find-library-in-ctypes

@cgohlke λ‹€μŒμ€ λ‚΄ Windows λ””λ ‰ν„°λ¦¬μ—μžˆλŠ” DLLμž…λ‹ˆλ‹€.

['System32\\libiomp5md.dll',
 'System32\\mkl_core.dll',
 'System32\\mkl_def.dll',
 'System32\\mkl_intel_thread.dll',
 'SysWOW64\\libiomp5md.dll',
 'SysWOW64\\mkl_core.dll',
 'SysWOW64\\mkl_intel_thread.dll',
 'SysWOW64\\mkl_p4.dll',
 'SysWOW64\\mkl_p4m.dll',
 'SysWOW64\\mkl_p4m3.dll',
 'SysWOW64\\mkl_p4p.dll']

νŒŒμ΄μ¬μ„ ν˜ΈμΆœν•˜κΈ° 전에 SET PATH=; λ‚΄ PATHλ₯Ό μž¬μ„€μ •ν•˜λ €κ³ ν•˜λ©΄ μ—¬μ „νžˆ 좩돌이 λ°œμƒν•˜μ§€λ§Œ Windows λ””λ ‰ν† λ¦¬μ—μ„œ μœ„μ˜ DLL을 μ™„μ „νžˆ μ œκ±°ν•˜λ©΄ 좩돌이 μ€‘μ§€λ©λ‹ˆλ‹€. 경둜 μš°μ„  μˆœμœ„ 문제 @carlkl처럼 λ³΄μž…λ‹ˆλ‹€.

@cgohlke , numpy + MKL의 __init__.py 둜 ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•΄ λ‹€μŒ 변경을 μ œμ•ˆν•©λ‹ˆλ‹€.

def _init_numpy_mkl():
    # Numpy+MKL on Windows only
    import os
    import ctypes
    if os.name != 'nt':
        return
    # disable Intel Fortran default console event handler
    env = 'FOR_DISABLE_CONSOLE_CTRL_HANDLER'
    if env not in os.environ:
        os.environ[env] = '1'
    # extend DLL search order with numpy.core
    # See https://github.com/numpy/numpy/wiki/windows-dll-notes#python-dlls
    # and https://pytools.codeplex.com/workitem/1627
    try:
        _AddDllDirectory = ctypes.windll.kernel32.AddDllDirectory
        _AddDllDirectory.argtypes = [ctypes.c_wchar_p]
        # Needed to initialize AddDllDirectory modifications
        ctypes.windll.kernel32.SetDefaultDllDirectories(0x1000)
    except AttributeError:
        _AddDllDirectory = ctypes.windll.kernel32.SetDllDirectoryW
        _AddDllDirectory.argtypes = [ctypes.c_wchar_p]
    try:
        _core = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'core')
        _AddDllDirectory(_core)
    except Exception:
        pass

_init_numpy_mkl()
del _init_numpy_mkl

Windows λ””λ ‰ν† λ¦¬μ—μ„œ μœ„μ˜ DLL을 μ™„μ „νžˆ μ œκ±°ν•˜λ©΄ 좩돌이 μ€‘μ§€λ©λ‹ˆλ‹€.

쒋은 라이딩.

numpy + MKL의 __init__.py 둜 ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•΄ λ‹€μŒ 변경을 μ œμ•ˆν•©λ‹ˆλ‹€.

이것은 κ΅¬ν˜• μ‹œμŠ€ν…œμ—μ„œ μ‹€μ œλ‘œ μž‘λ™ν•˜μ§€ μ•ŠμœΌλ©° 더 μ€‘μš”ν•œ 것은 μ‹œμŠ€ν…œμ˜ DLL 검색 μˆœμ„œ 에 μ˜μ‘΄ν•˜λŠ” νŒ¨ν‚€μ§€λ₯Ό κΉ¨λœ¨λ¦½λ‹ˆλ‹€. Anaconda λ˜λŠ” WinPythonκ³Ό 같은 λ°°ν¬νŒμ— ν—ˆμš© 될 수 μžˆμŠ΅λ‹ˆλ‹€.

numpy wikiμ—μ„œ λΆ€λΆ„μ μœΌλ‘œ @carlkl 으둜 인정 된 AddDllDirectory λ©”μ„œλ“œλ₯Ό 처음 발견 ν•œ 것이 재미 μžˆμ—ˆμ§€λ§Œ , μ—¬κΈ°μ—μ„œ @carlkl 이 예제둜 μ‚¬μš©μ„ μ œμ•ˆ AddDllDirectory 검색 ν•  λ•Œ ν•΄λ‹Ή 예제 μ½”λ“œμ˜ λ¬Έμ œμ— λŒ€ν•œ μ„€λͺ…μž…λ‹ˆλ‹€. ν’€ μ„œν΄ ...

μ–΄μ¨Œλ“ , λ‚˜λŠ” 이것을 μ‚¬μš©ν•˜λŠ” 것을 κ³ λ €ν•˜λŠ” λ‹€λ₯Έ μ‚¬λžŒλ“€μ„ μœ„ν•΄ 일뢀 dllμ„λ‘œλ“œ ν•  λ•Œ ctypes.windll.kernel32.SetDefaultDllDirectories(0x1000) (및 0이 μ•„λ‹Œ λ‹€λ₯Έ ν”Œλž˜κ·Έ)이 ImportError: DLL load failed: The parameter is incorrect μ˜ˆμ™Έλ₯Ό λ°œμƒ μ‹œν‚¨λ‹€λŠ” 점에 μ£Όλͺ©ν•˜κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€. λ‚˜μ—κ²Œ 그것은 mingw-w64둜 λ°λΉ„μ•ˆμ—μ„œ 크둜슀 컴파일 된 ffmpeg dll에 μ—°κ²°λœ mingw-w64 (mingwpy) λΉŒλ“œ ν™•μž₯μ—μ„œλ§Œ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 그게 μ±…μž„μ΄ μžˆλŠ”μ§€λŠ” λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜, νŒŒμ΄μ¬μ€ ν˜ΈμΆœν•˜κΈ° λ•Œλ¬Έμ— LoadLibraryEx λ§Œμ— LOAD_WITH_ALTERED_SEARCH_PATH ν•˜μ§€μ™€ LOAD_LIBRARY_SEARCH_USER_DIRS ν•˜μ§€ μ•ŠλŠ” ν•œ, SetDefaultDllDirectories 도 뢈렀 LOAD_LIBRARY_SEARCH_USER_DIRS , LoadLibraryEx λŠ” AddDllDirectory μΆ”κ°€ 된 디렉토리λ₯Ό κ²€μƒ‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜μ—κ²Œ 이것은 μ‚¬μš©ν•˜κΈ°κ°€ μ•½κ°„ 깨지기 μ‰¬μš΄ κ²ƒμ²˜λŸΌ λ³΄μ΄λ―€λ‘œ os.environ κ²½λ‘œμ— dll 디렉토리λ₯Ό μΆ”κ°€ν•˜λŠ” κ²ƒμœΌλ‘œ λ‹€μ‹œ μ „ν™˜ ν•  것이라고 μƒκ°ν•©λ‹ˆλ‹€. κ·Έλž˜λ„μ΄ μ •λ³΄λ‘œ μœ„ν‚€λ₯Ό μ—…λ°μ΄νŠΈν•΄μ•Όν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

μ–΄μ¨Œλ“  이것은 λ„ˆλ¬΄ 멀지 μ•Šμ€ μ£Όμ œκ°€ μ•„λ‹ˆκΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

@matham ,이 μ½”λ“œ 슀 λ‹ˆνŽ«μ€ _zooba_에 μ λ¦½λ˜μ–΄μ•Όν•©λ‹ˆλ‹€-https://pytools.codeplex.com/workitem/1627 μ°Έμ‘°. ctypes.windll.kernel32.SetDefaultDllDirectories(0x1000) 행은 LoadLibraryEx 둜 LOAD_WITH_ALTERED_SEARCH_PATH LoadLibraryEx 의 λ™μž‘μ„ λ³€κ²½ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. random \ mtrand.pydκ°€λ‘œλ“œ 된 직후 MKL_INTEL_THREAD.DLL λ‘œλ“œμ— μ‚¬μš© 된 LoadLibraryA (_without_ LOAD_WITH_ALTERED_SEARCH_PATH )의 λ™μž‘μ„ _ 희망적으둜 _ λ³€κ²½ν•˜κ³  MKL_RT.DLL λ‹€μŒ MKL_INTEL_THREAD.DLL 호좜 :

python -c "import numpy" λ™μ•ˆ depency walkerμ—μ„œ 둜그인

...
LoadLibraryExW("d:\devel\py\python-3.5.0.amd64\lib\site-packages\numpy\random\mtrand.cp35-win_amd64.pyd", 0x0000000000000000, LOAD_WITH_ALTERED_SEARCH_PATH) called from "d:\devel\py\python-3.5.0.amd64\PYTHON35.DLL" at address 0x00000000587E7747.
Loaded "d:\devel\py\python-3.5.0.amd64\lib\site-packages\numpy\random\MTRAND.CP35-WIN_AMD64.PYD" at address 0x000007FEF3310000.  Successfully hooked module.
DllMain(0x000007FEF3310000, DLL_PROCESS_ATTACH, 0x0000000000000000) in "d:\devel\py\python-3.5.0.amd64\lib\site-packages\numpy\random\MTRAND.CP35-WIN_AMD64.PYD" called.
DllMain(0x000007FEF3310000, DLL_PROCESS_ATTACH, 0x0000000000000000) in "d:\devel\py\python-3.5.0.amd64\lib\site-packages\numpy\random\MTRAND.CP35-WIN_AMD64.PYD" returned 1 (0x1).
LoadLibraryExW("d:\devel\py\python-3.5.0.amd64\lib\site-packages\numpy\random\mtrand.cp35-win_amd64.pyd", 0x0000000000000000, LOAD_WITH_ALTERED_SEARCH_PATH) returned 0x000007FEF3310000.
LoadLibraryA("d:\devel\py\python-3.5.0.amd64\lib\site-packages\numpy\core\mkl_intel_thread.dll") called from "d:\devel\py\python-3.5.0.amd64\lib\site-packages\numpy\core\MKL_RT.DLL" at address 0x000007FEE17C4772.
Loaded "d:\devel\py\python-3.5.0.amd64\lib\site-packages\numpy\core\MKL_INTEL_THREAD.DLL" at address 0x000007FEE0520000.  Successfully hooked module.
Loaded "d:\devel\py\python-3.5.0.amd64\lib\site-packages\numpy\core\MKL_CORE.DLL" at address 0x000007FEDEEC0000.  Successfully hooked module.
Loaded "d:\devel\py\python-3.5.0.amd64\lib\site-packages\numpy\core\LIBIOMP5MD.DLL" at address 0x000007FEE43E0000.  Successfully hooked module.
...

@carlkl μ‚¬μ‹€μ΄μ§€λ§Œ μœ„ν‚€λ₯Ό μ–ΈκΈ‰ν–ˆμŠ΅λ‹ˆλ‹€ : (thanks to Steve Dower for the fragment, Carl Kleffner for finding it) , λ‚΄κ°€ 당신이라고 μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€ :)

λ‚΄κ°€ μ–ΈκΈ‰ ν•œ 취약성은 일반적으둜 ν•΄λ‹Ή ν”Œλž˜κ·Έλ₯Ό μ„€μ •ν•˜λŠ” SetDefaultDllDirectories 호좜과 λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ‹€μ œλ‘œλ‘œλ“œ 될 λ•Œ μ‹€ν–‰λ˜λŠ” λ‹€λ₯Έ μ½”λ“œκ°€μžˆμ„ 수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ μžμ‹ μ΄ SetDefaultDllDirectories ν˜ΈμΆœν•˜λŠ” 것을 κ°€μ Έ μ˜€λŠ” 경우 μ•„λ§ˆλ„ κ°’ (예 : 0)을 μ‚¬μš©ν•˜μ—¬ κ°€μ Έμ˜¬ λ•Œ λ‚˜μ€‘μ— dll을 찾지 λͺ»ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ¦‰μ‹œ κ°€μ Έ 였면 μ—¬κΈ°μ—μ„œ λ¬Έμ œκ°€λ˜μ§€ μ•Šμ„ 것 κ°™μ§€λ§Œ.

@cgohlke , numpy.core λ‚΄μ—μ„œ _init_numpy_mkl() numpy.core λŒ€ν•œ λͺ…μ‹œ 적 경둜 이름과 ν•¨κ»˜ MKL_RT.DLL , MKL_INTEL_THREAD.DLL 및 MKL_CORE.DLL 을 (λ₯Ό) λ―Έλ¦¬λ‘œλ“œν•˜λŠ” 데 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆκΉŒ? λ‹€λ₯Έ ν•„μš”ν•œ MKL DLL의 μ μ§„μ μœΌλ‘œλ‘œλ“œκ°€ μž‘λ™ν•˜λŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

@cgohlke ,

λ‹€μŒ 슀 λ‹ˆνŽ«μ€ MKL DLL이 Windows μ‹œμŠ€ν…œμ΄λ‚˜ Intel redist 폴더가 μ•„λ‹Œ numpy.coreμ—μ„œλ‘œλ“œλ˜λ„λ‘ν•©λ‹ˆλ‹€ (?). DLLμ„λ‘œλ“œν•˜λŠ” μˆœμ„œκ°€ μ€‘μš”ν•©λ‹ˆλ‹€. 적어도 Windows 7 python-3.4 λΉ„νŠΈμ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€.

def _init_numpy_mkl():
    # Numpy+MKL on Windows only
    import os
    import ctypes
    if os.name != 'nt':
        return
    # disable Intel Fortran default console event handler
    env = 'FOR_DISABLE_CONSOLE_CTRL_HANDLER'
    if env not in os.environ:
        os.environ[env] = '1'
    # preload MKL DLLs from numpy.core
    try:
        _core = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'core')
        for _dll in ('mkl_rt', 'libiomp5md', 'mkl_core', 'mkl_intel_thread', 
                     'libmmd', 'libifcoremd', 'libimalloc'):
            ctypes.cdll.LoadLibrary(os.path.join(_core,_dll))
    except Exception:
        pass

_init_numpy_mkl()
del _init_numpy_mkl

λ‚˜λŠ” 같은 λ¬Έμ œκ°€ μžˆμ—ˆκ³  danielgeier에 μ˜ν•΄ C:\Windows\System32 mkl_intel_thread.dll λ₯Ό μ„€μΉ˜ ν•œ κ²ƒμœΌλ‘œ λ‹€μ‹œ μΆ”μ ν–ˆμŠ΅λ‹ˆλ‹€.
이전 λ²„μ „μ—λŠ” 무엇보닀도 mkl_aa_fw_get_max_memory κ°€ μ—†μ—ˆμŠ΅λ‹ˆλ‹€.
생성 μ‹œκ°„μ€ Asio4all μ˜€λ””μ˜€ λ“œλΌμ΄λ²„ μ„€μΉ˜μ™€ μΌμΉ˜ν–ˆμŠ΅λ‹ˆλ‹€. λͺ‡ 개의 dll을 μ œκ±°ν•œ 후에 λ‹€μ‹œ μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€ (system32μ—μ„œ dll을 직접 μ‚­μ œν•˜λŠ” 것보닀 λ‚«μŠ΅λ‹ˆλ‹€).
λ‚˜λŠ” λ‘€λ°±ν•˜κ³  μ•„λ‚˜μ½˜λ‹€ λ°°ν¬νŒμ„ μ—…λ°μ΄νŠΈν•˜λ©΄μ„œ λ†€μ•˜μ§€λ§Œ μž‘λ™ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. λ˜ν•œ Windowsμ—μ„œ μ•„λ‚˜μ½˜λ‹€λ‘œ mkl을 λΉ„ν™œμ„±ν™” ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

@ sebastian-schmidt, Windows μ‹œμŠ€ν…œ 폴더에 였래된 MKL DLL이 μ„€μΉ˜λ˜μ–΄ μžˆμ–΄λ„ numpy / core ν΄λ”μ—μ„œ λͺ…μ‹œ 적으둜 MKL DLLμ„λ‘œλ“œν•˜λŠ” 것이 μž‘λ™ν•œλ‹€λ©΄ μ‚¬μš©ν•΄ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μœ„ μ°Έμ‘° : https://github.com/numpy/numpy/issues/6923#issuecomment -169073613

@carlkl , 슀 λ‹ˆνŽ«μ„ 어디에 μΆ”κ°€ν•΄μ•Όν•©λ‹ˆκΉŒ?
ν…ŒμŠ€νŠΈλ‘œ μ‚¬μš©ν•œ 파일 ( https://gist.github.com/sebastian-schmidt/9bb97354b481750209fd3dac1e748d31)에 μΆ”κ°€ν•˜λ €κ³ ν–ˆμ§€λ§Œ μž‘λ™ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
κ²°ν•© 된 κ²½λ‘œλŠ” νŒŒμΌμ„ ν˜ΈμΆœν•˜λŠ” ν•˜μœ„ λ””λ ‰ν† λ¦¬μž…λ‹ˆλ‹€.
Numpy λͺ¨λ“ˆμ˜ init에 μΆ”κ°€ν•΄μ•Όν•©λ‹ˆκΉŒ?

_init_numpy_mkl() ν•¨μˆ˜λŠ” @cgohlke numpy + mkl λ°”ν€΄μ˜ μΌλΆ€μž…λ‹ˆλ‹€. __init__.py νŒŒμΌμ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€. 곡식 numpy μ†ŒμŠ€μ˜ 일뢀가 μ•„λ‹™λ‹ˆλ‹€.

λ‹€μŒμ€ numpy-1.10.4+mkl-cp34-none-win32.whl μ—μžˆλŠ” λ²„μ „μž…λ‹ˆλ‹€.

def _init_numpy_mkl():
    # Numpy+MKL on Windows only
    import os
    if os.name != 'nt':
        return
    # disable Intel Fortran default console event handler
    env = 'FOR_DISABLE_CONSOLE_CTRL_HANDLER'
    if env not in os.environ:
        os.environ[env] = '1'
    # prepend the path of the Intel runtime DLLs to os.environ['PATH']
    try:
        path = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'core')
        if path not in os.environ.get('PATH', ''):
            os.environ['PATH'] = os.pathsep.join((path, os.environ.get('PATH', '')))
    except Exception:
        pass

_init_numpy_mkl()
del _init_numpy_mkl

이 ν•¨μˆ˜λŠ” numpy/core 폴더λ₯Ό PATH ν™˜κ²½μ— μΆ”κ°€ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ Windows μ‹œμŠ€ν…œ ν΄λ”μ—μžˆλŠ” DLL은 PATHμ—μžˆλŠ” DLL보닀 μš°μ„ ν•©λ‹ˆλ‹€. DLL 지μ˜₯에 μ˜€μ‹  것을 ν™˜μ˜ν•©λ‹ˆλ‹€.

이 ν•¨μˆ˜μ˜ λŒ€μ²΄ 버전 https://github.com/numpy/numpy/issues/6923#issuecomment -169073613은 PATH ν™˜κ²½μ„ λ³€κ²½ν•˜μ§€ μ•Šκ³  μ˜¬λ°”λ₯Έ μˆœμ„œλ‘œ numpy/core μ—μ„œ MKL DLLμ„λ‘œλ“œν•©λ‹ˆλ‹€. λͺ¨λ“  DLL 이름은 μ •κ·œν™” 된 경둜 이름을 가진 λͺ…μ‹œ 적 파일 μ΄λ¦„μœΌλ‘œ μ œκ³΅λ˜λ―€λ‘œ Windows μ‹œμŠ€ν…œ ν΄λ”μ˜ DLL 섀도 μž‰ λ¬Έμ œλŠ” μ˜ˆμƒν•˜μ§€ μ•Šμ§€λ§Œ ν…ŒμŠ€νŠΈν•˜μ§€λŠ” μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜μ΄ μ½”λ“œ 슀 λ‹ˆνŽ«μ—μ„œ κ³ μ • 된 numpyλŠ” μ‹ κ²½ 쓰지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

Anaconda 배포판의 _init_numpy_mkl() 을 (λ₯Ό) κ·€ν•˜μ˜ λ²„μ „μœΌλ‘œ λ³€κ²½ ν•œ λ‹€μŒ μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€ ( windows/system32 μ—μ„œ ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” dll μ‚¬μš©).

λ“£κΈ° 쒋은!

_init_numpy_mkl의 μ½”λ“œλŠ” () @cgohlke의 NumPy와 뢄포 및 그의 responibility μ•„λž˜ 뢀뢄이닀.
@cgohlke : https://github.com/numpy/numpy/issues/6923#issuecomment -169073613에 λŒ€ν•œ 의견이 μžˆμŠ΅λ‹ˆκΉŒ?

@ sebastian-schmidt, AddDllDirectory (λ˜λŠ” λŒ€μ²΄λ‘œ SetDllDirectoryW)λ₯Ό μ‚¬μš©ν•˜μ—¬ 버전을 ν…ŒμŠ€νŠΈ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? μœ„ μ°Έμ‘° : https://github.com/numpy/numpy/issues/6923#issuecomment -168490201

@carlkl , AddDllDirectory / SetDllDirectoryW 버전도 μž‘λ™ν•©λ‹ˆλ‹€.
ν…ŒμŠ€νŠΈλŠ” 항상 danielgeier의 np.dot() μ˜ˆμ œμ˜€μŠ΅λ‹ˆλ‹€.
참고둜 mkl 라이브러리λ₯Ό μ„€μΉ˜ν•˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄λŠ” Asio4all λ“œλΌμ΄λ²„κ°€ μ•„λ‹ˆλΌ Amplitubeμ˜€μŠ΅λ‹ˆλ‹€.

λ‚˜λ„ Amplitube둜 문제λ₯Ό μΆ”μ ν–ˆμŠ΅λ‹ˆλ‹€.

λ‚΄κ°€ μ‹œλ„ν–ˆμ„ λ•Œ : import matplotlib.pyplot as plt 두 init 버전 λͺ¨λ‘μ—μ„œ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

---> 60 import matplotlib._png as _png
     61 ####################
     62 

ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.

κ·Έλž˜μ„œ Anaconda μ›λž˜ λ²„μ „μœΌλ‘œ λ‹€μ‹œ μ „ν™˜ν•˜κ³  Amplitubeλ₯Ό μ œκ±°ν–ˆμŠ΅λ‹ˆλ‹€.

@ sebastian-schmidt, 적어도 λ‚˜λ₯Ό μœ„ν•΄ μž‘λ™ν•©λ‹ˆλ‹€. numpy, scipy, matplotlib._png κ°€μ Έ μ˜€κΈ°λŠ” λ‚΄ μƒμžμ—μ„œ λ¬Έμ œμ—†μ΄ μž‘λ™ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ Windows μ‹œμŠ€ν…œ ν΄λ”μ—μ„œ MKL DLL을 μ œκ±°ν•˜λŠ” 것이 μ΄λŸ¬ν•œ μ’…λ₯˜μ˜ λ¬Έμ œμ— λŒ€ν•œ μ΅œμƒμ˜ μ†”λ£¨μ…˜μœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.

이 문제λ₯Ό μ’…κ²° ν•  μ‹œκ°„μž…λ‹ˆκΉŒ?

μ•ˆλ…•ν•˜μ„Έμš”. λˆ„κ΅°κ°€κ°€ μ—¬μ „νžˆμ΄ 문제λ₯Ό κ°€μ§€κ³ μžˆλŠ” 경우λ₯Ό λŒ€λΉ„ν•˜μ—¬. λ‚˜λŠ” numpy 1.12 + mkl을 가지고 있으며 λ™μΌν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. Amplitube 3을 μ œκ±°ν–ˆκ³  이제 λͺ¨λ“  것이 μž‘λ™ν•©λ‹ˆλ‹€!

μ•ˆλ…•ν•˜μ„Έμš” μ—¬λŸ¬λΆ„,

λ‚œ κ·Έλƒ₯μ—μ„œ μ΅œμ‹  NumPy와 + MKL 1.13 νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ μ—¬κΈ° @cgohlke에 μ˜ν•΄.

Windows 7μ—μ„œ Anaconda w / Python 3.6.1 64 λΉ„νŠΈλ₯Ό μ‹€ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

κ·Έ 후이 DLL λ¬Έμ œλ„ λ°œμƒν•˜κ³  이전에 λ™μΌν•œ μ‚¬μ΄νŠΈμ˜ v1.12μ—μ„œ μ œλŒ€λ‘œ μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€.

μΆ”κ°€ν•˜λ €λ©΄ μ‹€μ œλ‘œ λͺ¨λ“  μ½”λ“œκ°€ Jupyter λ…ΈνŠΈλΆμ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€ .... 이것은 μ½˜μ†”μ—μ„œλ§Œ λ°œμƒν•©λ‹ˆλ‹€.

@carlkl Anaconda ν΄λ”μ—μ„œ _init_numpy_mkl ν–ˆμ§€λ§Œμ΄ λ¬Έμžμ—΄μ΄ 포함 된 νŒŒμΌμ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€. numpy/core λ₯Ό λ‚΄ PATH ν™˜κ²½ λ³€μˆ˜μ— μˆ˜λ™μœΌλ‘œ 좔가해도 μž‘λ™ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

λ‹€λ₯Έ μ œμ•ˆμ΄ μžˆμŠ΅λ‹ˆκΉŒ?

감사.

λ‚΄κ°€ skimageλ₯Ό κ°€μ Έμ˜¬ λ•Œ "mkl_intel_thread.dllμ„λ‘œλ“œ ν•  수 μ—†μŠ΅λ‹ˆλ‹€"λΌλŠ” λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.
windows / system32μ—μ„œ mkl_intel_thread.dll을 찾을 수 μ—†μœΌλ―€λ‘œ @cgohlkeκ°€ μ–ΈκΈ‰ ν•œλŒ€λ‘œ ν•΄λ‹Ή ν΄λ”μ—μ„œ libiomp5md.dll을 μ‚­μ œν–ˆμŠ΅λ‹ˆλ‹€. μž‘λ™ν•©λ‹ˆλ‹€! 정말 κ°μ‚¬ν•©λ‹ˆλ‹€! λ¬Έμ œλŠ” λͺ‡ μ£Ό λ™μ•ˆ λ‚˜λ₯Ό κ΄΄λ‘­ ν˜”μŠ΅λ‹ˆλ‹€. μ–΄μ¨Œλ“  λ‹€λ₯Έ μ‚¬λžŒλ“€ 이이 문제λ₯Ό λ§Œλ‚¬ 으면 도움을받을 수 있기λ₯Ό λ°”λžλ‹ˆλ‹€. libiomp5md.dll을 μ°ΎμœΌμ‹­μ‹œμ˜€. 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

https://github.com/numpy/numpy/issues/6923#issuecomment -169073613이 Windows / system32μ—μ„œ MKL DLL을 제거 ν•  ν•„μš”μ—†μ΄μ΄ 경우 μž‘λ™ν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€. 이 슀 λ‹ˆνŽ«μ€ μΆ”κ°€ 라이브러리λ₯Ό PATH ν™˜κ²½ λ³€μˆ˜μ— μ „λ‹¬ν•˜κ±°λ‚˜ λ‹€λ₯Έ νŠΈλ¦­μ„ μ‚¬μš©ν•  ν•„μš”μ—†μ΄ numpy / core 폴더에 7 개 (μ „λΆ€λŠ” μ•„λ‹˜) MKL DLLμ„λ‘œλ“œ ν•  수 μžˆμŒμ„ λ³΄μ—¬μ€λ‹ˆλ‹€. 이 7 개의 DLL을 μ˜¬λ°”λ₯Έ μˆœμ„œλ‘œλ‘œλ“œν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. λ‹€λ₯Έ λͺ¨λ“  ν•„μˆ˜ MKL DLL은 windows / system32 폴더 λŒ€μ‹  numpy / coreμ—μ„œ μžλ™μœΌλ‘œλ‘œλ“œλ©λ‹ˆλ‹€.

이것이 생각할 μˆ˜μžˆλŠ” λͺ¨λ“  μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ μž‘λ™ν•˜λŠ”μ§€λŠ” 아직 ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, κ³ μ • 된 파이썬 μ• ν”Œλ¦¬μΌ€μ΄μ…˜. λ˜ν•œ Windows OS 버전은 DLLμ˜λ‘œλ“œ λ™μž‘μ΄ λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

이 변쒅을 μΆ”κ°€λ‘œ μ‘°μ‚¬ν•˜λŠ” 것이 μœ λ¦¬ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€.

μš°λ¦¬λŠ” SetDefaultDllDirectories μ•žλ’€λ‘œ κ°”κ³  # 10229κ°€ μΆ”κ°€ ν•œ λ‹€μŒ # 11493이 μ œκ±°ν–ˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” μš°λ¦¬κ°€ μ΄κ²ƒμœΌλ‘œ 갈 μˆ˜μžˆλŠ” ν•œ 멀리 κ°”λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. κ°€μž₯ 쒋은 방법은 PATHμ—μ„œ mkl의 λ‹€λ₯Έ 볡사본을 μ œκ±°ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ™μ˜ν•˜μ§€ μ•ŠμœΌλ©΄ λ‹€μ‹œμ—¬μ‹­μ‹œμ˜€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰