首先附上错误内容,“OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized”。如果各位与笔者一样,学习人工智能还在入门阶段的话,那这个问题可太常见了(●’◡’●)。通常出现在PyTorch安装完毕,迫不及待开始运行自己的第一段PyTorch代码时,OMP: Error #15就会不合时宜的出现,给你浇一盆冷水,这就是人生。好在常见的问题,在社区都有很多解决方案。
一、问题原因
报错中的“OMP”指的是OpenMP,OpenMP是Open Multi-Processing的缩写。它是由OpenMP Architecture Review Board提出的一套用于共享内存并行系统的多处理器程序设计的指导性编译处理方案。PyTorch作为可以并行计算过程的框架,底层有使用OpenMP进行并行计算以提升性能。
这个问题报错的出现,通常意味着你的环境里已经加载了libiomp5md.dll,当PyTorch试图加载自己目录下的另一个 libiomp5md.dll,从而触发冲突。还原一下问题出现的场景。
1.问题出现的场景:Anaconda/Miniconda 环境与 PyTorch/TensorFlow 冲突
在 Python 环境中,numpy、mkl 或 conda 自带的Intel MKL库(通常包含 libiomp5md.dll)与 PyTorch 或 TensorFlow 自带的 OpenMP 库同时存在。
当 NumPy 先加载了 Conda 环境下的 libiomp5md.dll,PyTorch 随后试图加载自己目录下的另一个 libiomp5md.dll,从而触发冲突。
2.为什么会出现多个 libiomp5md.dll库
首先要搞明白libiomp5md.dll是干啥的。libiomp5md.dll这个文件名称的含义,lib = Library(库)、iomp = Intel OpenMP(英特尔的 OpenMP 实现)、5 = 版本号(架构版本)、md = Multithreaded DLL(多线程动态链接库)、.dll = Dynamic Link Library(Windows 动态链接库)。从文件名称中就可以窥探出文件的大概作用:线程池管理、任务调度与负载均衡、线程同步与互斥等。这些功能与多线程任务紧密相关,“多线程”是提高数值计算效率的常见方式。
PyTorch需要加速并行计算,会用到这个库很正常,其他的libiomp5md.dll是在哪里?
在问题出现的场景中提到了MKL库。Intel Math Kernel Library(MKL)是一款由Intel提供的商用数学库,它为科学、工程和金融等领域的高性能应用提供了经过高度优化和线程化处理的数学例程。MKL库需要libiomp5md.dll提供的方法来加速CPU上的数值计算。所以,MKL库一定会依赖libiomp5md.dll。
那么,哪些包需要MKL库?
NumPy库的安装中,用pip install和conda install下载的numpy对libiomp5md.dll这个文件的依赖不同。笔者的conda和pip都换过源,用的是清华源。用conda install numpy下载的numpy,清华源同步的是 Anaconda 官方defaults主频道,该频道的 numpy是基于 Intel MKL 深度构建的,是需要依赖libiomp5md.dll这个文件。而pip install中的清华源同步的是 PyPI 官方仓库,而 PyPI 上的 numpy 官方预编译 wheel 包,从 numpy 1.15 版本之后就不再基于 Intel MKL 构建,默认使用OpenBLAS作为线性代数后端,不依赖libiomp5md.dll这个文件。
在conda的base环境下,运行命令conda list mkl,可以得到下图的结果:

