Torchserve打包和部署你训练的深度学习模型

2023-11-17

一、Torchserve介绍

Torchserve是Facebooke公司开发的在线深度学习模型部署框架,它可以很方便的部署pytorch的深度学习模型,读者可以访问Github地址获取最新功能和详细说明:官方地址https://github.com/pytorch/serve/blob/master/docs/README.md。

我们已经在文章Ubuntu配置Torchserve环境,并在线发布你的深度学习模型中描述了怎么一步步安装-部署深度学习模型。读者可以自行查阅。在上文中,我们利用的是Torchserve提供的官方模型mnist例子作为演示。在本文中,我会描述怎么一步步打包和部署自己的深度学习模型。下面,开始正文!

二、打包你的深度学习模型

主要采用的是pytorch框架来训练你的深度学习模型。看这个文章的人,肯定已经知道什么pytorch了,我就不废话了。我主要是利用pytorch进行CT图像的分类,采用了github上大佬编写的框架(github地址),喜欢可以给他个star。我同时也针对这个框架进行了增添,新的代码我也会贡献在Github上,敬请期待吧!

我采用的深度学习模型是resnet101,使用预训练模型进行迁移学习。训练完成之后,得到了模型参数resnet101.pth,这个文件中包含了模型的全部权重参数,简言之,这就训练后针对CT图像分类的模型。

接下来,你要想部署到Tochserve上,你必须把模型文件resnet101.pth转换为torch脚本,然后将上文转换完成的脚本序列化为pt模型文件。具体做法如下所示:
1.定义一个python文件,输入resnet101.pth,输出resnet101.pt

import torch
import cfg # cfg是参数的预定于文件

def load_checkpoint(filepath):
    checkpoint = torch.load(filepath, map_location='cpu') 
    model = checkpoint['model']  # 提取网络结构
    model.load_state_dict(checkpoint['model_state_dict'])  # 加载网络权重参数
    for parameter in model.parameters():
        parameter.requires_grad = False
    model.eval()
    return model
    
if __name__ == "__main__":
    #利用trace把模型转化为pt
    trained_model = cfg.TRAINED_MODEL #cfg.TRAINED_MODEL表示resnet101.pth所在的位置
    model = load_checkpoint(trained_model)
    example = torch.rand(1, 3, 224, 224)
    traced_script_module = torch.jit.trace(model, example)
    traced_script_module.save('resnet101.pt')
    output = traced_script_module(torch.ones(1, 3, 224, 224))
    print(output)

Torch脚本是一种从PyTorch代码创建可序列化和可优化模型的方法。用Torch脚本编写的代码可以从Python进程中保存,并在没有Python依赖的进程中加载。我们提供了一些工具帮助我们将模型从纯Python程序逐步转换为可以独立于Python运行的Torch脚本程序。Torch脚本程序可以在其他语言的程序中运行(例如,在独立的C ++程序中)。这使得我们可以使用熟悉的工具在PyTorch中训练模型,而将模型导出到出于性能和多线程原因不能将模型作为Python程序运行的生产环境中去,参见文章PyTorch 1.0 中文文档:Torch 脚本

运行上述文件,得到resnet101.pt文件。

*2.准备打包文件
我们已经在文章Ubuntu配置Torchserve环境,并在线发布你的深度学习模型讲述了打包模型的方法,但是,当我们打包自己模型的时候,其中有几个最重要的文件需要我们自己定义。如下所示:

torch-model-archiver --model-name resnet101  --version 1.0  --serialized-file resnet101.pt  --extra-files index_to_name.json,MyHandler.py  --handler my_handler.py

详细解释如下:

  • –model-name: 模型的名称,这是我们自己定义的,就是为你的模型起个名字,我们就称为resnet101。
  • –model-file: 模型采用的类别,即模型的网络结果,我们采用的是resnet101,所以可以编写一个python文件,定义一个模型类,命名为model.py:
from torchvision.models.resnet import ResNet, Bottleneck
class ResNet101ImageClassifier(ResNet):
    def __init__(self):
        super(ResNet101ImageClassifier, self).__init__(Bottleneck, [3, 4, 23, 3])
  • –serialized-file: 直接调用我们训练好的resnet101.pt文件。
  • –handler: 打包模型后模型的执行流程,主要包括预处理、预测和后处理的流程,建立一个my_handler.py文件,来调用我们自定义的MyHandler.py,读者也可参看文章PyTorch最新工具torchserve用于0.部署模型
 from MyHandler import MyHandler
_service = MyHandler()
def handle(data, context):
    if not _service.initialized:
        _service.initialize(context)
    if data is None:
        return None
    data = _service.preprocess(data)
    data = _service.inference(data)
    data = _service.postprocess(data)
    return data
  • –extra-files:表示额外文件,我们把index_to_name.json文件(torchserve内置)和MyHandler.py定义到里面。其中MyHandler.py是我们自定义的handler文件,如下所示:
