【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
    

注释:

  1. 最好有VPN,pytorch github官网时好时不好,有VPN更容易下载成功;

  2. 下载失败不要紧,反复尝试即可,但总体是比较耗时的;

  3. 有的博客提到,可以将 .gitmodules 文件中github.com替换为github加速插件的地址 github.com.cnpmjs.org,再执行submodule更新命令

  4. 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
    

注释:

  1. CMAKE_INSTALL_PREFIX就是项目中使用libtorch的目录

  2. make -j4,千万注意不要直接写成make -j,默认使用所有核的话,编译到8x%占用的内存会陡增导致编译卡住甚至死机

  3. 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

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值