由于网上的教程不够具体,我根据官网的教程自己跑了一遍官网的demo,遇到了的一些坑,记录一下。
这是官网的教程:https://pytorch.org/tutorials/advanced/cpp_export.html#step-4-executing-the-script-module-in-c
Step1:Converting Your PyTorch Model to Torch Script
根据自己的模型选择对应的转换方法,一种是通过Trace的方法,调用torch.jit.trace(model,example)函数,可以获得一个torch.jit.ScriptModule对象。第二种是通过注释的方式,由于模型使用依赖于输入的控制流,所以tracing不合适了,所以用注解的方式转成ScriptModule对象。
Step2:Serializing Your Script Module to a File
python中用save方法来将模型保存到.pt文件中。
Step3:Loading Your Script Module in C++
写一个.cpp文件,这个文件中的内容就是官网上的A Minimal C++ Application,复制粘贴生成就完事了。(如果是在vs中写的,出现错误,不用管,因为项目中没有添加库目录,包含目录和附加依赖项,这个不用管,因为我们只需要.cpp文件就行。)
接下来用cmake来构建项目。所需要的有LibTorch库,还有就是cmake的环境配一下,不然cmd中不能执行cmake命令。
我们先创建一个CMakeLists.txt, 加入以下内容:
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(custom_ops)
find_package(Torch REQUIRED)
add_executable(example-app example-app.cpp)
target_link_libraries(example-app "${TORCH_LIBRARIES}")
set_property(TARGET example-app PROPERTY CXX_STANDARD 14)
我们这部分内容详细分析一下:
第一句意思是对cmake版本的最低要求做了限制。
第二句意思是创建的项目名称。
第三句意思是找到LibTorch包,这个照抄。
第四句意思是执行刚才我们编写的.cpp文件,同时生成一个目标target,名称为example-app
第五句意思是将目标和LibTorch库链接起来。
第六句意思是设置属性,照抄。
接着,我们把CMakeLists.txt和.cpp文件(我们这里就命名为example-app.cpp,和官网的一样)放在同一个文件夹下面,后面我们执行cmake命令时,这个目录就是工作目录,我们把这个文件夹命名为example-app。
准备工作做完了,我们现在在cmd下先进入到example-app目录下,然后
mkdir build
cd build
cmake -DCMAKE_PREFIX_PATH=/path/to/libtorch ..
cmake --build . --config Release
第三行的
/path/to/libtorch
是LibTorch的完整路径。
最后一行命令含义:. 的意思是路径名,后面是配置的版本,默认是Debug。
成功后结果应该是这样的:
到这里为止,项目构建好了。。。
注意1:打开项目,运行项目显示拒绝访问,把ALL_BUILD项目给删了就能运行。ALL_BUILD有啥作用呢?这边引用博客上的一段话: 一般CMake 在Vision studio 上 构建的工程(.sln “solution”)包含 三个工程(project),分别是:ALL_BUILD; 工程本身如:HelloCMake; ZERO_CHECK。HelloCMake就不用说了,自己要建立的那个工程;ALL_BUILD是管理整个项目的工程;ZERO_CHECK是实时监视CMakeLists.txt文件变化的工程,一旦CMakeLists.txt里的内容发生了任何变化,ZERO_CHECK就会告诉编译器要重新构建整个工程环境。详见)http://blog.163.com/jacky_ling0/blog/static/1373925712011072375418/?latestBlog
注意2:我们需要在项目属性里设置命令参数,这个命令参数就是.pt文件所在的路径。
用cmake的好处可以看这篇文章 https://blog.csdn.net/bandaoyu/article/details/89031672
Step4:: Executing the Script Module in C++
接下来我们就可以测试一下C++项目中的模型了。
在main函数里添加
// 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';
再运行就能得到结果了。