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']

尝试在调用python之前使用SET PATH=;重置我的PATH仍然会崩溃,但是完全从Windows目录中删除上述DLL可以停止崩溃。 似乎是路径优先级问题@carlkl。

所有30条评论

嗯,不知道这是怎么回事。 英特尔对该版本进行了一些更改,但我认为这些都不涉及。 Python 3.5可能是罪魁祸首,因为它是在Windows上使用较新的VS进行编译的。 @cgohlke的想法?

我认为您最好的选择是提供一个复制器(产生此功能的“某些功能”是什么?),或者希望@cgohlke弹出答案,或者向Anaconda提交错误(因为它们有资源来支持)他们的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)

我在笔记本电脑上使用最新的@cgohlke numpy(1.10.2)python-3.4(64bit)和python-3.5(64bit)进行了快速检查:

>>> 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可以解释,因为在PATH某处发现了错误的mkl_intel_thread.dll版本。 如果在系统上安装了另一个MKL运行时,则通过扩展numpy + MKL中的PATH来查找MKL DLL是脆弱的。

C:\ Windows *目录中是否有任何libiomp5md.dllmkl_*.dll文件?

@cgohlke在numpy + MKL中,您引入了_init_numpy_mkl()来将numpy.corePATH

您是否考虑过以下来自https://gist.github.com/matham/f6a07f8fb5e403feb440的方法来更改DLL搜索顺序?

也可以看看:
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']

尝试在调用python之前使用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中找到了AddDllDirectory方法,该方法部分归功于@carlkl ,但是后来我的用法由@carlkl在这里提出作为示例,而我最终在这里是因为在numpy中搜索AddDllDirectory时,该示例代码存在问题。 整圈...

无论如何,我确实想为考虑使用此功能的其他人指出,在加载某些dll时, ctypes.windll.kernel32.SetDefaultDllDirectories(0x1000) (以及任何其他非零标志)会导致ImportError: DLL load failed: The parameter is incorrect异常。 对我来说,它只发生在mingw-w64(mingwpy)构建的扩展中,该扩展链接到ffmpeg dll,这些dll在mingw-w64上在debian上交叉编译。 但是我不知道这是否负责。

但是,由于python仅使用LOAD_WITH_ALTERED_SEARCH_PATH而不是LOAD_LIBRARY_SEARCH_USER_DIRS调用LoadLibraryEx ,除非SetDefaultDllDirectories也被LOAD_LIBRARY_SEARCH_USER_DIRS调用,否则LoadLibraryEx不会搜索添加了AddDllDirectory 。 对我来说,使用起来似乎有些脆弱,所以我想我将切换回使用os.environ将dll目录添加到路径中。 我确实想知道是否应该用此信息更新Wiki吗?

无论如何,希望这不是太遥远的话题。

@matham ,此代码段应记入_zooba_-请参见https://pytools.codeplex.com/workitem/1627。 ctypes.windll.kernel32.SetDefaultDllDirectories(0x1000)不会更改LoadLibraryExLOAD_WITH_ALTERED_SEARCH_PATH 。 它确实_hopefully_改变的行为LoadLibraryA (_without_ LOAD_WITH_ALTERED_SEARCH_PATH ),它用来装载MKL_INTEL_THREAD.DLL后右随机\ mtrand.pyd被加载和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是真的,但是我指的是Wiki: (thanks to Steve Dower for the fragment, Carl Kleffner for finding it) ,我以为是你:)

我所指的脆弱性是,通常在设置该标志的SetDefaultDllDirectories调用与实际加载库之间可能会执行一些其他代码。 例如,如果您导入的东西本身调用SetDefaultDllDirectories可能带有一个值(例如0),这可能会导致以后导入时找不到dll。 尽管我想如果立即将其导入此处可能不是问题。

