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

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

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

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

C++端部署pytorch, libtorc使用教程(精简版)_第1张图片
2、模型转换,pytorch转libtorch:
C++端部署pytorch, libtorc使用教程(精简版)_第2张图片
在这里插入图片描述

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、如果出现以下内容,则编译正确:
C++端部署pytorch, libtorc使用教程(精简版)_第3张图片
编译成功进入build文件夹如下所示:
C++端部署pytorch, libtorc使用教程(精简版)_第4张图片

6、error C2440: “初始化”: 无法从“torch::jit::script::Module”转换为“std::shared_ptrtorch::jit::script::Module解决办法!C++端部署pytorch, libtorc使用教程(精简版)_第5张图片
7、C++示例代码参考,打开C++代码之后,设置自己的网络主代码为启动项,并且改为release X64模式:

#include  // One-stop header.
#include 
#include 

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

你可能感兴趣的:(Pytorch,libtorch)