【单点知识】基于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,一经查实,立即删除!

相关文章

‌Kotlin中的?.和!!主要区别

目录 1、?.和!!介绍 2、使用场景和最佳实践 3、代码示例和解释 1、?.和!!介绍 ‌Kotlin中的?.和!!主要区别在于它们对空指针的处理方式。‌ ‌?.&#xff08;安全调用操作符&#xff09;‌&#xff1a;当变量可能为null时&#xff0c;使用?.可以安全地调用其方法或属性…

java基础知识(常用类)

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

《Hello YOLOv8从入门到精通》5,颈部网络(Neck)结构、核心源码和参数调优

YOLOv8的颈部网络&#xff08;Neck&#xff09;是目标检测模型中的关键组成部分&#xff0c;它位于骨干网络&#xff08;Backbone&#xff09;和头部网络&#xff08;Head&#xff09;之间&#xff0c;主要负责进行特征融合和增强。 在YOLOv8中&#xff0c;颈部网络采用了先进…

C#里怎么样实现单向链表?

C#里怎么样实现单向链表? 数据结构,是程序基本表示方法。 不同的数据结构,就需要采用不同的算法。 在软件开发中,使用到的链表还是比较多的。不过,目前C#语言,基本上都类库, 所以需要自己创建链表的机会,基本不存在了。 但是作为理解原理,还是学习一下吧。 下面的例…

Servlet细节

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

对比三种UI交互界面的方案

在嵌入式系统的显示应用领域&#xff0c;如何高效、稳定地驱动TFT LCD显示屏至关重要。当下主流方案有三种&#xff1a; 单片机控制芯片屏 &#xff0c;常见的是瑞佑系列芯片单片机串口屏&#xff0c;常见迪文和大彩单片机内建LCD驱动&#xff0c;常见比如ST32F429等 这三种各…

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;主要应用于分布式系统中解耦应用…

第 36 章 - Go语言 服务网格

服务网格&#xff08;Service Mesh&#xff09;是一种管理服务间通信的方法&#xff0c;它允许开发人员对服务之间的交互进行抽象化处理。通过在基础设施层面上实现这一点&#xff0c;服务网格可以帮助解决微服务架构中常见的复杂性和挑战&#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. 使用…

2024小迪安全基础入门第七课

目录 一、抓包技术-Web&App&小程序&PC-扶墙双层 二、 抓包技术-Web&App&小程序&PC-项目联动 三、抓包技术-Web&App&小程序&PC-全局协议 一、抓包技术-Web&App&小程序&PC-扶墙双层 Wireshark&#xff1a; https://www.wir…

在 PyTorch 训练中使用 `tqdm` 显示进度条

在 PyTorch 训练中使用 tqdm 显示进度条 在深度学习的训练过程中&#xff0c;实时查看训练进度是非常重要的&#xff0c;它可以帮助我们更好地理解训练的效率&#xff0c;并及时调整模型或优化参数。使用 tqdm 库来为训练过程添加进度条是一个非常有效的方式&#xff0c;本文将…

windows基础之病毒编写

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

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

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

Git 使用技巧

1. 查看提交历史 git log 显示所有提交的详细信息 git log --oneline 查看每个版本的简要信息 git log --graph --decorate --all 显示完整提交图&#xff08;带详情&#xff09; ​​​​​​​git log --oneline --graph --all​​​​​​​ 显示分支合并图 git sh…

部署自动清理任务解决ORA-00257: archiver error. Connect internal only, until freed

使用oracle数据库的时候&#xff0c;我们一般都会开启归档&#xff0c;确保数据库的日志连续和和数据安全。但随着数据库的运行&#xff0c;归档文件会越来越多&#xff0c;最终撑满磁盘空间&#xff0c;数据库无法继续归档&#xff0c;出现“ORA-00257: archiver error. Conne…