conda 环境下 LightGBM 随机崩溃并出现 Intel 与 LLVM OpenMP 同时加载告警怎么解决
【免费下载链接】LightGBMA fast, distributed, high performance gradient boosting (GBT, GBDT, GBRT, GBM or MART) framework based on decision tree algorithms, used for ranking, classification and many other machine learning tasks.项目地址: https://gitcode.com/GitHub_Trending/li/LightGBM
在 conda 环境里使用 LightGBM Python 包时,如果训练或预测程序随机崩溃,同时日志里出现下面这类告警,问题通常出在同一进程里同时加载了两个互相不兼容的 OpenMP 运行时库:
/root/miniconda/envs/test-env/lib/python3.8/site-packages/threadpoolctl.py:546: RuntimeWarning: Found Intel OpenMP ('libiomp') and LLVM OpenMP ('libomp') loaded at the same time. Both libraries are known to be incompatible and this can cause random crashes or deadlocks on Linux when loaded in the same Python program. Using threadpoolctl may cause crashes or deadlocks.上面是 LightGBM 官方 FAQ 中给出的文档示例,其中的路径、Python 版本和环境名只是示例输出,判断时以 "Found Intel OpenMP ('libiomp') and LLVM OpenMP ('libomp') loaded at the same time" 这句关键信息为准;完整告警的结尾还指向了 threadpoolctl 项目关于多重 OpenMP 冲突的说明文档。依赖threadpoolctl的 Python 包在这种情况下都可能触发这条警告。
判断:多个 OpenMP 库安装冲突
FAQ 对这类随机崩溃(或操作系统挂起)给出的可能原因是:机器上安装了多个 OpenMP 库且它们互相冲突。在 conda 环境里,高概率的具体成因是:Conda 分发的 Python 带入了 Conda 的numpy包,numpy又包含mkl包,而它与环境中的系统级 OpenMP 库发生冲突。
注意报错中库文件的扩展名会随操作系统变化,例如 macOS 上可能出现OMP: Error #15: Initializing libiomp5.dylib, but found libomp.dylib already initialized.这类字样;只要含义是"第二个 OpenMP 运行时初始化时发现第一个已加载",就属于同一类冲突。
主路径:conda 环境中的 Python 包只从 conda-forge 安装
针对"使用 LightGBM Python 包 + conda 作为包管理器"这一组合,FAQ 的明确建议是:把conda-forge作为所有 Python 包安装的唯一渠道,因为该渠道的包内置了规避 OpenMP 冲突的补丁。FAQ 中"从 conda 安装 LightGBM 该选哪个渠道"一条的结论一致:强烈建议从conda-forge安装,而不是default渠道。
具体操作是在出问题的 conda 环境中,用conda-forge渠道重新安装lightgbm及其依赖,并保证环境中其他 Python 包也来自同一渠道,避免别的渠道再带入独立的 OpenMP 运行时。FAQ 没有给出整段现成命令,下面这条是该渠道要求的直接实现,包名以你环境里实际需要安装的为准:
conda install -c conda-forge lightgbm如果环境中还有其他通过default等渠道安装、自带 OpenMP 运行时的包,按同样方式改从conda-forge重新安装,否则冲突依旧存在。
文档中给出的替代方案
以下分支只在主路径不适用或你的环境符合其适用条件时使用。
移除 Conda 包中的 MKL 优化
FAQ 给出的另一条 conda 场景 workaround 是彻底移除 Conda 包中的 MKL 优化:
conda install nomkl副作用说明:该命令会修改当前 conda 环境的包集合,可能连带变更numpy等依赖 MKL 优化的包,执行前确认环境可重建或已做备份。
macOS + Homebrew 下处理 OMP Error #15 形式的报错
如果告警是OMP: Error #15: Initializing libiomp5.dylib, but found libomp.dylib already initialized.这种形式,且环境是 macOS + Homebrew,FAQ 给出的处理是把 conda 环境目录$CONDA_PREFIX/lib里的 OpenMP 库替换为指向系统级(Homebrew 安装)库的符号链接,或先更新 Conda 里的numpy包。
OpenMP 8.0.0 之前可用的命令:
ln -sf `ls -d "$(brew --cellar libomp)"/*/lib`/* $CONDA_PREFIX/lib从 OpenMP 8.0.0 起,Homebrew 的 OpenMP formula 带上了-DLIBOMP_INSTALL_ALIASES=OFF选项,上面的命令不再有效,需要手动为库别名创建符号链接:
for LIBOMP_ALIAS in libgomp.dylib libiomp5.dylib libomp.dylib; do sudo ln -sf "$(brew --cellar libomp)"/*/lib/libomp.dylib $CONDA_PREFIX/lib/$LIBOMP_ALIAS; done副作用说明:这两条命令会向当前激活 conda 环境的$CONDA_PREFIX/lib写入符号链接(第二条使用了sudo,执行前确认$CONDA_PREFIX指向目标环境、且你理解往该目录写系统库链接的含义)。执行前请先conda activate进入目标环境。
不属于上述场景时
FAQ 对"以上情况都不是"的兜底结论是:自己找出机器上互相冲突的 OpenMP 库安装,只保留其中一个。文档没有给出更细的排查顺序,因此这一步需要你按实际环境自行定位(例如检查各包各自带入了哪个 OpenMP 运行时)。
修复后如何确认
FAQ 把上面这条threadpoolctl警告作为该冲突在日志中的信号,所以验证方式是重新运行原本崩溃的脚本,检查日志中该警告是否还出现:
- 警告不再出现,说明进程中不再同时加载 Intel 与 LLVM 两套 OpenMP 运行时;
- 警告仍然出现,说明两套运行时依旧共存,回到"只保留一个 OpenMP 库"的步骤继续处理。
需要提醒的边界:文档中这条警告描述的随机崩溃与死锁主要出现在 Linux 上;conda-forge渠道建议针对的是 LightGBM Python 包 + conda 的组合,如果你的环境不符合该前提,应以"找出冲突的 OpenMP 安装并只留一个"为最终依据。
【免费下载链接】LightGBMA fast, distributed, high performance gradient boosting (GBT, GBDT, GBRT, GBM or MART) framework based on decision tree algorithms, used for ranking, classification and many other machine learning tasks.项目地址: https://gitcode.com/GitHub_Trending/li/LightGBM
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考