可以看到是存在mkl库的,这个base环境是在安装Anaconda时自动创建的,并没有经过用户。而且,Anaconda的base环境中的numpy,一定是用conda命令下载的,所以base环境下,一定有libiomp5md.dll这个文件。
综上所述,在Anaconda的base环境中的numpy包,一定会在base环境下引入libiomp5md.dll这个文件。在用户自己创建的虚拟环境中,使用PyTorch,一定也会引入新的libiomp5md.dll。既然报错是这两个.dll文件冲突,那么一定是在自己的虚拟环境下调用了base环境下的.dll。
3.为什么libiomp5md.dll的环境隔离被突破
这个笔者还没搞明白,按理来说,运行自己虚拟环境下的PyTorch,一定不会索引到base环境下的依赖。可能是系统环境变量PATH被手动污染、可能是虚拟环境内的 intel-openmp 包被意外破坏或删除、IDE(PyCharm/VS Code)的运行配置错误等。
社区里有提到,在虚拟环境下混用conda install和pip install,会造成一些潜在的风险,可能会导致上述问题。同时,AI给出的最理想的解决方案也是,重新创建一个纯净的环境,并且不要混用conda install和pip install。
不论什么时候,最理想的解决方案通常都不是一个选项,因为做不到。至少在笔者的经验里,不混用conda和pip两种包管理工具,只使用conda一通折腾带来的时间成本是不能接受的。
二、解决方法
上面一通分析上千字,解决方法倒是十分简单直接。以下方法搬运自:彻底解决 Python/PyTorch 中 OMP Error #15 报错:多种方案汇总与深度解析_omp error 15-CSDN博客。只搬运了最常用的两种方法,其他方法笔者没有尝试过。
1.设置环境变量KMP_DUPLICATE_LIB_OK(临时方案)
在要运行的python代码文件的最前面,(必须在导入 torch、numpy 等库之前)加入以下两行代码:
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
# 然后再导入其他库
import torch
import numpy as np
通过设置环境变量告诉Intel OpenMP运行时:“我知道有重复的库,请忽略它,继续运行。”不过,官方文档明确指出,这可能导致性能下降或计算结果不正确(虽然在实际深度学习训练中很少观察到明显误差,但理论上存在风险)。每次运行都需要设置。
2.删除重命名冲突的 DLL 文件(经典方案,有效但有副作用)
既然报错的冲突是因为有两个 libiomp5md.dll,那就删掉一个(建议通过重命名的方式)。通常建议保留 PyTorch 自带的,删除(建议重命名) Anaconda 全局或其他库中的副本。
操作步骤:
(1)找到你的 Anaconda 环境路径(例如:D:\Anaconda3 或 C:\Users\YourName\anaconda3)
(2)进入以下目录查找并(删除)重命名 libiomp5md.dll:
路径 A(常见冲突源):anaconda3\Library\bin\libiomp5md.dll
路径 B(有时也需要检查):anaconda3\Lib\site-packages\torch\lib\libiomp5md.dll (注意:通常建议保留 torch 下的这个,删除 Library\bin 下的那个,或者反过来,视具体冲突情况而定。更稳妥的做法是重命名而非直接删除,以便恢复)。
更精准的操作(推荐重命名):
通常 PyTorch 依赖的是其自带目录下的 dll。如果报错,往往是因为系统路径(如 Library\bin)下的 dll 被优先加载了。
尝试重命名(推荐):将 anaconda3\Library\bin\libiomp5md.dll 重命名为 libiomp5md.dll.bak。
重新运行程序。
缺点:(1)破坏性操作:如果删错了文件,可能导致其他依赖 Intel MKL 的库(如旧版 NumPy、Scipy)无法运行。
(2)更新失效:Conda 或 Pip 更新包时,可能会重新下载该文件,导致问题复发。
(3)路径复杂:不同安装方式(Miniconda, Anaconda, 虚拟环境)路径不同,新手容易找错。
碎碎念
最理想的方案,还是不要混用conda和pip两种包管理工具。笔者在conda install无法正常下载时,总会优先尝试pip install,通常很快就可以正常下载。但是只用conda install的话,可能要折腾好一阵子了,时间成本也是成本,不喜折腾。所以,重命名的方式倒是很安全,只要准确找对文件就可以了,目前该方法笔者没有发现什么副作用。不过,混用conda和pip两种包管理工具导致的风险, libiomp5md.dll冲突是笔者遇到的第一个。
参考资料
彻底解决 Python/PyTorch 中 OMP Error #15 报错:多种方案汇总与深度解析_omp error 15-CSDN博客