C++端部署pytorch, libtorc使用教程(精简版)
- 深度模型想要落地,必须要面临部署的问题,python虽然带来了训练的方便,但是实际部署却以C++端为主,所以如何让自己的模型很好的再C++端运行(除了C++调python代码)一直以来是个重要研究点,C++部署方法很多,这里仅针对libtorch的使用介绍:
- 环境说明: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
更多咨询咨询请关注!