一、说明
这是一个很典型的python包重复,冲突造成的错误。本案例表现为:在conda和pytorch下都存在libiomp5md.dll,因而出现二意性无法继续,本篇如实记录解决过程。
二、遇到问题描述双重包调用是普遍的
2.1 库包含关系
在处理torch程序中,有如下包含:
import torch
from torch import nn
from d2l import torch as d2l
import torchvision
from torch.utils import data
from torchvision import transforms
调用该程序,无语法错误,但后面出现:
OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.
OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade performance or cause incorrect results. The best thing to do is to ensure that only a single OpenMP runtime is linked into the process, e.g. by avoiding static linking of the OpenMP runtime in any library. As an unsafe, unsupported, undocumented workaround you can set the environment variable KMP_DUPLICATE_LIB_OK=TRUE to allow the program to continue to execute, but that may cause crashes or silently produce incorrect results. For more information, please see http://www.intel.com/software/products/support/.
Process finished with exit code 3
网上查找相关解决方案,一般采用以下方式:
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE
但是这种方式治表不治里,在下一个项目运行中还有可能出行同样的问题。 搜索后看到web1和web2提供了一种根本性解决问题的方法。
2.2 问题分析
本问题出现主要是因为torch包中包含了名为libiomp5md.dll的文件,与Anaconda环境中的同一个文件出现了某种冲突,所以需要删除一个。
在Anaconda文件夹下搜索,如下图,删除Anaconda包中libiomp5md.dll这个文件,即下图所选定的那个。
就是因为在环境pytorch和anaconda中都存在libiomp5md.dll,这两个实体调用时存在冲突。因而解除这种冲突就可以解决。
三、解决方案探讨
3.1 解决思路
最直接的思路是,将不同版本的文件删除。
但如果是在某个python环境下,则需要删除的是该环境下的对应文件。
也就是:
- pytorch直接配备的:C:\anaconda3\Lib\site-packages\torch\lib
- 如果在Anaconda的base环境下:删除..\Anaconda3\Library\bin\libiomp5md.dll
- 如果是在某个env(例如名为work)下:删除..C:\anaconda3\pkgs\intel-openmp-2021.4.0-haa95532_3556\Library\bin
3.2 解决实施
删除重复文件的选择,如下图:
造成 冲突的是②和③中libiomp5md.dll冲突,因此挑选一个删除,这里删除【C:\anaconda3\Lib\site-packages\torch\lib】下的文件,理由是:其它程序文件(如matplotlib)要调用【C:\Anaconda3\Library\bin\libiomp5md.dll】下的libiomp5md.dll,为了不扩大影响面,就删除torch下的文件,也就是在运行torch时,不调用torch下库,而是调用torch上层路径的库。
四、结果和分析
实践表明,选择删除torch下对应文件,要比从删除 Anaconda3\Library下的文件表现要好,原因是:如果删除 Anaconda3\Library下libiomp5md.dll,其中matplotlib将不正常。问题暂时解决,但也感觉不是常宜之计。