无论使用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
嗯,不知道这是怎么回事。 英特尔对该版本进行了一些更改,但我认为这些都不涉及。 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.dll
或mkl_*.dll
文件?
@cgohlke在numpy + MKL中,您引入了_init_numpy_mkl()
来将numpy.core
到PATH
。
您是否考虑过以下来自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)
不会更改LoadLibraryEx
和LOAD_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.DLL
, MKL_INTEL_THREAD.DLL
和MKL_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的其他副本。
如果您不同意,请重新打开。
最有用的评论
@cgohlke这些是在我的Windows目录中找到的DLL:
尝试在调用python之前使用
SET PATH=;
重置我的PATH仍然会崩溃,但是完全从Windows目录中删除上述DLL可以停止崩溃。 似乎是路径优先级问题@carlkl。