用PyTorch部署模型
off999 2024-11-25 15:54 24 浏览 0 评论
作者:Francesco Zuppichini
编译:ronghuaiyang
导读
演示了使用PyTorch最近发布的新工具torchserve来进行PyTorch模型的部署。
最近,PyTorch推出了名为torchserve.的新生产框架来为模型提供服务。我们看一下今天的roadmap:
1、使用Docker安装
2、导出模型
3、定义handler
4、保存模型
为了展示torchserve,我们将提供一个经过全面训练的ResNet34进行图像分类的服务。
使用Docker安装
官方文档:https://github.com/pytorch/serve/blob/master/README.md##install-torchserve
安装torchserve最好的方法是使用docker。你只需要把镜像拉下来。
可以使用以下命令保存最新的镜像。
docker pull pytorch/torchserve:latest所有可用的tags:https://hub.docker.com/r/pytorch/torchserve/tags
关于docker和torchserve的更多信息:https://github.com/pytorch/serve#quick-start-with-docker
Handlers
官方文档:https://github.com/pytorch/serve/blob/master/docs/custom_service.md
处理程序负责使用模型对一个或多个HTTP请求进行预测。
默认 handlers
Torchserve支持以下默认 handlers
- image_classifier
- object_detector
- text_classifier
- image_segmenter
但是请记住,它们都不支持batching请求!
自定义 handlers
torchserve提供了一个丰富的接口,可以做几乎所有你想做的事情。一个Handler是一个必须有三个函数的类。
- preprocess
- inference
- postprocess
你可以创建你自己的类或者子类BaseHandler。子类化BaseHandler 的主要优点是可以在self.model上访问加载的模型。下面的代码片段展示了如何子类化BaseHandler。
回到图像分类的例子。我们需要
- 从每个请求中获取图像并对其进行预处理
- 从模型中得到预测
- 发送回一个响应
预处理
.preprocess函数接受请求数组。假设我们正在向服务器发送一个图像,可以从请求的data或body字段访问序列化的图像。因此,我们可以遍历所有请求并单独预处理每个图像。完整的代码如下所示。
self.transform是我们的预处理变换,没什么花哨的。对于在ImageNet上训练的模型来说,这是一个经典的预处理步骤。
在我们对每个请求中的每个图像进行预处理之后,我们将它们连接起来创建一个pytorch张量。
推理
这一步很简单,我们从 .preprocess得到张量。然后对每幅图像提取预测结果。
后处理
现在我们有了对每个图像的预测,我们需要向客户返回一些内容。Torchserve总是返回一个数组。BaseHandler也会自动打开一个.json 文件带有index -> label的映射(稍后我们将看到如何提供这样的文件),并将其存储self.mapping中。我们可以为每个预测返回一个字典数组,其中包含label和index 的类别。
把所有的东西打包到一起,我们的handler是这样的:
因为所有的处理逻辑都封装在一个类中,所以你可以轻松地对它进行单元测试!
导出你的模型
官方文档:https://github.com/pytorch/serve/tree/master/model-archiver#creating-a-model-archive
Torchserve 需要提供一个.mar文件,简而言之,该文件只是把你的模型和所有依赖打包在一起。要进行打包,首先需要导出经过训练的模型。
导出模型
有三种方法可以导出torchserve的模型。到目前为止,我发现的最好的方法是trace模型并存储结果。这样我们就不需要向torchserve添加任何额外的文件。
让我们来看一个例子,我们将部署一个经过充分训练的ResNet34模型。
按照顺序,我们:
- 加载模型
- 创建一个dummy输入
- 使用torch.jit.trace来trace模型的输入
- 保存模型
创建 .mar 文件
官方文档:https://github.com/pytorch/serve/blob/master/model-archiver/README.md
你需要安装torch-model-archiver
git clone https://github.com/pytorch/serve.git
cd serve/model-archiver
pip install .然后,我们准备好通过使用下面的命令来创建.mar文件。
torch-model-archiver --model-name resnet34 \--version 1.0 \--serialized-file resnet34.pt \--extra-files ./index_to_name.json,./MyHandler.py \--handler my_handler.py \--export-path model-store -f按照顺序。变量--model-name定义了模型的最终名称。这是非常重要的,因为它将是endpoint的名称空间,负责进行预测。你还可以指定一个--version。--serialized-file指向我们之前创建的存储的 .pt模型。--handler 是一个python文件,我们在其中调用我们的自定义handler。一般来说,是这样的:
它暴露了一个handle函数,我们从该函数调用自定义handler中的方法。你可以使用默认名称来使用默认handler(例如,--handler image_classifier)。
在--extra-files中,你需要将路径传递给你的handlers正在使用的所有文件。在本例中,我们必须向.json文件中添加路径。使用所有人类可读标签名称,并在MyHandler.py 中定义每个类别。
如果你传递一个index_to_name.json文件,它将自动加载到handler ,并通过self.mapping访问。
--export-path就是 .mar存放的地方,我还添加了-f来覆盖原有的文件。
如果一切顺利的话,你可以看到resnet34.mar存放在./model-store路径中。
用模型进行服务
这是一个简单的步骤,我们可以运行带有所有必需参数的torchserve docker容器。
docker run --rm -it \-p 3000:8080 -p 3001:8081 \-v $(pwd)/model-store:/home/model-server/model-store pytorch/torchserve:0.1-cpu \torchserve --start --model-store model-store --models resnet34=resnet34.mar我将容器端口8080和8081分别绑定到3000和3001(8080/8081已经在我的机器中使用)。然后,我从./model-store 创建一个volume。最后,我通过padding model-store并通过key-value列表的方式指定模型的名称来调用torchserve。
这里,torchserve有一个endpoint /predictions/resnet34,我们可以通过发送图像来预测。这可以使用curl来实现。
curl -X POST http://127.0.0.1:3000/predictions/resnet34 -T inputs/kitten.jpg回复:
{
"label": "tiger_cat",
"index": 282
}工作正常!
总结
- 使用docker安装torchserve
- 默认以及自定义handlers
- 模型打包生成
- 使用docker提供模型服务
英文原文:https://towardsdatascience.com/deploy-models-and-create-custom-handlers-in-torchserve-fc2d048fbe91
相关推荐
- 苹果手机怎么设置定时关机(苹果手机怎么设置定时关机重启)
-
苹果手机可以设置定时关机,但无法设置定时开机。具体操作步骤如下:进入苹果手机自带的时钟。点击屏幕有下角的计时器。点击画面中间的计时结束启用选项。选择画面最下方的“停止播放”。之后再点击画面右上角的设定...
- 无线网wifi密码忘记了怎么办
-
忘记wifi密码后,可以在路由器后台查看。1.在浏览器的地址栏中,输入路由器上的管理地址,进入后台界面;2.在后台界面里,找到“无线设置”选项,点击它;3.在新界面里,点击wifi密码右侧的小眼睛图标...
-
- win7系统无法正常开机怎么办
-
解决方法如下1,出现无法启动的原因,要注意是开机启动不了,还是在进度条那里缓冲,过不去.如果是开机启动不了,那就要看一下内存条、电源等有没有问题?如果是在进度条那里,那就看下方的三种方法。2,第一种方法:1,开机按F8键.2,选择最近一次的...
-
2025-11-16 07:51 off999
- 现在装win7还需要激活吗(现在安装win7旗舰版还需密钥吗)
-
要激活 Windows7如果是预装在计算机中的,买来之后便不用激活,这里预装指的是在厂商那里。正版的Windows7安装到计算机中,有三十天的试用期,若要永久使用,就要使...
- 2025显卡性能排行榜天梯图(2020年显卡性能天梯图)
-
MacBookPro的显卡水平处于笔记本独立显卡Nvidia920M和940M之间。属于低端显卡级,玩玩LOL啥的还可以,其他的大型游戏就算了,MAC不适合打游戏。MacBookPro搭载的8代...
- 网络对时服务器(对时服务器端口)
-
对等网是指在网络中所有计算机的地位都是平等的,既是服务器也是客户机,所有计算机中安装的都是相同的单机操作系统如Windows98/XP/Vista/7等,它可以设置共享资源,但受连接数限制,一般是只允...
- 如何强制删除u盘文件(强制删除u盘内容)
-
1、电脑上下载安装安全杀毒类软件。2、使用强力卸载。3、找到U盘上需要卸载的文件,右击强力卸载可以卸载顽固型文件。4、被暂用的文件也删除不了可以退出U盘重启电脑重新开机插入U盘进行删除。5、不能删除的...
- directx官方下载win7(directx download)
-
点开始-----运行,输入dxdiag,回车后打开“DirectX诊断工具”窗口,进入“显示”选项卡,看一下是否启用了加速,没有的话,单击下面的“DirectX功能”项中的“启用”按钮,这样便打开了D...
- u盘视频无法播放怎么办(u盘上视频没办法播放)
-
解决办法:1.检查U盘存储格式是否为FAT32,如果不是,请将其格式化为FAT32; 2.检查U盘中视频文件是否损坏,如果有损坏文件,请尝试重新复制一份; 3.检查U盘中存储...
-
- 笔记本电脑无法正常启动怎么修复
-
1.可以解决。2.Windows未能启动可能是由于系统文件损坏、硬件故障或病毒感染等原因引起的。解决方法可以尝试使用Windows安全模式启动、修复启动、还原系统、重装系统等方法。3.如果以上方法都无法解决问题,可以考虑联系专业的电脑...
-
2025-11-16 04:03 off999
- 联想设置u盘为第一启动项(联想怎么设置u盘启动为第一启动项)
-
联想电脑设置u盘为第一启动项方法如下一、将电脑开机,开机瞬间按F2键进入bios设置界面二、在上面5个选项里找到boot选项,这里按键盘上左右键来移动三、这里利用键盘上下键选到USB选项,然后按F5/...
-
- 家用路由器哪个牌子最好信号最稳定
-
TP-LINK最好,信号最稳定。路由器是连接两个或多个网络的硬件设备,在网络间起网关的作用,是读取每一个数据包中的地址然后决定如何传送的专用智能性的网络设备。它能够理解不同的协议,例如某个局域网使用的以太网协议,因特网使用的TCP/IP协议...
-
2025-11-16 03:03 off999
- 安卓纯净版系统(安卓的纯净模式)
-
安卓系统有纯净模式的,安卓系统必须有纯净模式的,刷入纯净版系统可以去除一些预装的应用和系统自带软件,提高手机的运行速度和使用体验。但需要注意的是刷机有一定风险,请确保你已经备份好手机数据并了解安装风险...
- deepin系统怎么安装软件(deepin操作系统怎么安装软件)
-
deepin是一个基于Linux的操作系统,它默认不支持APK应用。要在deepin上安装APK应用,需要先安装一个Android模拟器,例如Anbox,然后从GooglePlayStore或其他...
-
- 下载app安装包(下载app安装包损坏)
-
1,没有刷机过的,可以在手机里面,找到系统自带的文件管理-(如图),2,点开后,可以直接看到文件分类,找到,安装包,点开,(如下图)3,即可看到手机里面的未安装APP;操作方法01如果是直接在浏览器上下载的软件,那就直接点开浏览器,然后点击...
-
2025-11-16 01:51 off999
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
