无话不谈|用PyTorch部署模型

作者:Francesco Zuppichini
编译:ronghuaiyang
导读演示了使用PyTorch最近发布的新工具torchserve来进行PyTorch模型的部署 。
无话不谈|用PyTorch部署模型最近 , PyTorch推出了名为torchserve.的新生产框架来为模型提供服务 。 我们看一下今天的roadmap:
1、使用docker安装
2、导出模型
3、定义handler
【无话不谈|用PyTorch部署模型】4、保存模型
为了展示torchserve , 我们将提供一个经过全面训练的ResNet34进行图像分类的服务 。
使用Docker安装官方文档:https://github.com/pytorch/serve/blob/master/README.md##install-torchserve
安装torchserve最好的方法是使用docker 。 你只需要把镜像拉下来 。
可以使用以下命令保存最新的镜像 。
docker pull pytorch/torchserve:latest所有可用的tags:
关于docker和torchserve的更多信息:https://github.com/pytorch/serve#quick-start-with-docker
Handlers官方文档:
处理程序负责使用模型对一个或多个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 。
无话不谈|用PyTorch部署模型子类化BaseHandler以创建自己的handler
回到图像分类的例子 。 我们需要
  • 从每个请求中获取图像并对其进行预处理
  • 从模型中得到预测
  • 发送回一个响应
预处理
.preprocess函数接受请求数组 。 假设我们正在向服务器发送一个图像 , 可以从请求的data或body字段访问序列化的图像 。 因此 , 我们可以遍历所有请求并单独预处理每个图像 。 完整的代码如下所示 。
无话不谈|用PyTorch部署模型预处理每个请求中的每个图像
self.transform是我们的预处理变换 , 没什么花哨的 。 对于在ImageNet上训练的模型来说 , 这是一个经典的预处理步骤 。
无话不谈|用PyTorch部署模型我们的transform
在我们对每个请求中的每个图像进行预处理之后 , 我们将它们连接起来创建一个pytorch张量 。
推理
无话不谈|用PyTorch部署模型在模型上进行推理
这一步很简单 , 我们从 .preprocess得到张量 。 然后对每幅图像提取预测结果 。
后处理
现在我们有了对每个图像的预测 , 我们需要向客户返回一些内容 。 Torchserve总是返回一个数组 。 BaseHandler也会自动打开一个.json 文件带有index -> label的映射(稍后我们将看到如何提供这样的文件) , 并将其存储self.mapping中 。 我们可以为每个预测返回一个字典数组 , 其中包含label和index 的类别 。


推荐阅读