【单点知识】基于PyTorch进行模型部署

文章目录

    • 0. 前言
    • 1. 模型导出
      • 1.1 TorchScript
        • 1.1.1 使用 `torch.jit.trace`
        • 1.1.2 使用 `torch.jit.script`
      • 1.2 ONNX
        • 1.2.1 导出为 ONNX 格式
      • 1.3 导出后的模型加载
        • 1.3.1 加载 TorchScript 模型
        • 1.3.2 加载 ONNX 模型
    • 2. 模型优化
      • 2.1 模型量化
      • 2.2 模型剪枝
    • 3. 服务化部署
      • 3.1 Flask 部署
      • Docker 部署
      • Kubernetes 部署
    • 4. 总结

0. 前言

按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。

随着深度学习技术的发展,模型训练和部署已成为机器学习项目的重要组成部分。PyTorch作为一个灵活且强大的深度学习框架,不仅支持高效的模型训练,还提供了丰富的工具和方法来简化模型的部署过程。本文将详细介绍如何使用PyTorch进行模型部署,包括模型导出、模型优化、服务化部署等方面的内容。

1. 模型导出

1.1 TorchScript

TorchScript 是 PyTorch 提供的一种将 Python 代码转换为独立于 Python 运行时的格式的方法。通过 TorchScript,可以将模型导出为一种可以在 C++ 环境中运行的形式,从而提高模型的性能和可移植性。

请添加图片描述

“Intermediate Representation”(IR,中间表示)是指在编译器或解释器中,源代码经过初步处理后生成的一种内部形式。这种形式既不是原始的源代码,也不是最终的机器码,而是介于两者之间的一种表示方法。IR 的主要目的是简化编译器的设计和优化过程。

1.1.1 使用 torch.jit.trace

torch.jit.trace 通过跟踪模型的前向传递过程,生成一个 TorchScript 模型。这种方法适用于模型的前向传递过程是静态的情况。

import torch
import torchvision.models as models# 加载预训练模型
model = models.resnet18(pretrained=True)
model.eval()# 创建一个示例输入
example_input = torch.rand(1, 3, 224, 224)# 使用 trace 导出模型
traced_model = torch.jit.trace(model, example_input)# 保存导出的模型
torch.jit.save(traced_model, 'resnet18_traced.pt')

输出为下面的.pt文件:
在这里插入图片描述

1.1.2 使用 torch.jit.script

torch.jit.script 通过编译模型的定义代码,生成一个 TorchScript 模型。这种方法适用于模型的前向传递过程包含控制流的情况。

import torch
import torchvision.models as models# 加载预训练模型
model = models.resnet18(pretrained=True)
model.eval()# 使用 script 导出模型
scripted_model = torch.jit.script(model)# 保存导出的模型
torch.jit.save(scripted_model, 'resnet18_scripted.pt')

输出为下面的.pt文件:
在这里插入图片描述

1.2 ONNX

ONNX(Open Neural Network Exchange)是一种开放的格式,用于表示深度学习模型。通过 ONNX,可以将 PyTorch 模型导出为 ONNX 格式,然后在其他框架中使用。

在这里插入图片描述

1.2.1 导出为 ONNX 格式
import torch
import torchvision.models as models
import torch.onnx# 加载预训练模型
model = models.resnet18(pretrained=True)
model.eval()# 创建一个示例输入
example_input = torch.rand(1, 3, 224, 224)# 导出为 ONNX 格式
torch.onnx.export(model, example_input, 'resnet18.onnx', opset_version=11)

输出为以下.onnx文件:
在这里插入图片描述

1.3 导出后的模型加载

导出后的模型可以使用相应的加载方法在不同的环境中运行。

1.3.1 加载 TorchScript 模型
import torch# 加载导出的模型
loaded_model = torch.jit.load('resnet18_traced.pt')# 创建一个示例输入
example_input = torch.rand(1, 3, 224, 224)# 进行推理
output = loaded_model(example_input)
print(output)

输出为:

