【PyTorch】libtorch_cpu.so: undefined symbol: iJIT_NotifyEvent

【PyTorch】libtorch_cpu.so: undefined symbol: iJIT_NotifyEvent

1 报错信息

conda install pytorch=1.13.1 torchaudio=0.13.1 torchvision=0.14.1 cudatoolkit=11.7 -c pytorch

在 conda 环境中安装 torch 后测试,得到下面的错误:

>>> import torch
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/polaris/anaconda3/envs/xxx/lib/python3.9/site-packages/torch/__init__.py", line 218, in <module>
    from torch._C import *  # noqa: F403
ImportError: /home/polaris/anaconda3/envs/xxx/lib/python3.9/site-packages/torch/lib/libtorch_cpu.so: undefined symbol: iJIT_NotifyEvent

2 原因

参考 issue: Link

这个符号在 MKL 2024.1 中被移除了,然而 PyTorch 是根据旧版本的 MKL 构建的。 MKL 全称 Intel Math Kernel Library, 是由 Intel 公司开发的,专门用于矩阵计算的库。

  • 通过 conda 发布的 PyTorch 二进制文件是动态链接到 MKL 的,所以会遇到这个错误。
  • 通过 pip 发布的 PyTorch 二进制文件是静态链接到 MKL 的( 可以改用 pip install 来消除 MKL 的这个错误)

3 解决方法

参考 issue: Link

conda install mkl==2024.0
### 关于 `libtorch_cpu.so` 中 `undefined symbol: iJIT_NotifyEvent` 的分析 该问题通常发生在 PyTorch 库版本不匹配或者动态链接库加载异常的情况下。具体来说,当程序尝试导入 `torch` 模块时,如果使用的 PyTorch 版本与其依赖的底层 C++ 动态链接库(如 `libtorch_cpu.so`)之间存在版本差异,则可能会引发未定义符号 (`undefined symbol`) 错误。 以下是可能的原因以及对应的解决方案: #### 原因 1:PyTorch 版本与 CUDA 或 cuDNN 不兼容 在 Jetson TX2 设备上运行 PyTorch 时,由于硬件架构特殊(ARM64),官方预编译包可能无法完全适配设备上的 CUDA 和 cuDNN 版本。这可能导致某些函数(如 `iJIT_NotifyEvent`)未能正确导出到共享对象文件中[^1]。 ##### 解决方法: - **重新安装适合 ARM 架构的 PyTorch 轮子** 使用 NVIDIA 提供的特定轮子来替代默认的 pip 安装方式。例如,在 Jetson 平台上推荐通过以下命令获取合适的 PyTorch 版本: ```bash sudo apt-get update && sudo apt-get install -y python3-pip pip3 install torch torchvision torchaudio --extra-index-url https://nvidia.github.io/pytorch-arm64/ ``` - **验证环境配置一致性** 确认当前系统的 CUDA 和 cuDNN 版本是否满足所选 PyTorch 版本的要求。可以执行以下脚本来打印相关信息: ```python import torch print(f"Torch version: {torch.__version__}") print(f"CUDA available: {torch.cuda.is_available()}") print(f"CUDA version: {torch.version.cuda}") ``` --- #### 原因 2:动态链接路径设置不当 即使安装了正确的 PyTorch 版本,但如果系统找不到所需的 `.so` 文件或其依赖项,也可能触发类似的错误。Jetson TX2 上可能存在多个 Python 环境共存的情况,因此需要显式指定动态链接器查找路径。 ##### 解决方法: - **调整 LD_LIBRARY_PATH 变量** 将包含 `libtorch_cpu.so` 的目录加入到动态链接器搜索范围中。假设目标文件位于 `/usr/local/lib/python3.8/site-packages/torch/lib/`,可以通过以下指令临时修改环境变量: ```bash export LD_LIBRARY_PATH=/usr/local/lib/python3.8/site-packages/torch/lib/:$LD_LIBRARY_PATH ``` 如果确认有效,可将其写入 shell 配置文件(如 `.bashrc` 或 `.zshrc`)以便永久生效。 - **检查实际加载的 .so 文件** 利用 `ldd` 工具查看 `libtorch_cpu.so` 是否成功解析所有外部依赖关系: ```bash ldd /path/to/libtorch_cpu.so | grep "not found" ``` 若发现缺失的关键模块,请手动下载并放置至适当位置。 --- #### 原因 3:自定义构建过程中的遗漏 如果你是从源码自行编译 PyTorch,则需特别注意启用必要的选项以支持 JIT 编译功能。缺少这些标志可能导致最终生成的二进制文件缺乏完整的符号表。 ##### 解决方法: - **确保 cmake 参数完整** 在启动编译流程之前,务必添加 `-DBUILD_CAFFE2_OPS=ON` 和其他相关标记。例如: ```bash mkdir build && cd build cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DPYTHON_EXECUTABLE=$(which python3) \ -DBUILD_CAFFE2_OPS=ON \ -DCMAKE_INSTALL_PREFIX=/usr/local make -j$(nproc) sudo make install ``` - **清理旧版残留数据** 自定义构建前建议先卸载已有的 PyTorch 包以免冲突干扰新版本的功能实现: ```bash pip3 uninstall torch torchvision torchaudio rm -rf ~/.cache/pip/* ``` --- ### 总结代码片段 为了便于排查上述任一原因引起的故障,这里提供一段通用测试代码用于验证修复效果: ```python import torch try: device = 'cuda' if torch.cuda.is_available() else 'cpu' tensor = torch.rand(3, 3).to(device) result = tensor @ tensor.T print(result) except Exception as e: print(f"Error occurred during test: {e}") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

G.Chenhui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值