我正在学习使用 PyTorch 和 LibTorch 进行开发。我的
~/.bashrc
中有以下行用于动态链接 libtorch 库:
# libtorch linking path
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/user/.dev_libraries/libtorch/lib/
但是,当这个路径在
LD_LIBRARY_PATH
中时,在Python中导入torch
会报分段错误:
user@host:~$ $LD_LIBRARY_PATH
bash: /home/user/packages/embree-2.16.0.x86_64.linux/lib:/home/user/packages/embree-2.16.0.x86_64.linux/lib::/usr/local/lib/:/usr/local/cuda-11.1/lib64:/usr/local/lib/:/usr/local/cuda-11.1/lib64:/home/user/.dev_libraries/libtorch-cpu/libtorch/lib/: No such file or directory
user@host:~$ python
Python 3.8.10 (default, Jun 2 2021, 10:49:15)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
Segmentation fault (core dumped)
user@host:~$
一旦我从环境变量
LD_LIBRARY_PATH
中删除该路径,torch
就可以在Python中正确导入。
我猜测原因是 PyTorch 的某些共享库与 LibTorch 中的共享库具有相同的名称。这是否意味着 PyTorch 和 LibTorch 无法同时安装,或者我的环境设置不正确?我不想每次在两者之间切换时都重置
LD_LIBRARY_PATH
。
系统规格:
我也面临同样的问题。 您可以输入
import torch
print(torch.__version__)
查看torch的版本,并使用相同版本的libtorch,应该可以解决问题。
我解决了这个问题。
实际上,如果你已经使用pip下载了pytorch,则无需下载c++ libtorch。假设您使用 conda,libtorch.so 将自动安装在“/root/miniconda3/envs/your_env/lib/python3.10/site-packages/torch/lib”中,以及许多其他 c++ 可以使用的库。直接在你的c++代码中使用这个libtorch和cmake在通过pybind11将其导入到python时不会导致版本冲突,因为它们来自同一个地方。而且pybind11没有版本问题,所以如果你使用它,任何下载方法都可以(git clone from source或pip)。
set(TORCH_PATH "${CONDA_PATH}/lib/python3.10/site-packages/torch")
# Find pybind11 (from your own project)
add_subdirectory(extern/pybind11)
# Find Torch
find_package(Torch REQUIRED PATHS ${TORCH_PATH})
# Find torch_python lib
find_library(TORCH_PYTHON_LIBRARY torch_python "${TORCH_PATH}/lib")
if(TORCH_PYTHON_LIBRARY)
message(STATUS "Found TORCH_PYTHON_LIBRARY: ${TORCH_PYTHON_LIBRARY}")
else()
message(WARNING "TORCH_PYTHON_LIBRARY not found!")
endif()
这是我项目的cmakelist.txt的一部分,可以以此为例。