文章目录
- 1. 问题描述
- 2. 编译安装前准备
- 3. 编译安装
- 4. 编译好之后使用
1. 问题描述
ubuntu20.04 ros2 humble使用1.8.0 libtorch出现coredump,提示加载模型失败:
原因: ros2 humble项目使用c++17编译,c++11的libtorch的库文件版本不配套导致
解决: 使用pytorch源码编译c++17 libtorch使用后解决
2. 编译安装前准备
(1)确认要编译生成的libtorch版本
如 1.12.0 版本
(2)下载pytorch源码
git clone https://github.com/pytorch/pytorch.git
(4)切换到libtorch版本对应tag
cd pytorch
git tag -l *1.12.0* // git tag查看版本,git tag -l搜索特定版本的tag
git checkout v1.12.0 // 切换到特定tag的代码
(5)更新所有显示modified的submodule
git submodule sync
git submodule update --init --recursive
注释:
- 最好有VPN,pytorch github官网时好时不好,有梯子更方便;
- 下载失败不要紧,反复尝试即可,但总体是比较耗时的;
- 有的博客提到,可以将 .gitmodules 文件中github.com替换为github加速插件的地址 github.com.cnpmjs.org,再执行submodule更新命令
- submodule完整更新非常关键,否则可能中途编译失败
3. 编译安装
(1)编译方式选择
目前看到三种编译安装方式:
python setup.py install
python xxx/build_libtorch.py
cmake完整编译方式
python的编译方式都使用了cmake工具编译项目,还可以设置是否使用ninja,生成库文件后还能将项目打包成python包;
考虑到cmake完整编译方式更为熟悉,方便设置c++17编译选项,以及能够生成直接使用的libtorch工程(bin/lib/include/share)等,采用cmake进行完整编译
(2)编译选项设置
CMAKE_INSTALL_PREFIX:设置安装路径,如/libtorch,/opt/libtorch等
CMAKE_BUILD_TYPE:设置编译类型,debug/release,此处设置为release
CMAKE_CXX_STANDARD:c++标准编译选项
CMAKE_CXX_STANDARD_REQUIRED:设置为ON表示必须对c++标准进行指定
USE_CUDA:是否使用cuda,看模型选择,此处设置为ON
USE_CUDNN:与cuda一致
USE_OPENCV:没有用到opencv,可设置为OFF
…
(3)编译安装
cd pytorch
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/opt/libtorch -D CMAKE_CXX_STANDARD=17 -D CMAKE_CXX_STANDARD_REQUIRED=ON -D USE_CUDA=ON -D USE_CUDNN=ON -D USE_OPENCV=OFF -D BUILD_CAFFE2_MOBILE=OFF -D BUILD_PYTHON=OFF -D BUILD_CAFFE2_OPS=OFF -D BUILD_TEST=OFF -D USE_TBB=OFF ..
make -j4
make install
注释:
- CMAKE_INSTALL_PREFIX就是项目中使用libtorch的目录
- make -j4,千万注意不要直接写成make -j,默认使用所有核的话,编译到8x%占用的内存会陡增导致编译卡住甚至死机
- make install成功之后
4. 编译好之后使用
(1)proto
通过上述方式编译生成的libtorch会默认安装一个protoc,可能和已安装版本不一致;
会导致proto编译生成失败,比如报错
xxx.pb.h: #error this file was generated by an older version of protoc …
需要删除其中一个版本,删除方式参考文章
https://blog.csdn.net/baidu_35692628/article/details/121526178
(2)CMakeLists.txt使用
set(CMAKE_PREFIX_PATH /opt/libtorch) 设置libtorch路径
include_directories( 包含libtorch头文件等
【参考文章】
libtorch编译c++版本
pytorch c++17重编libtorch
linux下源码编译生成libtorch
python setup.py install方式尝试
设置c++17编译选项
created by shuaixio, 2023.06.01