tensor([[-1.6414e+00,  5.5231e-01,  1.4738e+00,  1.1497e+00,  1.1781e+00,...中间省略...-1.8591e+00, -2.4609e+00, -1.0664e+00,  7.1152e-02,  2.2847e+00]],grad_fn=<AddmmBackward0>)
1.3.2 加载 ONNX 模型
import onnxruntime as ort
import numpy as np# 加载 ONNX 模型
session = ort.InferenceSession('resnet18.onnx')# 创建一个示例输入
example_input = np.random.rand(1, 3, 224, 224).astype(np.float32)# 进行推理
output = session.run(None, {'input.1': example_input})
print(output)

需要先安装onnxruntime在这里插入图片描述
输出为:

[array([[-1.85326636e+00,  6.39043391e-01,  1.26607597e+00,...中间省略...-2.37750912e+00, -9.27967429e-01,  9.18730497e-02,2.44699574e+00]], dtype=float32)]

2. 模型优化

2.1 模型量化

模型量化是将模型的权重和激活从浮点数转换为低精度的整数(如 int8),从而减少模型的存储和计算需求。

import torch
import torchvision.models as models# 加载预训练模型
model = models.resnet18(pretrained=True)
model.eval()# 动态量化
quantized_model = torch.quantization.quantize_dynamic(model, {torch.nn.Linear}, dtype=torch.qint8)# 创建一个示例输入
example_input = torch.rand(1, 3, 224, 224)# 进行推理
output = quantized_model(example_input)
print(output)

2.2 模型剪枝

模型剪枝是通过移除模型中不重要的权重来减少模型的参数量和计算量。PyTorch 提供了 torch.nn.utils.prune 模块来实现模型剪枝。

剪枝此前已详细介绍过,不再赘述。
【PyTorch单点知识】神经元网络模型剪枝prune模块介绍(上,非结构化剪枝)
【PyTorch单点知识】神经元网络模型剪枝prune模块介绍(下,结构化剪枝)

3. 服务化部署

3.1 Flask 部署

Flask 是一个轻量级的 Python Web 框架,非常适合用于快速搭建模型服务。通过 Flask可以创建一个简单的 Web 应用,提供 RESTful API 接口来接收客户端请求,调用模型进行推理,并返回结果。首先,需要安装 Flask 和模型所需的依赖库,然后编写一个 Flask 应用来加载模型并处理请求。最后,启动 Flask 应用,监听特定的端口,使客户端可以通过 HTTP 请求访问模型服务。

在这里插入图片描述

Docker 部署

Docker 是一种容器化技术,可以将应用程序及其依赖环境打包成一个独立的容器镜像。通过 Docker可以确保模型服务在不同环境中具有一致的行为。首先,需要创建一个 Dockerfile,定义模型服务的运行环境和依赖。然后,使用 Docker 命令构建镜像,并运行容器。Docker 容器可以轻松地在网络中移动和扩展,非常适合用于生产环境中的模型部署。通过端口映射可以将容器内的服务暴露给外部网络,使客户端能够访问模型服务。
在这里插入图片描述

Kubernetes 部署

Kubernetes 是一个开源的容器编排平台,用于自动化应用的部署、扩展和管理。通过 Kubernetes可以将模型服务部署到一个高度可扩展和容错的集群中。首先需要将模型服务打包成 Docker 镜像,并推送到容器注册表。然后,编写 Kubernetes 资源文件(如 Deployment 和 Service),定义模型服务的部署和暴露方式。使用 kubectl 命令将这些资源文件应用到 Kubernetes 集群中,Kubernetes 会自动管理容器的生命周期,确保服务的高可用性和弹性伸缩。通过 Kubernetes 的负载均衡器,客户端可以均匀地访问模型服务,提高系统的整体性能和可靠性。

在这里插入图片描述

这三种方法各有优劣,选择合适的方法取决于具体需求和技术栈。Flask 部署简单快捷,适用于小规模和开发测试环境;Docker 部署提供了环境一致性,适用于中等规模和生产环境;Kubernetes 部署提供了高度的可扩展性和容错性,适用于大规模和企业级应用场景。