"""
Module for image classification default handler
"""
import logging
import torch
import torch.nn.functional as F
import io
from PIL import Image
from torchvision import transforms
from ts.torch_handler.base_handler import BaseHandler

class MyHandler(BaseHandler):
    """
    ImageClassifier handler class. This handler takes an image
    and returns the name of object in that image.
    """
    def __init__(self, *args, **kwargs):
        super().__init__()   
        self.transform = transforms.Compose([
            transforms.Resize(256),
            transforms.CenterCrop(224),
            transforms.ToTensor(),
            transforms.Normalize(mean=[0.485, 0.456, 0.406],
                                 std=[0.229, 0.224, 0.225])
        ])
    
    def preprocess_one_image(self, req):
        #对输入图片进行预处理操作(这表示单个图像)
        image = req.get("data")
        if image is None:
            image = req.get("body")
        image = Image.open(io.BytesIO(image))
        image = self.transform(image) #这个就是预处理操作
        image =image.unsqueeze(0)
        return image

    def preprocess(self, requests):
        #为应对同时处理多个图片,我们设计成多图片的预处理
        images = [self.preprocess_one_image(req) for req in requests]
        images = torch.cat(images)
        return images
    
    def inference(self, images):
        #推理,调用模型对输入进行预测,预测之后得到判断结果
        outs = self.model(images)
        probs = F.softmax(outs, dim=1)
        preds = torch.argmax(probs, dim=1)
        return preds
    
    def postprocess(self, preds):
       #输出,定义输出展示方式
        preds = preds.cpu().tolist()
        return preds

最后我们的文件夹中的文件结构是这样子的:
在这里插入图片描述
*3.执行打包命令
通过电脑CMD进入,CD到存放文件的文件夹中,进入conda的torchserve环境,可以参看我的文章Ubuntu配置Torchserve环境,并在线发布你的深度学习模型获取详细步骤;执行以下命令:

torch-model-archiver --model-name resnet101  --version 1.0  --serialized-file resnet101.pt  --extra-files index_to_name.json,MyHandler.py  --handler my_handler.py

这时候,我们的文件夹中会生成一个resnet101.mar文件。

三、部署resnet101.mar文件到Ubuntu云服务器

