深度学习模型部署与优化——基于pytorch

一、概述

在深度学习应用到生产过程中可以分为两个阶段——模型训练和模型部署,本文主讲模型部署。一个算法再优秀,评分再高,如果不能满足生产条件也没用。所谓的生产条件,通常都是要求算法推理过程够快,最好能够达到实时,其他要求还包括对内存、显存的限制。所以在模型部署阶段往往会进行相应的优化,在不损失过多精度的前提下,尽可能让模型更小、更快。

二、保存模型

pytorch保存模型有两种方式,一时保存网络结构和参数信息,二是只保存参数。前者保存和加载都只需要一行代码,后者稍微复杂一点,但是事实上是更好的选择。

# 这里只是演示一下流程,Husnet是通过继承torch.nn.module搭建的模型
save_model = Husnet()
# 保存整个模型并加载
torch.save(save_model, './data/hole_model.pth')
# 保存参数 
torch.save(save_model.state_dict(), './data/params.pth')
# 加载模型1
model1 = torch.load('./data/hole_model.pth')
# 加载模型2
model2 = Husnet()
model2.load_state_dict(torch.load('./data/params.pth'))

三、在C++环境中使用pytorch模型——利用libtorch

libtorch是c++版本的pytorch,所以在python环境中利用pytorch保存的模型可以在c++中利用libtorch加载。事实上在c++中利用libtorch也是可以搭建并训练模型的,只是开发效率较低,而且难以使用迁移学习。所以一般流程是开发流程如下:

  1. 利用pytorch搭建模型,并使用迁移学习训练
  2. 基于libtorch编写预测代码
  3. 编译(这个比较坑,目前还没有实现windows环境中libtorch的编译,教程一般是linux的)
  4. 运行

除开编译这部分虽然麻烦但是非技术性的工作,看起来在c++环境部署的主要工作就是编写预测部分的代码,无非就是读入图片、加载运行模型、输出结果,难度不大。这便是部署深度学习模型到c++环境最朴素的做法,那么如果要对模型进行手动优化呢?

四、模型优化(剪枝、量化等)

在模型部署中,上一节介绍的内容不过是流程式的东西,模型加速才是重头戏,这是真正涉及到技术和创造性的工作。这部分专门写一篇介绍,先来看看如何用tensorrt加速。

四、转为ONNX格式

Open Neural Network Exchange(ONNX,开放神经网络交换)格式,是一个用于表示深度学习模型的标准,可使模型在不同框架之间进行转移。TRT之前应该是不支持pytorch模型直接转化的,所以通过ONNX转化,但是现在pytorch可以直接转,而其他非主流的框架则还需要通过ONNX转TRT。

五、由ONNX转为tensorrt

六、直接由pytorch转为tensorrt

七、在Nano中使用tensorrt

你可能感兴趣的:(算法笔记,深度学习,pytorch,神经网络)