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

news2024/11/24 10:07:51

文章目录

    • 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.coloradmin.cn/o/2246597.html

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

相关文章

FreeRTOS——互斥信号量

一、为什么需要互斥信号量 前面的学习中&#xff1a; 调度锁、临界段不可避免的破坏了实时性&#xff0c;还有二值信号量存在这样的隐患——“优先级翻转” 优先级翻转 简单来说&#xff0c;就是由于信号量被低优先级任务占用&#xff0c;即使遇到高优先级任务&#xff0c;它…

前端-react(class组件和Hooks)

文章主要以Hooks为主,部分涉及class组件方法进行对比 一.了解react 1.管理组件的方式 在React中&#xff0c;有两种主要的方式来管理组件的状态和生命周期&#xff1a;Class 组件和 Hooks。 Class 组件&#xff1a; Class 组件是 React 最早引入的方式&#xff0c;它是基于…

Ngrok实现内网穿透(Windows)

Ngrok实现内网穿透&#xff08;Windows&#xff09; 什么是内网穿透&#xff0c;内网穿透有什么用 内网穿透&#xff08;NAT traversal&#xff09;是一种技术手段&#xff0c;使得位于内网或防火墙后面的设备能够通过外网访问。例如&#xff0c;如果你的计算机、服务器等设备…

如何使用Jest测试你的React组件

在本文中&#xff0c;我们将了解如何使用Jest&#xff08;Facebook 维护的一个测试框架&#xff09;来测试我们的React组件。我们将首先了解如何在纯 JavaScript 函数上使用 Jest&#xff0c;然后再了解它提供的一些开箱即用的功能&#xff0c;这些功能专门用于使测试 React 应…

力扣 三数之和-15

三数之和-15 class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {int temp 0;//定义一个二维vector数组vector<vector<int>> ans;int n nums.size();//对nums数组进行排序sort(nums.begin(), nums.end());//固定…

深度学习每周学习总结J6(ResNeXt-50 算法实战与解析 - 猴痘识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结ResNeXt基本介绍 1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数&#xff1a;定义损失函数&…

Transformer架构笔记

Attention is All You Need. 3.Model Architecture 3.1 整体架构如图 3.2 Encoder与Decoder Encoder&#xff1a;由 N 6 N6 N6个相同的Block/Layer堆叠而成。每个Block有两个子层sub-layer&#xff1a;多头注意力和MLP&#xff08;FFN&#xff0c;前馈神经网络&#xff09;&…

【大数据学习 | Spark-Core】spark-shell开发

spark的代码分为两种 本地代码在driver端直接解析执行没有后续 集群代码&#xff0c;会在driver端进行解析&#xff0c;然后让多个机器进行集群形式的执行计算 spark-shell --master spark://nn1:7077 --executor-cores 2 --executor-memory 2G sc.textFile("/home/ha…

增量预训练(Pretrain)样本拼接篇

增量预训练&#xff08;Pretrain&#xff09;样本拼接篇 一、Pretrain阶段&#xff0c;为什么需要拼接拼接&#xff1f; 为了提高pretrain效率、拓展LLM最大长度&#xff0c;随机将若干条短文本进行拼接是pretrain阶段常见手段。 二、有哪些拼接方式&#xff1f; 拼接方式一…

【AI最前线】DP双像素sensor相关的AI算法全集:深度估计、图像去模糊去雨去雾恢复、图像重建、自动对焦

Dual Pixel 简介 双像素是成像系统的感光元器件中单帧同时生成的图像&#xff1a;通过双像素可以实现&#xff1a;深度估计、图像去模糊去雨去雾恢复、图像重建 成像原理来源如上&#xff0c;也有遮罩等方式的pd生成&#xff0c;如图双像素视图可以看到光圈的不同一半&#x…

从零开始-VitePress 构建个人博客上传GitHub自动构建访问

从零开始-VitePress 构建个人博客上传GitHub自动构建访问 序言 VitePress 官网&#xff1a;VitePress 中文版 1. 什么是 VitePress VitePress 是一个静态站点生成器 (SSG)&#xff0c;专为构建快速、以内容为中心的站点而设计。简而言之&#xff0c;VitePress 获取用 Markdown…

使用uniapp编写APP的文件上传

使用uniapp插件文件选择、文件上传组件&#xff08;图片&#xff0c;视频&#xff0c;文件等&#xff09; - DCloud 插件市场 实用效果&#xff1a; 缺陷是只能一个一个单独上传

【51单片机】红外遥控

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 红外遥控硬件电路 NEC协议编码编程实例LCD1602显示Data红外遥控控制扇叶转速 红外遥控 红外遥控是利用红外光进行通信的设备&#…

【解决】Unity TMPro字体中文显示错误/不全问题

问题描述&#xff1a;字体变成方块 原因&#xff1a;字体资源所承载的长度有限 1.找一个中文字体放入Assets中 2.选中字体创建为TMPro 字体资源 3.选中创建好的字体资源&#xff08;蓝色的大F&#xff09; 在右边的属性中找到Atlas Width h和 Atlas Heigth,修改的大一点&…

深度学习:GPT-1的MindSpore实践

GPT-1简介 GPT-1&#xff08;Generative Pre-trained Transformer&#xff09;是2018年由Open AI提出的一个结合预训练和微调的用于解决文本理解和文本生成任务的模型。它的基础是Transformer架构&#xff0c;具有如下创新点&#xff1a; NLP领域的迁移学习&#xff1a;通过最…

CKA认证 | Day2 K8s内部监控与日志

第三章 Kubernetes监控与日志 1、查看集群资源状态 在 Kubernetes 集群中&#xff0c;查看集群资源状态和组件状态是非常重要的操作。以下是一些常用的命令和解释&#xff0c;帮助你更好地管理和监控 Kubernetes 集群。 1.1 查看master组件状态 Kubernetes 的 Master 组件包…

概念解读|K8s/容器云/裸金属/云原生...这些都有什么区别?

随着容器技术的日渐成熟&#xff0c;不少企业用户都对应用系统开展了容器化改造。而在容器基础架构层面&#xff0c;很多运维人员都更熟悉虚拟化环境&#xff0c;对“容器圈”的各种概念容易混淆&#xff1a;容器就是 Kubernetes 吗&#xff1f;容器云又是什么&#xff1f;容器…

JDBC编程---Java

目录 一、数据库编程的前置 二、Java的数据库编程----JDBC 1.概念 2.JDBC编程的优点 三.导入MySQL驱动包 四、JDBC编程的实战 1.创造数据源&#xff0c;并设置数据库所在的位置&#xff0c;三条固定写法 2.建立和数据库服务器之间的连接&#xff0c;连接好了后&#xff…

移动充储机器人“小奥”的多场景应用(上)

在当前现代化城市交通体系中&#xff0c;移动充储机器人“小奥”发挥着至关重要的作用。该机器人不仅是一个简单的设备&#xff0c;而是一个集成了高科技的移动充电站&#xff0c;为新能源汽车提供了一种前所未有的便捷充电解决方案。该机器人配备了先进的电池管理系统&#xf…

element dialog会隐藏body scroll 导致tab抖动 解决方案如下

element dialog会隐藏body scroll 导致tab抖动 解决方案如下 在dialog标签添加 :lockScroll"false"搞定