4. 总结

本文详细介绍了如何使用 PyTorch 进行模型部署,包括模型导出、模型优化和服务化部署等方面的内容。通过这些技术和方法的应用,可以显著提高模型的性能和可移植性,为深度学习项目的实际应用提供了有力的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/62076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java基础知识(常用类)

目录 一、包装类(Wrapper) (1)包装类与基本数据的转换 (2)包装类与String类型的转换 (3)Integer类和Character类常用的方法 二、String类 (1)String类介绍 1)String 对象用于保存字符串,也就是一组字符序列 2)字符串常量对象是用双引号括起的字符序列。例如:&quo…

Servlet细节

目录 1 Servlet 是否符合线程安全&#xff1f; 2 Servlet对象的创建时间&#xff1f; 3 Servlet 绑定url 的写法 3.1 一个Servlet 可以绑定多个url 3.2 在web.xml 配置文件中 url-pattern写法 1 Servlet 是否符合线程安全&#xff1f; 答案&#xff1a;不安全 判断一个线程…

w~视觉~3D~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12538137 #SIF3D 通过两种创新的注意力机制——三元意图感知注意力&#xff08;TIA&#xff09;和场景语义一致性感知注意力&#xff08;SCA&#xff09;——来识别场景中的显著点云&#xff0c;并辅助运动轨迹和姿态的预测…

fastjson不出网打法—BCEL链

前言 众所周知fastjson公开的就三条链&#xff0c;一个是TemplatesImpl链&#xff0c;但是要求太苛刻了&#xff0c;JNDI的话需要服务器出网才行&#xff0c;BCEL链就是专门应对不出网的情况。 实验环境 fastjson1.2.4 jdk8u91 dbcp 9.0.20 什么是BCEL BCEL的全名应该是…

GitLab使用操作v1.0

1.前置条件 Gitlab 项目地址&#xff1a;http://******/req Gitlab账户信息&#xff1a;例如 001/******自己的分支名称&#xff1a;例如 001-master&#xff08;注&#xff1a;master只有项目创建者有权限更新&#xff0c;我们只能更新自己分支&#xff0c;然后创建合并请求&…

MATLAB GUI设计(基础)

一、目的和要求 1、熟悉和掌握MATLAB GUI的基本控件的使用及属性设置。 2、熟悉和掌握通过GUIDE创建MATLAB GUI的方法。 3、熟悉和掌握MATLAB GUI的菜单、对话框及文件管理框的设计。 4、熟悉和掌握MATLAB GUI的M文件编写。 5、了解通过程序创建MATLAB GUI的方法。 二、内…

RabbitMQ简单应用

概念 RabbitMQ 是一种流行的开源消息代理&#xff08;Message Broker&#xff09;软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP - Advanced Message Queuing Protocol&#xff09;。RabbitMQ 通过高效的消息传递机制&#xff0c;主要应用于分布式系统中解耦应用…

【es6】原生js在页面上画矩形及删除的实现方法

画一个矩形&#xff0c;可以选中高亮&#xff0c;删除自己效果的实现&#xff0c;后期会丰富下细节&#xff0c;拖动及拖动调整矩形大小 实现效果 代码实现 class Draw {constructor() {this.x 0this.y 0this.disX 0this.disY 0this.startX 0this.startY 0this.mouseDo…

【前端】JavaScript中的隐式声明及其不良影响分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是隐式声明&#xff1f;&#x1f4af;隐式声明的常见情景1. 赋值给未声明的变量2. 非严格模式下的隐式声明3. 函数中的变量漏掉声明4. for 循环中的隐式声明5. 使用…

windows基础之病毒编写

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

家校通小程序实战教程02口令管理

目录 1 创建数据源2 搭建后台功能3 生成口令4 调用API总结 我们的小程序上线之后&#xff0c;必然面临家长要加入的问题。微搭有登录验证的功能&#xff0c;但是手机验证的机制是&#xff0c;如果你未注册就给你自动注册一个账号&#xff0c;如果以注册了收到验证码就可以登录系…

