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模型。
使用以下內容,建立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
執行以下命令,部署InferenceService。
kubectl apply -f transformer-new.yaml
步驟三:運行預測
確認請求輸入的負載值。
將以下圖片檔案的內容進行base64編碼,並儲存為如下input.json檔案。
{ "instances":[ { "image":{ "b64": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAAAw0lEQVR4nGNgGFggVVj4/y8Q2GOR83n+58/fP0DwcSqmpNN7oOTJw6f+/H2pjUU2JCSEk0EWqN0cl828e/FIxvz9/9cCh1zS5z9/G9mwyzl/+PNnKQ45nyNAr9ThMHQ/UG4tDofuB4bQIhz6fIBenMWJQ+7Vn7+zeLCbKXv6z59NOPQVgsIcW4QA9YFi6wNQLrKwsBebW/68DJ388Nun5XFocrqvIFH59+XhBAxThTfeB0r+vP/QHbuDCgr2JmOXoSsAAKK7bU3vISS4AAAAAElFTkSuQmCC" } } ] }
通過ASM網關訪問模型服務。
執行以下命令,擷取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
執行以下命令,訪問模型服務。
關於如何擷取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]}%
預期輸出表明訪問模型服務成功。