恭喜你已经完成了模型的打包,这个时候只要按照文章Ubuntu配置Torchserve环境,并在线发布你的深度学习模型中的步骤,就能成功把模型进行在线部署了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Torchserve打包和部署你训练的深度学习模型 的相关文章

  • Django + nginx + uwsgi 无法登录

    我有非常简单的登录逻辑 类似于官方 Django 解决方案 class Login FormView template name login html form class AuthenticationForm def get self a
  • 如何删除 PyCharm 中的项目?

    如果我关闭一个项目 然后删除该项目文件夹 则在 PyCharm 重新启动后 会再次创建一个空的项目文件夹 只需按顺序执行以下步骤即可 他们假设您当前在 PyCharm 窗口中打开了该项目 单击 文件 gt 关闭项目 关闭项目 在 PyCha
  • 从字典的元素创建 Pandas 数据框

    我正在尝试从字典创建一个 pandas 数据框 字典设置为 nvalues y1 1 2 3 4 y2 5 6 7 8 y3 a b c d 我希望数据框仅包含 y1 and y2 到目前为止我可以使用 df pd DataFrame fr
  • 如何使用 python 的 http.client 准确读取一个响应块?

    Using http client在 Python 3 3 或任何其他内置 python HTTP 客户端库 中 如何一次读取一个分块 HTTP 响应一个 HTTP 块 我正在扩展现有的测试装置 使用 python 编写 http clie
  • 如何在python中附加两个字节?

    说你有b x04 and b x00 你如何将它们组合起来b x0400 使用Python 3 gt gt gt a b x04 gt gt gt b b x00 gt gt gt a b b x04 x00
  • 如何使用 Python boto3 获取 redshift 中的列名称

    我想使用 python boto3 获取 redshift 中的列名称 创建Redshift集群 将数据插入其中 配置的机密管理器 配置 SageMaker 笔记本 打开Jupyter Notebook写入以下代码 import boto3
  • 如何获取numpy.random.choice的索引? - Python

    是否可以修改 numpy random choice 函数以使其返回所选元素的索引 基本上 我想创建一个列表并随机选择元素而不进行替换 import numpy as np gt gt gt a 1 4 1 3 3 2 1 4 gt gt
  • 使用 Pytest 的参数化添加测试功能的描述

    当其中一个测试失败时 可以在测试正在测试的内容的参数化中添加描述 快速了解测试失败的原因 有时您不知道测试失败的原因 您必须查看代码 通过每个测试的描述 您就可以知道 例如 pytest mark parametrize num1 num2
  • 在 Mac OSX 上从 Python 3.6 运行 wine 命令

    我正在尝试用 Python 编写一个打开的脚本wine然后发送代码到wine终端打开一个 exe程序 这 exe程序也是命令驱动的 我可以打开wine 但我无法进一步 import shlex subprocess line usr bin
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • Jupyter 笔记本中未显示绘图图表

    我已经尝试解决这个问题几个小时了 我按照上面的步骤操作情节网站 https plot ly python getting started start plotting online并且图表仍然没有显示在笔记本中 这是我的情节代码 color
  • 为什么在Python解释器中输入_会返回True? [复制]

    这个问题在这里已经有答案了 我的翻译行为非常奇怪 gt gt gt True gt gt gt type True
  • 为正则表达式编写解析器

    即使经过多年的编程 我很羞愧地说我从未真正完全掌握正则表达式 一般来说 当问题需要正则表达式时 我通常可以 在一堆引用语法之后 想出一个合适的正则表达式 但我发现自己越来越频繁地使用这种技术 所以 自学并理解正则表达式properly 我决
  • 使用 suds SOAP 库进行 HTTP 身份验证的奇怪行为

    我有一个正在运行的 python 程序 它使用 suds 通过 SOAP 获取大量数据 Web服务是通过分页功能实现的 这样我就可以抓取nnn每个 fetch 调用的行并获取下一个nnn与后续的电话 如果我使用如下代码向 HTTP 服务器进
  • Discord.py 嵌入中禁用按钮/冻结按钮

    I m trying to make a replica of this bot in which when I press any of the buttons below it shows a dropdown menu and you
  • Python守护进程:保持日志记录

    我有一个将一些数据记录到磁盘的脚本 logging basicConfig filename davis debug log level logging DEBUG logging basicConfig filename davis er
  • 如何通过函数注释指示函数需要函数作为参数,或返回函数?

    您可以使用函数注释 http www python org dev peps pep 3107 在python 3中指示参数和返回值的类型 如下所示 def myfunction name str age int gt str return
  • 将时间添加到日期时间

    我有一个像这样的日期字符串 然后使用strptime 所以就像这样 my time datetime datetime strptime 07 05 15 m d Y 现在我想添加 23 小时 59 分钟my time 我努力了 timed
  • 在matlab中,如何读取python pickle文件?

    在 python 中 我生成了一个 p 数据文件 pickle dump allData open myallData p wb 现在我想在Matlab中读取myallData p 我的Matlab安装在Windows 8下 其中没有Pyt
  • 如何在 scikit 中加载 CSV 数据并将其用于朴素贝叶斯分类

    尝试加载自定义数据以在 Scikit 中执行 NB 分类 需要帮助将示例数据加载到 Scikit 中 然后执行 NB 如何加载目标的分类值 使用相同的数据进行训练和测试 或使用完整的数据集进行测试 Sl No Member ID Membe

