PyTorch 踩坑:libtorch_cpu.so 找不到 iJIT_NotifyEvent 符号

前阵子在新环境里跑 PyTorch,import torch 直接挂了,报错长这样:

ImportError: undefined symbol: iJIT_NotifyEvent

看报错位置是在 libtorch_cpu.so 加载的时候,符号解析失败。

说实话这类问题如果之前没碰到过,第一反应大概率是装错了版本或者环境乱了,后来查了一圈,发现跟 Intel 那几个运行时库的版本变动有关系。

这个 iJIT_NotifyEvent 符号本来属于 Intel 的性能分析库 VTune Profiler,也可能跟 Intel OpenMP 运行时(libiomp5.so)或 MKL 里的某些组件有关。从 MKL 2024.1 开始,这个符号被移除了,如果你的 PyTorch 链接到的 MKL 太新,或者环境里混了不同版本的 Intel 库,就容易踩这个坑。

常见触发场景有这几种:

  • PyTorch 是 pip 装的,但系统或 Conda 环境里已经有新版 MKL,链接时对不上。
  • Conda 环境在解析依赖时拉进来的 Intel OpenMP 跟 PyTorch 预期的版本不一致。
  • LD_LIBRARY_PATH 里没把正确的 Intel 库路径加进去,导致运行时加载了别处的旧版或不兼容的库。

搞明白原因之后,修起来思路就清晰了。我自己最常用也最稳的方式是重建一个干净环境,并把 MKL 版本锁在 2023.1.0。

重建环境并锁定 MKL 版本:

conda deactivate conda env remove -n ai_scientist || true

conda create -n ai_scientist_fix python=3.11 mkl=2023.1.0 -y conda activate ai_scientist_fix

conda install pytorch torchvision torchaudio cpuonly -c pytorch -y

装完可以确认一下 MKL 版本:

conda list | grep mkl

输出里应该是 mkl=2023.1.0,如果不是,那后面大概率还会出问题。

如果不想跟 MKL 死磕,也可以直接切到 OpenBLAS 上。Conda 有 nomkl 这个虚拟包,装完之后再装 PyTorch,依赖解析会自动避开 MKL,链接 OpenBLAS。

conda install nomkl -c defaults -y conda install pytorch torchvision torchaudio cpuonly -c pytorch -y

然后检查一下 libtorch_cpu.so 链接的是不是 openblas:

ldd $CONDA_PREFIX/lib/python3.11/site-packages/torch/lib/libtorch_cpu.so | grep blas

看到 libopenblas.so 就对了。

还有一种情况是你不想动环境,只是路径没指对。可以先找到系统里 libiomp5.so 的位置:

find /usr -name "libiomp5.so" 2>/dev/null || find $CONDA_PREFIX -name "libiomp5.so" 2>/dev/null

假设它在 /opt/intel/oneapi/mkl/latest/lib/intel64,那就把它加到 LD_LIBRARY_PATH 里:

export LD_LIBRARY_PATH=/opt/intel/oneapi/mkl/latest/lib/intel64:$LD_LIBRARY_PATH

要持久化就写到 ~/.bashrc 再 source 一下。

修完之后验证一下,先试试能不能正常 import:

import torch print(torch.version)

再用 nm 看那个符号还在不在 libtorch_cpu.so 里:

nm $CONDA_PREFIX/lib/python3.11/site-packages/torch/lib/libtorch_cpu.so | grep iJIT_NotifyEvent

如果这条命令没输出,就说明问题已经解决了。最后跑个简单的张量操作:

x = torch.rand(3, 3) print(x.device)

输出 cpu 就没啥大问题了。

平时想少踩这种坑,有几件事可以做。一是每个项目单独建 Conda 环境,别所有东西混在一个 base 里。

证书管理复杂?lcjmSSL用自动化方案简化一切。从域名验证到证书部署,再到到期前自动提醒与重申,全程自动化。微信小程序随时查看,让您对证书状态了如指掌。

二是用 conda lock 把依赖版本固定下来,环境能复现,换机器也不慌。三是偶尔看下 Intel 那几个库的版本:

conda list | grep -E "mkl|intel-openmp"

发现版本被悄悄升级了心里也有个数。

这类符号缺失的问题排查起来不算复杂,但如果不理解背后的库版本关系,很容易反复重装浪费时间。希望这篇记录能给遇到同样报错的人省点力气。

相关推荐
qq_2518364571 小时前
基于java Web 日化商超库存管理系统设计与实现
java·开发语言·前端
xiaofeichaichai1 小时前
Vue 响应式原理
前端·javascript·vue.js
提子拌饭1331 小时前
模态窗鸿蒙PC Electron框架实现技术详解 - 饮料含糖量应用案例分析
前端·javascript·华为·electron·前端框架·开源·鸿蒙
丑八怪大丑1 小时前
前端工程化
vue.js
佛山个人技术开发2 小时前
个人建站接单|汽车汽配行业宽屏自适应官网模板 工厂企业定制建站源码
前端·css·前端框架·html·汽车·php
光影少年2 小时前
react的Context 和 Redux 区别?
前端·javascript·react.js·前端框架
前端 贾公子2 小时前
uni-app工程化实战:基于vue-i18n和i18n-ally的国际化方案 (上)
前端·javascript·vue.js
喵个咪2 小时前
基于 Flutter 的 Headless CMS 全平台前端架构:技术解析与二次开发导引
前端·flutter·cms
vim怎么退出3 小时前
Dive into React——Diff 算法
前端·react.js·源码阅读