Elasticsearch中的节点(比如共20个),其中的10个选了一个master,另外10个选了另一个master,怎么办?

大家好&#xff0c;我是锋哥。今天分享关于【Elasticsearch中的节点&#xff08;比如共20个&#xff09;&#xff0c;其中的10个选了一个master&#xff0c;另外10个选了另一个master&#xff0c;怎么办&#xff1f;】面试题。希望对大家有帮助&#xff1b; Elasticsearch中的节…

阿里发布 EchoMimicV2 :从数字脸扩展到数字人 可以通过图片+音频生成半身动画视频

EchoMimicV2 是由阿里蚂蚁集团推出的开源数字人项目&#xff0c;旨在生成高质量的数字人半身动画视频。以下是该项目的简介&#xff1a; 主要功能&#xff1a; 音频驱动的动画生成&#xff1a;EchoMimicV2 能够使用音频剪辑驱动人物的面部表情和身体动作&#xff0c;实现音频与…

【NLP高频面题 - 分布式训练】ZeRO1、ZeRO2、ZeRO3分别做了哪些优化?

【NLP高频面题 - 分布式训练】ZeRO1、ZeRO2、ZeRO3分别做了哪些优化&#xff1f; 重要性&#xff1a;★★ NLP Github 项目&#xff1a; NLP 项目实践&#xff1a;fasterai/nlp-project-practice 介绍&#xff1a;该仓库围绕着 NLP 任务模型的设计、训练、优化、部署和应用&am…

C#基础控制台程序

11.有一个54的矩阵&#xff0c;要求编程序求出其中值最大的那个元素的值&#xff0c;以及其所在的行号和列号。 12.从键盘输入一行字符&#xff0c;统计其中有多少个单词&#xff0c;单词之间用空格分隔开。 13.输入一个数&#xff0c;判断它是奇数还是偶数&#xff0c;如果…

三六零[601360]行情数据接口

1、三六零&#xff1a;实时行情 Restful API # 测试接口&#xff1a;可以复制到浏览器打开 https://tsanghi.com/api/fin/stock/XSHG/realtime?tokendemo&ticker601360获取股票实时行情&#xff08;开、高、低、收、量&#xff09;。 请求方式&#xff1a;GET。 Python示例…

eclipse-git项目提示NO-HEAD

1、出现该问题的过程 本人在用eclipse拉取git代码&#xff0c;刚拉取完&#xff0c;可能还没来得及跟本地的分支合并&#xff0c;电脑就卡动了。无奈只能重启电脑&#xff0c;打开eclipse&#xff0c;maven项目后面就出现了xxx NO-HEAD的提示。 2、问题解决 根据错误提示&am…

Cross-Site Scripting(XSS)攻击

简介 XSS&#xff08;跨站脚本攻击&#xff09;是一种常见的 Web 安全漏洞&#xff0c;攻击者通过在目标网站的输入框中注入恶意脚本&#xff0c;当其他用户&#xff08;如管理员&#xff09;查看包含恶意脚本的页面时&#xff0c;脚本会在他们的浏览器中执行。XSS 攻击可以分…

uniapp中使用uni-forms实现表单管理,验证表单

前言 uni-forms 是一个用于表单管理的组件。它提供了一种简化和统一的方式来处理表单数据&#xff0c;包括表单验证、字段绑定和提交逻辑等。使用 uni-forms可以方便地创建各种类型的表单&#xff0c;支持数据双向绑定&#xff0c;可以与其他组件及API进行良好的集成。开发者可…

android 11添加切换分屏功能

引言 自Android 7开始官方就支持分屏显示,但没有切换分屏的功能,即交换上下屏幕。直到Android 13开始才支持切换分屏,操作方式是:分屏模式下双击中间分割线就会交换上下屏位置。本文的目的就是在Android 11上实现切换分屏的功能。 下图是Android13切换分屏演示 切换分屏…