前阵子在新环境里跑 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"
发现版本被悄悄升级了心里也有个数。
这类符号缺失的问题排查起来不算复杂,但如果不理解背后的库版本关系,很容易反复重装浪费时间。希望这篇记录能给遇到同样报错的人省点力气。