@cgohlke ,在_init_numpy_mkl()内预加载MKL_RT.DLLMKL_INTEL_THREAD.DLLMKL_CORE.DLL具有显式路径名)到numpy.core _init_numpy_mkl()是否有问题? 我不确定是否可以逐步加载其他必要的MKL DLL。

@cgohlke

以下代码段确保(?)MKL DLL是从numpy.core加载的,而不是从任何Windows系统或Intel Redist文件夹加载的。 加载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更好)。
我回滚并更新了anaconda发行版,但是没有用。 我也无法在Windows上用anaconda禁用mkl。

@ sebastian-schmidt,如果从numpy / core文件夹中显式加载MKL DLL对您有用,即使Windows系统文件夹中已安装了过期的MKL DLL,也可以尝试一下吗? 参见上文: https :

@carlkl ,我必须在哪里添加代码段?
我尝试将其添加到用作测试的文件中: https :
连接的路径只是我从中调用文件的子目录。
我是否必须将其添加到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从numpy/core加载MKL DLL,且顺序正确,而无需更改PATH环境。 所有DLL名称均以具有完全限定路径名的显式文件名形式给出,因此,我不希望Windows系统文件夹中的DLL阴影问题,但我尚未对此进行测试。

但是,我不关心此代码片段中的冻结的numpy。

我将Anaconda发行版中的_init_numpy_mkl()更改为您的版本,然后工作了(在windows/system32使用不兼容的dll。

很高兴听到!

_init_numpy_mkl()中的代码是@cgohlke的numpy发行版的一部分,由他负责。
@cgohlke :对https://github.com/numpy/numpy/issues/6923#issuecomment -169073613有何评论?

@ sebastian-schmidt,是否可以使用AddDllDirectory(或SetDllDirectoryW作为后备)测试版本:请参见上文: https :

@carlkl ,也可以使用AddDllDirectory / SetDllDirectoryW版本。
测试始终只是danielgeier的np.dot()示例。
附带说明,安装mkl库的软件是Amplitube,而不是Asio4all驱动程序。

我也将问题追溯到Amplitube。

当我尝试使用两个初始化版本的import matplotlib.pyplot as plt时出现错误:

---> 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,现在一切正常!

嗨,大家好,

我刚刚通过@cgohlke这里安装了最新的numpy + mkl 1.13软件包。

我正在Windows 7上运行带Python 3.6.1 64位的Anaconda。

之后,我也遇到了这个DLL问题,以前在同一站点上的v1.12都可以正常工作。

要添加的是,实际上所有代码都可以在Jupyter笔记本中工作。...这仅在控制台中发生。

@carlkl我在Anaconda文件夹中搜索了_init_numpy_mkl但是找不到包含此字符串的文件。 手动将numpy/core附加到我的PATH env变量中也不起作用。

还有其他建议吗?

谢谢。

当我导入skimage时,遇到了“无法加载mkl_intel_thread.dll”的问题。
我在Windows / system32中找不到任何mkl_intel_thread.dll,所以我删除了该文件夹中的libiomp5md.dll ,就像

我想知道在这种情况下https://github.com/numpy/numpy/issues/6923#issuecomment -169073613是否可以正常工作而无需从Windows / system32中删除MKL DLL。 此代码段显示,可以在numpy / core文件夹中加载七个(但不是全部)MKL DLL,而无需将额外的lib传递给PATH环境变量或使用其他技巧。 以正确的顺序加载这7个DLL非常重要。 然后,所有其他必需的MKL DLL将从numpy / core而不是Windows / system32文件夹中自动加载。

尚不清楚这是否适用于所有可能的方案。 例如冻结的python应用程序。 此外,Windows OS版本在DLL的加载行为上可能有所不同。

在我看来,进一步研究该变体是有利的。

我们来回移动SetDefaultDllDirectories ,#10229添加了它,然后#11493删除了它。 我认为我们已经尽了最大努力。 似乎最好的选择是从PATH中删除mkl的其他副本。

如果您不同意,请重新打开。

此页面是否有帮助?
0 / 5 - 0 等级