C++端部署pytorch, libtorc使用教程(精简版)

C++端部署pytorch, libtorc使用教程(精简版)

  1. 深度模型想要落地,必须要面临部署的问题,python虽然带来了训练的方便,但是实际部署却以C++端为主,所以如何让自己的模型很好的再C++端运行(除了C++调python代码)一直以来是个重要研究点,C++部署方法很多,这里仅针对libtorch的使用介绍:
  2. 环境说明:windows10、pytorch1.4、VS2017

1.libtorch下载,虽然官方没有直接给出之前的老版本,但是可以参照下载链接进行修改,比如我想下载其它版本如1.4的版本,下载链接如下:
在这里插入图片描述

在这里插入图片描述
2、模型转换,pytorch转libtorch:
在这里插入图片描述
在这里插入图片描述

3.Cmake构建好libtorch工程,然后使用VS打开根据cmake配置好的信息进行编译,配置CmakeList:

cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
project(simnet)

find_package(Torch REQUIRED)
find_package(OpenCV REQUIRED)

if(NOT Torch_FOUND)
    message(FATAL_ERROR "Pytorch Not Found!")
endif(NOT Torch_FOUND)

message(STATUS "Pytorch status:")
message(STATUS "    libraries: ${TORCH_LIBRARIES}")

message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")


add_executable(simnet main.cpp)
target_link_libraries(simnet ${TORCH_LIBRARIES} ${OpenCV_LIBS})
set_property(TARGET simnet PROPERTY CXX_STANDARD 11)

4、打开Window的命令行界面,进入build文件夹,然后我们设置我们的Cmake参数:

-DCMAKE_PREFIX_PATH=path\to\opencv\build\x64\vc15\lib;path\to\libtorch -DCMAKE_BUILD_TYPE=Release -G"Visual Studio 15 Win64" 

注意下修改cmake编译工具OpenCV和libtorch的位置信息。-G"Visual Studio 14 Win64"执行编译器是VS2015的编译工具,如果是2017的话就是-G"Visual Studio 15 Win64这里根据自己的需要进行调整。
5、如果出现以下内容,则编译正确:
在这里插入图片描述
编译成功进入build文件夹如下所示:
在这里插入图片描述

6、error C2440: “初始化”: 无法从“torch::jit::script::Module”转换为“std::shared_ptrtorch::jit::script::Module解决办法!在这里插入图片描述
7、C++示例代码参考,打开C++代码之后,设置自己的网络主代码为启动项,并且改为release X64模式:

#include <torch/script.h> // One-stop header.
#include <iostream>
#include <memory>

int main() {
  // Deserialize the ScriptModule from a file using torch::jit::load().
  std::shared_ptr<torch::jit::script::Module> module = torch::jit::load("E:/PyTorch/libtorch_test/Example/model.pt");

  assert(module != nullptr);
  std::cout << "ok\n";
  // Create a vector of inputs.
  std::vector<torch::jit::IValue> inputs;
  inputs.push_back(torch::ones({ 1, 3, 224, 224 }));

  // Execute the model and turn its output into a tensor.
  at::Tensor output = module->forward(inputs).toTensor();

  std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/5) << '\n';
  while (1);
}

8、如果你运气好,基本就不用看这个就可以正确运行,如果你运气差遇到了“未识别未加载kernelbase.pdb问题”,那么恭喜你中奖了,这并不是读取了图像,也不是版本造成的问题,具体解决办法加微(xiec177);
9、生成之后别急于运行, 不然会报缺少dll文件的错误,这里把libtorch lib文件夹下的所有dll复制到生成的exe同级目录在运行,就可以成功。
10、特别注意:调用自己的模型的时候需要传入数据。libtorch张量的操作与python端差不多,可以考虑参考进行张量的拼接而不是在C++中进行。Libtorch传输新的数据需要通过from_blob函数,这里传输的其实是数据指针。如果是MAT数据则直接用MAT.data传输,如果是数组则用&data[0],但是动态生成的数组一维测试成功,高维的测试不成功。
参考教程:https://blog.csdn.net/gulingfengze/article/details/92013360
https://oldpan.me/archives/pytorch-windows-libtorch

我叫谢琛,深度学习探索者一枚!(有意咨询xiec177)
tensorflow/pytorch交流群请加QQ:548368797
更多咨询咨询请关注!在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

谢陈(xiec177)

致力于解决深度学习框架问题。

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

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

打赏作者

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

抵扣说明:

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

余额充值