使用InferenceService部署Transformer服务

Transformer是InferenceService的一个组件,用于前置预处理、后置处理和模型推理。使用REST协议与Transformer服务进行交互,可以方便地将原始输入数据转换为模型服务器所需的格式,并实现端到端的数据处理和模型推理流程。

前提条件

当前环境可以正常运行基本的推理服务。具体操作,请参见ASM集成KServe实现云原生AI模型推理服务

说明

不同的KServe版本可能对输入的数据格式要求不同。本示例使用KServe 0.10版本。更多信息,请参见Deploy Transformer with InferenceService

步骤一:构建Transformer Docker镜像

  • 方式一:在KServe的github目录下,使用kserve/python下的Dockerfile构建Transformer镜像。

    cd python
    docker build -t <your-registry-url>/image-transformer:latest -f custom_transformer.Dockerfile .
    
    docker push <your-registry-url>/image-transformer:latest
  • 方式二:使用已构建好的镜像。

     asm-registry.cn-hangzhou.cr.aliyuncs.com/asm/kserve-image-custom-transformer:0.10

步骤二:使用REST Predictor部署InferenceService

InferenceService默认用于为PyTorch模型提供TorchServe服务,并可以从云存储的模型存储库中加载模型。本示例模型存储库中包含一个MNIST模型。

  1. 使用以下内容,创建transformer-new.yaml文件。

    apiVersion: serving.kserve.io/v1beta1
    kind: InferenceService
    metadata:
      name: torch-transformer
    spec:
      predictor:
        model:
          modelFormat:
            name: pytorch
          storageUri: gs://kfserving-examples/models/torchserve/image_classifier/v1
      transformer:
        containers:
          - image: asm-registry.cn-hangzhou.cr.aliyuncs.com/asm/kserve-image-custom-transformer:0.10
            name: kserve-container
            command:
              - "python"
              - "-m"
              - "model"
            args:
              - --model_name
              - mnist
  2. 执行以下命令,部署InferenceService。

    kubectl apply -f transformer-new.yaml

步骤三:运行预测

  1. 确认请求输入的负载值。

    将以下图片文件的内容进行base64编码,并保存为如下input.json文件。

    image.png

    {
        "instances":[
           {
              "image":{
                "b64": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAAAw0lEQVR4nGNgGFggVVj4/y8Q2GOR83n+58/fP0DwcSqmpNN7oOTJw6f+/H2pjUU2JCSEk0EWqN0cl828e/FIxvz9/9cCh1zS5z9/G9mwyzl/+PNnKQ45nyNAr9ThMHQ/UG4tDofuB4bQIhz6fIBenMWJQ+7Vn7+zeLCbKXv6z59NOPQVgsIcW4QA9YFi6wNQLrKwsBebW/68DJ388Nun5XFocrqvIFH59+XhBAxThTfeB0r+vP/QHbuDCgr2JmOXoSsAAKK7bU3vISS4AAAAAElFTkSuQmCC"
              }
           }
        ]
    }
  2. 通过ASM网关访问模型服务。

    1. 执行以下命令,获取SERVICE_HOSTNAME。

      SERVICE_NAME=torchserve-transformer
      SERVICE_HOSTNAME=$(kubectl get inferenceservice $SERVICE_NAME -o jsonpath='{.status.url}' | cut -d "/" -f 3)
      echo $SERVICE_HOSTNAME

      预期输出:

      torchserve-transformer.default.example.com
    2. 执行以下命令,访问模型服务。

      关于如何获取ASM网关地址,请参见获取入口网关地址

      MODEL_NAME=mnist
      INPUT_PATH=@./input.json
      ASM_GATEWAY="XXXX" # 请将XXXX替换为ASM网关地址。
      curl -v -H "Host: ${SERVICE_HOSTNAME}" -d $INPUT_PATH http://${ASM_GATEWAY}/v1/models/$MODEL_NAME:predict
      

      预期输出:

      > POST /v1/models/mnist:predict HTTP/1.1
      > Host: torchserve-transformer.default.example.com
      > User-Agent: curl/7.79.1
      > Accept: */*
      > Content-Length: 427
      > Content-Type: application/x-www-form-urlencoded
      > 
      * Mark bundle as not supporting multiuse
      < HTTP/1.1 200 OK
      < content-length: 19
      < content-type: application/json
      < date: Mon, 13 Nov 2023 05:53:15 GMT
      < server: istio-envoy
      < x-envoy-upstream-service-time: 119
      < 
      * Connection #0 to host xxxx left intact
      {"predictions":[2]}%                           

      预期输出表明访问模型服务成功。