用PyTorch部署模型

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”python


做者:Francesco Zuppichinigit

编译:ronghuaiyang
github

导读

演示了使用PyTorch最近发布的新工具torchserve来进行PyTorch模型的部署。web


最近,PyTorch推出了名为torchserve.的新生产框架来为模型提供服务。咱们看一下今天的roadmap:docker

一、使用Docker安装json

二、导出模型数组

三、定义handler服务器

四、保存模型微信

为了展现torchserve,咱们将提供一个通过全面训练的ResNet34进行图像分类的服务。app

使用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

  1. image_classifier
  2. object_detector
  3. text_classifier
  4. image_segmenter

可是请记住,它们都不支持batching请求!

自定义 handlers

torchserve提供了一个丰富的接口,能够作几乎全部你想作的事情。一个Handler是一个必须有三个函数的类。

  • preprocess
  • inference
  • postprocess

你能够建立你本身的类或者子类BaseHandler。子类化BaseHandler 的主要优势是能够在self.model上访问加载的模型。下面的代码片断展现了如何子类化BaseHandler

子类化BaseHandler以建立本身的handler

回到图像分类的例子。咱们须要

  • 从每一个请求中获取图像并对其进行预处理
  • 从模型中获得预测
  • 发送回一个响应

预处理

.preprocess函数接受请求数组。假设咱们正在向服务器发送一个图像,能够从请求的databody字段访问序列化的图像。所以,咱们能够遍历全部请求并单独预处理每一个图像。完整的代码以下所示。

预处理每一个请求中的每一个图像

self.transform是咱们的预处理变换,没什么花哨的。对于在ImageNet上训练的模型来讲,这是一个经典的预处理步骤。

咱们的transform

在咱们对每一个请求中的每一个图像进行预处理以后,咱们将它们链接起来建立一个pytorch张量。

推理

在模型上进行推理

这一步很简单,咱们从 .preprocess获得张量。而后对每幅图像提取预测结果。

后处理

如今咱们有了对每一个图像的预测,咱们须要向客户返回一些内容。Torchserve老是返回一个数组BaseHandler也会自动打开一个.json 文件带有index -> label的映射(稍后咱们将看到如何提供这样的文件),并将其存储self.mapping中。咱们能够为每一个预测返回一个字典数组,其中包含labelindex 的类别。

把全部的东西打包到一块儿,咱们的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。通常来讲,是这样的:

my_handler.py

它暴露了一个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

kitten.jpg

回复:

{
  "label""tiger_cat",
  "index"282
}

工做正常!

总结

  • 使用docker安装torchserve
  • 默认以及自定义handlers
  • 模型打包生成
  • 使用docker提供模型服务


END

英文原文:https://towardsdatascience.com/deploy-models-and-create-custom-handlers-in-torchserve-fc2d048fbe91

请长按或扫描二维码关注本公众号

喜欢的话,请给我个好看吧


本文分享自微信公众号 - AI公园(AI_Paradise)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索