随机推荐

  • 2019年数学建模国赛A题

    前几天中秋节比完了 选的A题 我们学校好多组都选了A题 C题的很少 大家都怕找不到数据 我们组刚开始觉得A B都能做 就是C题可能没有数据无法下手 加上之前做小区道路的时候 用了仿真软件解题 我觉得很不靠谱 我主要是写论文的 然后一起建了数
  • WSUS服务器的详细配置和部署-转载

    WSUS服务器的详细配置和部署 一 WSUS 安装要求1 硬件要求 对于多达 500 个客户端的服务器 建议使用以下硬件 1 GHz 的处理器 1 GB 的 RAM2 软件要求 要使用默认选项安装 WSUS 必须在计算机上安装以下软件 Mi
  • 西瓜+南瓜-task1 模型评估与选择

    题外话 南瓜书是西瓜书公式的进一步深入 机器学习研究什么 对历史经验的归纳总结 预测 比如 早霞不出门晚霞行千里 通过历史累计 经验 预测第二天是晴天还是雨天 此处的 经验 类似于历史数据 通过学习数据 或者训练数据 提前预判 这就是机器学
  • 详细版mongodb下载安装教程----windows版

    一 详细下载过程 1 官网选择需要的版本 Download MongoDB Community Server MongoDB 2 然后得到这个 双击它 3 打开第一个就是这个界面 点next即可 4 第二个界面 点同意 点next 5 点c
  • 世界杯十大巨星

    随着南非世界杯开幕日期一天天临近 近日 英媒 泰晤士报 评选出了世界杯历史上10名最伟大的球星 马拉多纳力压贝利排名榜首 现役球员中 仅罗纳尔多入选并排名第八 一 马拉多纳 在这个地球上 几乎没有球员 可以让其职业生涯 甚至人生 在短短3分
  • 数字万用表的使用

    参考 连3岁小孩子都能看懂的万用表使用方法 地址 https www bilibili com video BV1Gx411z7x2 p 1 vd source cc0e43b449de7e8663ca1f89dd5fea7d 目录 万用表
  • IDEA中使用UT测试过程中的一些小问题

    当查看代码覆盖率结果 快捷键Ctrl Alt F6 当运行测试查看代码覆盖率的时候 出现如下图所示的界面 No coverage results Click Edit to fix configuration settings 解决办法就是
  • 【区块链学习】Merkle Patricia Tree (MPT) 以太坊中的默克尔树

    本篇博文是自己学习mpt的过程 边学边记录 很多原理性内容非自己原创 好的博文将会以链接形式进行共享 一 什么是mpt MPT是以太坊中的merkle改进树 基于基数树 即前缀树改进而来 大大提高了查找效率 二 前缀树 MPT中的P 就是前
  • Linux 中的 cd 命令及示例

    cd命令在Linux 中称为更改目录命令 它用于有效地从当前工作目录移动到系统中的不同目录 Linux 中 cd 命令的语法 光盘 目录 cd directory 在这里 将 directory 替换为您要导航到的目标目录的路径 cd 命令
  • STM32的I/O口的8种工作模式

    转自http www openedv com posts list 21980 htm 浮空 顾名思义就是浮在空中 上面用绳子一拉就上去了 下面用绳子一拉就沉下去了 开漏 就等于输出口接了个NPN三极管 并且只接了e b c极 是开路的 你
  • 机械臂颜色识别案例

    大家好 我就是那个走在路上经常捡到宝的铁熊老师 那么今天捡到了啥好玩的东西呢 一台五自由度机械臂 从天而降出现在我面前 这话说出口 我自己都不信 哪有那么好的运气 其实这是朋友送我玩的 你也想要这台机械臂么 什么 你不要机械臂 你想要那个朋
  • C++ 游戏开发 打地鼠详解 (含.h文件和.cpp文件)

    基于easyx的打地鼠游戏 期末大作业 C语言版本请见 C语言 打地鼠游戏 超级详解 各个函数与算法 设计思路与流程 一 游戏简介 游戏简介 疯狂打地鼠 是一款经典的单机休闲益智类小游戏 调皮的小地鼠们又出来活动了 你需要做的就是将他们砸回
  • 关于Chrome浏览器这点儿事儿(一):基本尝试修改Chrome启动参数实现全屏禁用双指触摸缩放

    最近 刚上任项目boss 接触客户第一个需求便是浏览器需求 需求如下 其中标注红色的需求 是让我花了几十种方式尝试的主要源 自己做过C 知道可以嵌入外壳 有很多种方案 当然了参考了一位仁兄的文章 https www cnblogs com
  • 二进制安装mysql

    下载安装包 下载mysql二进制安装包 yum y install lrzsz numactl wget http mirrors 163 com mysql Downloads MySQL 5 7 mysql test 5 7 38 li
  • error C2676: 二进制“<”:“const _Ty”不定义该运算符或到预定义运算符可接收的类型的转换

    项目场景 C 中写优先级序列 序列内存的是自定义的结构体 在自定义比较方式的时候系统报错 error C2676 二进制 lt const Ty 不定义该运算符或到预定义运算符可接收的类型的转换 with Ty Node 问题描述 prie
  • Javascript使用turndown 将html 转为md

    1 安装turndown npm i turndown 2 使用trundown并保存为md文件 htmlToMarkdown let down new turndown let md down turndown this html let
  • bin、hex、elf、axf文件解析

    冰冻三尺非一日之寒 滴水穿石非一日之功 文章目录 引言 文件分类 1 bin文件 2 hex文件 3 axf文件 4 elf文件 总结 参考资料 深度理解编译过程 参考资料 深度理解编译文件 引言 bin hex elf axf作为嵌入式开
  • python数据可视化07

    1 绘制等高线图 import numpy as np import matplotlib pyplot as plt def calcu elevation x1 y1 h 1 x1 2 x1 5 y1 3 np exp x1 2 y1
  • 每日一题: 扑克牌中的顺子(C++)

    题目描述 从扑克牌中随机抽5张牌 判断是不是一个顺子 即这5张牌是不是连续的 2 10为数字本身 A为1 J为11 Q为12 K为13 而大 小王为 0 可以看成任意数字 A 不能视为 14 示例 1 输入 1 2 3 4 5 输出 Tru
  • Torchserve打包和部署你训练的深度学习模型

    一 Torchserve介绍 Torchserve是Facebooke公司开发的在线深度学习模型部署框架 它可以很方便的部署pytorch的深度学习模型 读者可以访问Github地址获取最新功能和详细说明 官方地址https github