[TOC]
C++模型调用
模型转换思路通常为:
- Pytorch -> ONNX -> TensorRT
- Pytorch -> ONNX -> TVM
- Pytorch -> 转换工具 -> caffe
- Pytorch -> torchscript(C++版本Torch) [此方式]
- pytorch-> JIT -> TensorRT
https://pytorch.org/cppdocs/api/library_root.html
https://pytorch.org/tutorials/advanced/cpp_frontend.html
最近所里有一个 GUI 项目需要调用 PyTorch 的模型,虽然之前做过一些,但是大部分用的是 Python 接口,这次对实效性有要求,因此做一个 C++的接口,现在把一些配置事项做个记录。
准备工作
下载安装支持库
首先,需要下载安装LibTorch
支持库,推荐使用LibPyTorch
下载后直接解压
1 | wget https://download.pytorch.org/libtorch/nightly/cpu/libtorch-shared-with-deps-latest.zip |
基于已训练的 Torch 模型
追踪原始模型
需要注意的是,如果希望加载 PyTorch 库到 C++中,首先需要基于 JIT 库的 TorchScript 对模型进行转化,这里以简单resnet18
模型来作为示例,可以简单的使用torchvision
中的模型库进行生成,接着我们生成一个简单的假数据,利用torch.jit.trace
让 TorchScript 能够遍历一遍模型,便可完成追踪。
1 | import torch |
对于可能存在依赖于数据输入条件的情况,如以下模型:
1 | import torch |
数据的前向传播有赖于输入的值,那么可以调用torch.jit.script
直接进行转换:
1 | my_module = MyModule(10,20) |
区别在于第二种方式实现时可以直接将正在训练的模型调用加载。 在获得上述的traced_script_module
后,实际上这是一个序列化的 torch 张量字典,可以直接调用save
方法完成保存:
1 | # 保存使用TorchScript遍历的模型 |
加载 Torch 模型
有了保存后的 pt 模型后,在 C++中的调用,即为和 LibTorch 库的交互,这里以官方的例子作说明
新建 C++项目, CMakeList 配置可以参考以下
1 | cmake_minimum_required(VERSION 3.16) |
对应简单加载 C++代码如下:
1 | #include <torch/script.h> // One-stop header. |
同时我们新建一个 build 文件夹以保存编译时文件
至此项目大致结构如下:
1 | ├── build |
进入 build 文件夹执行
1 | (base) ➜ cd build |
可以获得类似输出:
1 | (base) ➜ build cmake .. |
接着前往上级文件夹,执行编译得到的主程序:
1 | (base) ➜ cd .. |
使用CLion等IDE可以更简单的编译管理,而不需要自行build。
注意事项
注意加载模型时,两者必须在同一设备(Device)中。
基于 C++ 前端训练模型
实际上 C++前端提供了训练模型的接口,但是实施难度不低,相比 Python 训练完成后转 TypeScript 调用,这个方式稍显复杂。 官方提供的教程如下:使用 PyTorch 的 C++前端,后续再更新吧。
参考:
Offical Doc Pytorch cpp_export
2019-07 Cnblog 使用C++调用并部署pytorch模型
2020-07 CSDN Ubuntu下C++调用pytorch训练好模型–利用libtorch