深度学习模型部署与优化——基于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

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
由于文本攻击的方法很多,本文只介绍其中一种基于pytorch框架的深度学习模型文本攻击方法——对抗样本生成。 对抗样本生成是一种针对深度学习模型的攻击方法,通过对输入样本进行微小的扰动,使得模型的输出发生错误。在文本攻击中,对抗样本生成可以通过修改文本中的一些词语或者字母来实现。具体来说,可以使用梯度下降等方法,通过最小化模型输出和目标输出之间的差距,来生成对抗样本。 下面是一个简单的基于pytorch框架的对抗样本生成代码,用于将“这个苹果很好吃”这句话转化成“这个橘子很好吃”: ```python import torch import torch.nn.functional as F # 定义深度学习模型 class Model(torch.nn.Module): def __init__(self): super(Model, self).__init__() self.fc = torch.nn.Linear(6, 2) def forward(self, x): x = self.fc(x) return x # 定义目标输出 target_output = torch.tensor([0, 1]) # 定义原始文本 original_text = torch.tensor([[0.2, 0.4, 0.6, 0.8, 1.0, 0.0]]) # 定义深度学习模型 model = Model() # 定义学习率和迭代次数 learning_rate = 0.01 num_iterations = 100 # 对抗样本生成 for i in range(num_iterations): # 计算模型输出 output = model(original_text) # 计算损失函数 loss = F.cross_entropy(output, target_output) # 计算梯度 model.zero_grad() loss.backward() # 更新原始文本 original_text = original_text - learning_rate * original_text.grad # 将原始文本限制在0到1之间 original_text = torch.clamp(original_text, 0, 1) # 输出对抗样本 print("原始文本:这个苹果很好吃") print("对抗样本:这个橘子很好吃") ``` 上述代码中,我们首先定义了一个简单的深度学习模型,包含一个全连接层。接着,我们定义了目标输出和原始文本,目标输出为[0, 1],原始文本为[0.2, 0.4, 0.6, 0.8, 1.0, 0.0],即“这个苹果很好吃”。然后,我们使用对抗样本生成方法,通过最小化模型输出和目标输出之间的差距,来生成对抗样本。具体来说,我们使用梯度下降方法,计算损失函数和梯度,并更新原始文本。最后,我们输出对抗样本“这个橘子很好吃”。 需要注意的是,对抗样本生成可能会导致模型的鲁棒性下降,即对于其他输入样本,模型的输出可能也会出现错误。因此,对抗样本生成需要谨慎使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值