部署模型

本教程带领你使用 SimpleMLService,部署模型为推理服务。

教程训练你的第一个模型进行并行训练训练了相同架构的模型,并且都将模型参数保存为文件 model_state_dict.pt。本教程将这两个模型文件中的任意一个部署为推理服务。

准备模型文件

这里我们使用 TorchServe 部署 PyTorch 模型。回到 Notebook mnist,在 HOME 目录(即左侧边栏文件浏览器显示的根目录 /)下新建以下文件:

model.py
import torch
from torch import nn
import torch.nn.functional as F


class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, 3, 1)
        self.conv2 = nn.Conv2d(32, 64, 3, 1)
        self.conv3 = nn.Conv2d(64, 64, 3, 1)
        self.pool = nn.MaxPool2d(2, 2)
        self.dense1 = nn.Linear(576, 64)
        self.dense2 = nn.Linear(64, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = F.relu(self.conv3(x))
        x = torch.flatten(x, 1)
        x = F.relu(self.dense1(x))
        output = F.log_softmax(self.dense2(x), dim=1)
        return output
handler.py
from torchvision import transforms
from ts.torch_handler.image_classifier import ImageClassifier
from torch.profiler import ProfilerActivity


class MNISTDigitClassifier(ImageClassifier):
    image_processing = transforms.Compose(
        [transforms.ToTensor(),
         transforms.Normalize((0.5), (0.5))])

    def __init__(self):
        super().__init__()
        self.profiler_args = {
            "activities": [ProfilerActivity.CPU],
            "record_shapes": True,
        }

    # def postprocess(self, data):
    #     return data.argmax(1).tolist()

点击左上角的 +,然后点击 Other 下的 Terminal 以新建一个终端。

create-terminal

执行以下命令以打包一个 torch 的模型包(model archive):

# 使用 Notebook 中训练的模型
torch-model-archiver --model-name mnist \
  --version 1.0 \
  --model-file model.py \
  --handler handler.py \
  --serialized-file first-model/model_state_dict.pt

# 如果使用 Job 中训练的模型,切换参数
# --serialized-file parallel-training/model_state_dict.pt

部署推理服务

在 TensorStack AI 平台首页,点击Deploy进入模型部署控制台。

landing-page

模型部署控制台的总览页面展示了当前部署服务的数量以及资源使用情况。在左侧的导航菜单中点击部署 > SimpleMLService,点击右上角的 + 弹出创建对话框,然后复制下面的 YAML 配置文件并粘贴到编辑框中,最后点击创建

apiVersion: tensorstack.dev/v1beta1
kind: SimpleMLService
metadata:
  name: mnist
spec:
  replicas: 1
  storage:
    pvc:
      mountPath: /var/lib/t9k/models
      name: mnist
      subPath: .
  pytorch:
    image: pytorch/torchserve:0.9.0-cpu
    modelsFlag: "mnist=mnist.mar"
    resources: 
      requests:
        cpu: 1
        memory: 1Gi
create-simplemlservice

在跳转回到 SimpleMLService 管理页面之后,等待刚才创建的 SimpleMLService 准备就绪。

  • 第一次拉取镜像可能会花费较长的时间,具体取决于集群的网络状况。
  • 点击右上角的刷新按钮以手动刷新 SimpleMLService 状态。

使用推理服务

查看推理服务地址

在 SimpleMLService 就绪之后,点击其名称进入详情页面。

enter-simplemlservice

页面中展示的 DNS 即为推理服务地址,注意该地址只能从集群内部访问。

simplemlservice-detail

访问推理服务

回到 Notebook mnist,在终端中执行以下命令以下载测试数据,并向推理服务发送请求。注意变量 URL 的值需要修改为实际部署的推理服务的地址。

# 下载测试图像文件
wget https://t9k.github.io/user-manuals/latest/assets/get-started/deployment/{0,1,2}.png

# 注意:此 URL 只适合在集群内当前项目(Project)内部(例如当前项目的 Notebook 中)访问使用
URL="http://mnist.demo.svc.cluster.local/v1/models/mnist:predict"
curl -T 0.png $URL    # 或使用 `1.png`, `2.png`

响应体应是一个类似于下面的 JSON,其预测了图片最有可能是的 5 个数字以及相应的概率:

{
  "0": 1.0,
  "2": 1.7797361302828807e-16,
  "9": 6.094195260341553e-19,
  "6": 1.5410183526346253e-19,
  "5": 7.889719768364669e-20
}

清理

体验结束后,可将当前教程产生的所有文件移动到名为 deployment 的新文件夹下。

也可以将部署的推理服务删除:

# optional, delete service if desired.
kubectl delete SimpleMLService mnist

下一步