sklearn OMP:拟合模型时出现错误#15(“初始化libiomp5md.dll,但发现mk2iomp5md.dll已经初始化。”)

55

我最近卸载了一个运行良好的32位Enthought Canopy,并安装了Canopy版本1.1.0(64位)。当我尝试使用sklearn拟合模型时,我的内核崩溃,并出现以下错误:

内核(用户Python环境)已经以错误代码3终止。这可能是由于您的代码或内核本身中的错误导致的。下面显示了从内核进程捕获的输出。OMP:错误#15:正在初始化libiomp5md.dll,但发现mk2iomp5md.dll已经初始化。OMP:提示:这意味着将多个OpenMP运行时链接到程序中。这是危险的,因为它可能会降低性能或导致不正确的结果。最好的方法是确保仅将单个OpenMP运行时链接到进程中,例如通过避免在任何库中静态链接OpenMP运行时。作为不安全的,不受支持的,未记录的解决方法,您可以设置环境变量KMP_DUPLICATE_LIB_OK = TRUE以允许程序继续执行,但这可能会导致崩溃或默默地产生不正确的结果。有关更多信息,请参见http://www.intel.com/software/products/support/。相同的代码在Canopy的32位下运行得非常好。代码实际上只是一个简单的拟合
linear_model.SGDClassifier(loss='log')

(逻辑回归也出现了同样的错误,其他模型尚未尝试)

我该如何解决这个问题?


尝试按照此处建议安装较旧版本的XGBoost: 安装版本0.80 - yzerman
10个回答

52

我曾经遇到过同样的问题,是由于numpy和canopy之间的冲突安装引起的。通过编写以下代码解决了这个问题:

import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

这不是一个优雅的解决方案,但它对我来说完成了工作。


22
错误信息明确指出这是不安全的:最好的方法是确保只有一个OpenMP运行时链接到进程中,例如通过避免在任何库中进行静态链接OpenMP运行时。作为一种不安全、不支持、未记录的解决方法,您可以设置环境变量KMP_DUPLICATE_LIB_OK=TRUE来允许程序继续执行,但这可能会导致崩溃或悄无声息地产生错误结果。 - mbatchkarov
3
有更好的解决方案吗? - Royi
这个解决方案对我也起作用了,不像其他可能出现的解决方案。同时,应该将其链接到这个问题:https://dev59.com/DrTma4cB1Zd3GeqP-7iS#67938059 - Guy Louzon
@Royi 是的!使用 conda install nomkl(见我的回答) - postylem

30
我尝试手动删除旧的 libiomp5md.dll 文件。该文件位于你的 anaconda3/lib 目录下。你应该删除旧的 libiomp5.dll 文件。这样它应该就能工作了。

1
是的,谢谢iAvesh和JW Geertsma!在手动删除libiomp5.dll文件后,它可以正常工作。我还发现其他团队也尝试了这个方法 https://zhuanlan.zhihu.com/p/371649016 - Yeo Keat
4
文件位于您的anaconda3/envs/XXX/Library/bin文件夹中,其中XXX是您的环境名称,如果不在环境中,则为anaconda3/Library/bin - neonguru
1
有什么想法为什么conda会复制该文件? - simplyPTA
2
确认这个方法有效。我将mambaforge/envs/XXX/Library/bin/libiomp5md.dll重命名为防御性预防措施。 - Peter Leopold
这对我来说也适用,在Windows 11 Pro上使用Anaconda。我更喜欢这个解决方案,而不是其他一些解决方案。'os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"'的解决方案似乎存在风险,可能导致错误的结果。而"nomkl"的解决方案对我来说不是一个选择,因为在Windows环境下使用Intel处理器时,性能可能会受到影响。 - undefined

28

通过设置环境参数,您几乎肯定能够解决此错误。

import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

然而,设置此参数并不是推荐的解决方案(正如错误消息中所说)。相反,您可以尝试运行以下命令来设置conda环境,而不使用Intel Math Kernel Library:

conda install nomkl --channel conda-forge

(注意,--channel conda-forge选项告诉conda从conda-forge渠道安装软件包,这通常是个好主意, 在这种情况下可能是必要的)

如果您之前安装的版本基于MKL,则可能需要在执行此操作后重新安装某些软件包(尽管conda应该会自动为您完成)。如果没有,那么您需要执行以下操作:

安装通常包含MKL或依赖于包含MKL的软件包,例如scipynumpypandas。Conda将与它们的依赖项一起安装这些软件包的非MKL版本(请参见此处)。

在 macOS 上,nomkl 是一个不错的选择,因为 MKL 提供的优化实际上已经由苹果的Accelerate Framework提供,后者已经使用了 OpenMP。这实际上就是触发错误(“...多个 OpenMP 运行时副本...”)的原因,正如this answer中所述。

