创建在线服务

1. 数据准备:在创建在线服务之前,请确保已经准备好可用的模型、推理脚本、镜像等供新建服务使用。

还没准备好?请看这里:

模型管理-我的模型上传

训练管理-保存模型

算法开发-上传算法

训练管理-镜像管理

2. 点击左上角「创建在线服务」按钮,在弹出「创建在线服务」窗口中写入信息。

图 1 创建在线服务
图 1 创建在线服务
  1. 用户可自定义在线服务名称,仅支持字母、数字、汉字、英文横杠和下划线、字符长度不能超出 32,在线服务名称不可重复( ID 为自动递增)。
  2. 服务类型,可选「HTTP」或「GRPC」模式。
  3. 描述(可选),字符长度不能超出 200。
  4. 模型类型,可选「我的模型」或「预训练模型」。
  5. 节点类型,可选「CPU」或「GPU」类型。
  6. 模型,此下拉框的内容会根据选用的模型类型变化。
  7. 自定义推理脚本,开启该选项将会使用自定义推理脚本进行推理。
  8. 镜像选择,部署在线服务所需的镜像。
  9. 节点规格,此下拉框的内容会根据选用的节点类型变化。
  10. 灰度发布分流(%),单版本默认 100%,多版本可根据适用场景调配百分比(%),整体满足 100% 即可。
  11. 节点数量,默认为 1,多版本可根据适用场景调配节点数,整体配置最大值不超出 10 节点即可。
  12. 支持并不仅限以下五种运行参数:
    signature_nameTensorflow模型推理,默认为 serving_default;
    reshape_size,图片预处理形状 「H, W」,默认为 ImageNet图片大小;
    prepare_mode ,Keras/Tensoflow 模型预处理模式,可选 tfhub、caffe、tf、torch,默认为 tfhub;
    model_structure ,Pytorch 模型保存网络名称,默认为 model;
    job_name,Oneflow 模型推理 job 名称,默认为 inference。

3. 点击自定义推理脚本按钮,选择或点击“这里”上传推理脚本,进入上传页面。推理脚本模板如下:

"""
Copyright 2020 Tianshu AI Platform. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""
import os
import io
import torch
import torch.nn.functional as functional
from PIL import Image
from torchvision import transforms
from imagenet1000_clsidx_to_labels import clsidx_2_labels
from logger import Logger
log = Logger().logger
# 只能定义一个class
class CommonInferenceService:
# 请在__init__初始化方法中接收args参数,并加载模型(其中模型路径参数为args.model_path,是否使用gpu参数为args.use_gpu,模型加载方法用户可自定义)
def __init__(self, args):
self.args = args
self.model = self.load_model()
def load_data(self, data_path):
image = open(data_path, 'rb').read()
image = Image.open(io.BytesIO(image))
if image.mode != 'RGB':
image = image.convert("RGB")
image = transforms.Resize((self.args.reshape_size[0], self.args.reshape_size[1]))(image)
image = transforms.ToTensor()(image)
image = transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])(image)
image = image[None]
if self.args.use_gpu:
image = image.cuda()
return image
def load_model(self):
if os.path.isfile(self.args.model_path):
self.checkpoint = torch.load(self.args.model_path)
else:
for file in os.listdir(self.args.model_path):
self.checkpoint = torch.load(self.args.model_path + file)
model = self.checkpoint["model"]
model.load_state_dict(self.checkpoint['state_dict'])
for parameter in model.parameters():
parameter.requires_grad = False
if self.args.use_gpu:
model.cuda()
model.eval()
return model
# inference方法名称固定
def inference(self, data):
result = {"data_name": data['data_name']}
log.info("===============> start load " + data['data_name'] + " <===============")
data = self.load_data(data['data_path'])
preds = functional.softmax(self.model(data), dim=1)
predictions = torch.topk(preds.data, k=5, dim=1)
result['predictions'] = list()
for prob, label in zip(predictions[0][0], predictions[1][0]):
predictions = {"label": clsidx_2_labels[int(label)], "probability": "{:.3f}".format(float(prob))}
result['predictions'].append(predictions)
return result
# 非必须,可用于本地调试
if __name__=="__main__":
import argparse
parser = argparse.ArgumentParser(description='dubhe serving')
parser.add_argument('--model_path', type=str, default='./res4serving.pth', help="model path")
parser.add_argument('--use_gpu', type=bool, default=True, help="use gpu or not")
parser.add_argument('--reshape_size', type=list, default=[224,224], help="use gpu or not")
args = parser.parse_args()
server = CommonInferenceService(args)
image_path = "./cat.jpg"
image = {"data_name": "cat.jpg", "data_path": image_path}
re = server.inference(image)
print(re)
note

使用自定义脚本时,需要符合模板中注释的规则。

4. 数据输入完毕后点击提交,将跳转至在线服务列表页面且该条新建任务状态变为部署中。

图 2 创建在线服务成功
图 2 创建在线服务成功
note

服务状态转变为运行中说明容器已启动成功,但模型加载需要一定时间,因此部署完成的模型需一段时间后才能成功预测,请耐心等待。

注: 出现运行失败可能的原因如下:

  1. 新建/编辑/fork时,CPU/GPU配置的节点数或规格资源不足。
  2. 新建/编辑/fork时,参数配置、模型错误。
  3. 新建/编辑/fork时,模型与推理脚本不匹配。
  4. 新建/编辑/fork时,镜像错误。
Last updated on