您现在的位置是:首页 >其他 >【libtorch】pytorch源码编译生成c++ 17 libtorch记录网站首页其他
【libtorch】pytorch源码编译生成c++ 17 libtorch记录
1. 问题描述
-
ubuntu20.04 ros2 humble使用1.8.0 libtorch出现coredump,提示加载模型失败:torch::jit::load(std::cxx11::basic_string<char, std::char_traits, std::allocator const&, c10::optional<c10::Device>) () at /libtorch/lib/libtorch_cpu.so
-
原因: ros2 humble项目使用c++17编译,c++11的libtorch的库文件版本不配套导致
-
解决: 使用pytorch源码编译c++17 libtorch使用后解决
2. 编译安装前准备
-
确认要编译生成的libtorch版本
如 1.12.0 版本
-
下载pytorch源码
git clone https://github.com/pytorch/pytorch.git
-
切换到libtorch版本对应tag
cd pytorch git tag -l *1.12.0* // git tag查看版本,git tag -l搜索特定版本的tag git checkout v1.12.0 // 切换到特定tag的代码
-
更新所有显示modified的submodule,如下截图
git submodule sync git submodule update --init --recursive
注释:
-
最好有VPN,pytorch github官网时好时不好,有VPN更容易下载成功;
-
下载失败不要紧,反复尝试即可,但总体是比较耗时的;
-
有的博客提到,可以将 .gitmodules 文件中github.com替换为github加速插件的地址 github.com.cnpmjs.org,再执行submodule更新命令
-
submodule完整更新非常必要,否则可能中途编译失败
3. 编译安装
-
编译方式选择:目前看到三种编译安装方式
- python setup.py install
- python xxx/build_libtorch.py
- cmake完整编译方式
python的编译方式都使用了cmake工具编译项目,还可以设置是否使用ninja,生成库文件后还能将项目打包成python包;
考虑到cmake完整编译方式更为熟悉,方便设置c++17编译选项,以及能够生成直接使用的libtorch工程(bin/lib/include/share)等,采用cmake进行完整编译
-
编译选项设置
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
… -
编译安装
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. 编译好之后使用
-
proto
通过上述方式编译生成的libtorch会默认安装一个protoc,可能和已安装版本不一致;
会导致proto编译生成失败,比如报错
xxx.pb.h: #error this file was generated by an older version of protoc …需要删除其中一个版本,删除方式参考文章 protoc版本卸载
或者直接删除libtorch目录下的以下文件:
google/ // 目录include/google/protobuf libprotobuf-lite.a libprotobuf.a libprotoc.a protoc->protoc-xxx protoc-xxx
-
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