1
目前安装nomkl对我来说有效。不过必须使用forge-install。 - Hans VK
1
谢谢@HansVK,我已经更新了答案来明确这一点(实际上我个人将conda-forge作为默认选择,使用conda config --add channels conda-forge; conda config --set channel_priority strict来实现)。 - postylem
1
非常感谢!我已经苦恼了很久,因为一个不同的重复库问题,每次访问matplotlib时内核几乎都会崩溃(非常不一致,因此很难追踪)。这个解决方法立即修复了这个问题。 - Stefan Todoran

21

我曾经遇到了与easyocr相同的问题,因为它也依赖于mkl

重新安装其他依赖于mkl的模块似乎有效。例如,我执行了pip uninstall numpy,然后执行pip install numpy,这使得导入easyocr工作正常。


1
非常感谢,你救了一个生命。 - Nikunj Gaur

12

OMP:错误#15:正在初始化libiomp5md.dll,但发现已经初始化了libiomp5md.dll。

我在使用Python时遇到了类似的问题,我通过从Anaconda环境文件夹C:\ Users \ aqadir \ Anaconda3 \ envs \ your_env_name \ Library \ bin \ libiomp5md.dll中删除重复的libiomp5md.dll文件来解决它。

在我的情况下,文件libiomp5md.dll已经在基本的Anaconda bin文件夹C:\ Users \ aqadir \ Anaconda3 \ Library \ bin中。


6

我已经阅读了Intel支持研究的文档(http://www.intel.com/software/products/support/),在这种情况下,包括我的原因,是由于numpy库。 我曾经分别安装它以及作为PyTorch安装的一部分。 因此它出现了错误。 基本上你应该创建一个新的环境,并在那里安装所有的依赖项。


3

我以一种不同于这里所有方法的方式解决了这个问题。我的脚本在开头有一个matplotlib.pyplot show。将其移动到训练之后可以消除错误。虽然我不是这些库的专家,但我猜测这个图表被视为OpenMP运行时的副本,因此出现了“多个副本”的错误。


1
这就是IT!使用conda,我们最终会得到两个重复的OpenMP同时运行。在我的情况下,一个被Tensorflow使用,另一个被matplotlib使用。我想知道两个中哪一个使用了本地安装的OpenMP,但无论如何,它们现在都使用相同的版本,这没问题! - Florian Fasmeyer

1

也许这个解决方案对于sklearn也有帮助。当面对与tensorflow相同的15号错误时,截至2021年2月5日,尽管这些解决方案都很有帮助,但并没有完全解决问题。然而,我成功解决了这个问题,同时避免了以下操作:处理dylib库,从源代码安装或设置环境变量KMP_DUPLICATE_LIB_OK=TRUE 以及其“不安全、不受支持、未经记录的绕道方法”和可能出现“崩溃或默默地产生不正确的结果”的弊端。

问题在于,conda无法识别非mkl版本的tensorflow(v2.0.0),尽管加载了nomkl包。最后使得这个解决方案奏效的是:

  • 确保我从defaults渠道加载包(即从非mkl版本的tensorflow渠道中加载。截至2021年2月5日,conda-forge没有tensorflow 2.0或更高版本)。
  • 指定我想要的tensorflow版本的精确构建:tensorflow>=2.*=eigen_py37h153756e_0。如果没有这个,conda将继续加载mkl_...版本的软件包,尽管也加载了nomkl软件包。

我使用以下environment.yml文件创建了一个conda环境(根据conda管理环境的文档):

name: tf_nomkl
channels:
  - conda-forge
  - defaults
dependencies:
  - nomkl
  - python>=3.7
  - numpy
  - scipy
  - pandas
  - jupyter
  - jupyterlab
  - nb_conda
  - nb_conda_kernels
  - ipykernel
  - pathlib
  - matplotlib
  - seaborn
  - tensorflow>=2.*=eigen_py37h153756e_0

你可以尝试不使用 environment.yml 文件来完成相同的操作,但如果可能的话,最好一次性加载所有想要的包到一个环境中。这个解决方案适用于 MacOS Big Sur v11.1。

0

错误:

OMP:错误#15:正在初始化libiomp5md.dll,但已发现已初始化的libiomp5md.dll。

OMP:提示这意味着将多个OpenMP运行时链接到程序中。这很危险,因为它可能会降低性能或导致不正确的结果。最好的方法是确保只有一个OpenMP运行时链接到进程中,例如通过避免在任何库中静态链接OpenMP运行时。作为一种不安全、不受支持、未记录的解决方法,您可以设置环境变量KMP_DUPLICATE_LIB_OK=TRUE以允许程序继续执行,但这可能会导致崩溃或悄悄地产生不正确的结果。有关更多信息,请参见http://www.intel.com/software/products/support/

可以通过运行以下两行来解决此错误

import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'

替代

import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

关于此错误的一个示例,请参见下面的图片

enter image description here


-1
为了解决这个问题并使代码继续运行,我将以下内容添加到Windows环境变量中:
键:KMP_DUPLICATE_LIB_OK 值:TRUE
然后,启动一个新的命令行并再次运行代码,它可以正常工作,没有任何问题。

这个答案及其缺陷已经在现有的答案中提供了。 - kchawla-pi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接