从TorchScript生成模型到windows+vs2019+LibTorch调用模型

从TorchScript生成模型到windows+vs2019+LibTorch调用模型

Pytorch官方已经把自己的广告语打成了:From Research To Production,可见Pytorch已经计划从一个纯研究环境,向可以支持落地的产品环境转变支持。
从2020年5月5日官方发布1.5.0版本开始,支持C++部署的版本终于姗姗来迟,这为工业深度学习应用吹响了号角。
但是目前在windows环境下部署libtorch的文档还较少,还需要我们进一步摸索,在此把自己踩过的坑分享出来,以飨志同道合的同学们。
如有错误,敬请指正。谢谢!

References

Introduction to TorchScript

Loading a TorchScript Model in C++

TorchScript JIT for Master

visual studio 配置libtorch环境

windows下配置libtorch

windows下LibTorch找不到.dll的解决办法

环境配置

  1. windows系统下配置NVIDIA CUDA(>= 9.2) & cuDNN(适配CUDA版本)

    1)前往NVIDIA官网CUDADownload页面下载CUDA安装包,傻瓜式安装,无坑,经验证,最新版cuda自动配置环境变量,如需配置环境变量,请参看如下图片,注意:支持torchscript和libtorch的cuda版本至少需要9.2以上; 在这里插入图片描述
    安装完毕后可以查看版本,如图,我安装的是cuda10.2版本
    在这里插入图片描述

    2)在NVIDIA官网cuDNN页面下载对应CUDA版本的cuDNN包;
    在这里插入图片描述

    3)解压安装包,把cuDNN下的几个包按路径分别放置在CUDA安装路径下的对应路径下;

    cuDNN包下的三个路径如下:
    在这里插入图片描述

    对应的CUDA路径如下:
    在这里插入图片描述

  2. windows系统下配置Visual Studio & Anaconda

    1)下载并在线安装visual studio(省略)
    2)下载并安装Anaconda(省略)

  3. windows系统下配置Pytorch version >= 1.5.0
    1)首先建立虚拟环境:

    conda create -n <envname> python=3.6
    

    2)安装pytorch 1.5.0包:

    conda install pytorch torchvision cudatoolkit=10.2 -c pytorch
    
  4. windows系统下配置LibTorch: PyTorch C++ API

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GTSv2L38-1591411993468)(AC06704E0FBC4478AFA2896F95379601)]
    按要求下载
    下载后解压缩备用

Windows+VS2019+LibTorch配置项目调用模型

A 第一步:将你的Pytorch模型转换成Torch Script

假设你已经有一个python环境下训练得到的Pytorch模型,有两种方式进行转换,一种称之为Tracing,另一种是通过注解:

1)第一种方法,Tracing

import torch
import torchvision

# An instance of your model.
model = torchvision.models.resnet18()

# An example input you would normally provide to your model's forward() method.
example = torch.rand(1, 3, 224, 224)

# Use torch.jit.trace to generate a torch.jit.ScriptModule via tracing.
traced_script_module = torch.jit.trace(model, example)

2)第二种方法,注解法

class MyModule(torch.nn.Module):
    def __init__(self, N, M):
        super(MyModule, self).__init__()
        self.weight = torch.nn.Parameter(torch.rand(N, M))

    def forward(self, input):
        if input.sum() > 0:
          output = self.weight.mv(input)
        else:
          output = self.weight + input
        return output

my_module = MyModule(10,20)
sm = torch.jit.script(my_module)

B 第二步:将你的Script模型序列化成文件

1)Tracing下的文件转换

my_module.save("my_module.pt")

2)Annotation下的文件转换

traced_script_module.save("traced_resnet_model.pt")

C 第三步:在Visual Studio下新建一个项目并配置包含文件目录各链接库目录

1)首先选定x64平台,由于libtorch库的预编译是由x64平台实现的,所以一定要选定x64平台;

2)VC++目录 -> 包含目录,添加LibTorch库的路径:

在这里插入图片描述

E:\libtorch-win-shared-with-deps-debug-1.5.0\libtorch\include

3)C/C++ -> 附加包含目录,添加LibTorch库的路径:

在这里插入图片描述

E:\libtorch-win-shared-with-deps-debug-1.5.0\libtorch\include

4)链接器 -> 附加库目录,添加LibTorch依赖文件的路径:

在这里插入图片描述

E:\libtorch-win-shared-with-deps-debug-1.5.0\libtorch\include

5)链接器 -> 输入 -> 附加依赖项,添加依赖文件名:
在这里插入图片描述

asmjit.lib
c10.lib
c10_cuda.lib
caffe2_detectron_ops_gpu.lib
caffe2_module_test_dynamic.lib
caffe2_nvrtc.lib
clog.lib
cpuinfo.lib
fbgemm.lib
libprotobufd.lib
libprotobuf-lited.lib
libprotocd.lib
mkldnn.lib
torch_cpu.lib
torch_cuda.lib
torch.lib

Ps: 这里的文件可能并不是都需要,我比较懒,全扔进去

6)C/C++ -> 语言 -> 符合模式 ,改成“否”
在这里插入图片描述
到这一步为止,编译已经没有问题,但是实际运行时可能会报错,报c10.dll文件找不到的错误

7)重要的一步,在LibTorch没有改良之前,需要将丢失的.dll文件直接放进项目debug文件夹下,这样做的后果可能会使单个项目文件比较大,但考虑我们部署时原本就需要将dll文件打包到安装目录下,因此这也不是什么问题。
在这里插入图片描述

D 第四步:新建Minimal C++ 应用

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

#include <iostream>
#include <memory>

int main(int argc, const char* argv[]) {
  if (argc != 2) {
    std::cerr << "usage: example-app <path-to-exported-script-module>\n";
    return -1;
  }


  torch::jit::script::Module module;
  try {
    // Deserialize the ScriptModule from a file using torch::jit::load().
    module = torch::jit::load(argv[1]);
  }
  catch (const c10::Error& e) {
    std::cerr << "error loading the model\n";
    return -1;
  }

  std::cout << "ok\n";
}

E 第五步:编译生成可执行文件

这个程序需要传入模型文件参数,因此先编译生成可执行文件

F 第六步:执行文件,读取.pt模型

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章