全部產品
Search
文件中心

Container Service for Kubernetes:基於KServe快速部署一個推理服務

更新時間:Jun 19, 2024

本文介紹如何基於KServe快速部署一個推理服務。

索引

前提條件

操作步驟

首先,您需要部署一個帶有預測能力的InferenceService推理服務,該推理服務將使用iris (鳶尾花)資料集訓練的scikit-learn模型。該資料集具有三個輸出類別:Iris Setosa(山鳶尾,索引:0)、Iris Versicolour(雜色鳶尾花,索引:1)和Iris Virginica(維吉尼亞鳶尾,索引:2)。 然後您可以向部署的模型發送推理請求,以便預測對應的鳶尾植物類別。

說明

iris資料集是由三種鳶尾花,各50組資料構成的資料集。每個樣本包含4個特徵,分別為萼片(Sepals)的長和寬、花瓣(Petals)的長和寬。

步驟一:部署InferenceService推理服務

  1. 執行以下命令,建立一個名為sklearn-iris的InferenceService推理服務。

    kubectl apply -f - <<EOF
    apiVersion: "serving.kserve.io/v1beta1"
    kind: "InferenceService"
    metadata:
      name: "sklearn-iris"
    spec:
      predictor:
        model:
          modelFormat:
            name: sklearn
          storageUri: "gs://kfserving-examples/models/sklearn/1.0/model"
    EOF
  2. 執行以下命令,檢查服務狀態。

    kubectl get inferenceservices sklearn-iris

    預期輸出:

    NAME           URL                                                         READY   PREV   LATEST   PREVROLLEDOUTREVISION   LATESTREADYREVISION                    AGE
    sklearn-iris   http://sklearn-iris-predictor-default.default.example.com   True           100                              sklearn-iris-predictor-default-00001   51s

步驟二:訪問服務

不同服務網關,IP地址有所不同,訪問方式也有所不同。請按需選擇。

ALB

  1. 執行以下命令,擷取ALB訪問地址。

    kubectl get albconfig knative-internet                         

    預期輸出:

    NAME               ALBID                    DNSNAME                                              PORT&PROTOCOL   CERTID   AGE
    knative-internet   alb-hvd8nngl0l*******   alb-hvd8nngl0l******.cn-<region>.alb.aliyuncs.com                               2
  2. 執行以下命令,將以下JSON內容寫入 ./iris-input.json檔案中,以準備推理輸入請求。

    cat <<EOF > "./iris-input.json"
    {
      "instances": [
        [6.8,  2.8,  4.8,  1.4],
        [6.0,  3.4,  4.5,  1.6]
      ]
    }
    EOF
  3. 執行以下命令,訪問服務。

    INGRESS_DOMAIN=$(kubectl get albconfig knative-internet -o jsonpath='{.status.loadBalancer.dnsname}')
    SERVICE_HOSTNAME=$(kubectl get inferenceservice sklearn-iris -o jsonpath='{.status.url}' | cut -d "/" -f 3)
    curl -v -H "Host: ${SERVICE_HOSTNAME}" "http://${INGRESS_DOMAIN}/v1/models/sklearn-iris:predict" -d @./iris-input.json

    預期輸出:

    *   Trying 120.77.XX.XX...
    * TCP_NODELAY set
    * Connected to alb-hvd8nngl0l******.cn-<region>.alb.aliyuncs.com (120.77.XX.XX) port 80 (#0)
    > POST /v1/models/sklearn-iris:predict HTTP/1.1
    > Host: sklearn-iris-predictor-default.default.example.com
    > User-Agent: curl/7.58.0
    > Accept: */*
    > Content-Length: 76
    > Content-Type: application/x-www-form-urlencoded
    > 
    * upload completely sent off: 76 out of 76 bytes
    < HTTP/1.1 200 OK
    < Date: Thu, 13 Jul 2023 01:48:44 GMT
    < Content-Type: application/json
    < Content-Length: 21
    < Connection: keep-alive
    < 
    * Connection #0 to host alb-hvd8nngl0l******.cn-<region>.alb.aliyuncs.com left intact
    {"predictions":[1,1]}

    結果返回了兩個預測 {"predictions": [1, 1]},該結果為推理髮送的兩組資料點對應於索引為1的花,模型預測這兩種花都是Iris Versicolour(雜色鳶尾花)。

MSE

  1. 執行以下命令,擷取MSE訪問地址。

    kubectl -n knative-serving get ing stats-ingress

    預期輸出:

    NAME            CLASS                  HOSTS   ADDRESS                         PORTS   AGE
    stats-ingress   knative-ingressclass   *       192.168.XX.XX,47.107.XX.XX      80      15d

    ADDRESS下方的47.107.XX.XX為MSE網關公網地址,後續會使用該地址訪問服務。MSE的公網和內網順序不固定,有時公網排在內網後面,即ADDRESS為47.107.XX.XX,192.168.XX.XX

  2. 執行以下命令,將以下JSON內容寫入 ./iris-input.json檔案中,以準備推理輸入請求。

    cat <<EOF > "./iris-input.json"
    {
      "instances": [
        [6.8,  2.8,  4.8,  1.4],
        [6.0,  3.4,  4.5,  1.6]
      ]
    }
    EOF
  3. 執行以下命令,訪問服務。

    # MSE的公網和內網順序不固定,此處使用公網地址訪問。ingress[1]代表公網排在第二位,ingress[0]代表公網排在第一位,請按照實際情況替換。
    INGRESS_HOST=$(kubectl -n knative-serving get ing stats-ingress -o jsonpath='{.status.loadBalancer.ingress[1].ip}')
    SERVICE_HOSTNAME=$(kubectl get inferenceservice sklearn-iris -o jsonpath='{.status.url}' | cut -d "/" -f 3)
    curl -v -H "Host: ${SERVICE_HOSTNAME}" "http://${INGRESS_HOST}/v1/models/sklearn-iris:predict" -d @./iris-input.json

    預期輸出:

    *   Trying 47.107.XX.XX... # 47.107.XX.XX為MSE網關的公網地址。
    * TCP_NODELAY set
    * Connected to 47.107.XX.XX (47.107.XX.XX) port 80 (#0)
    > POST /v1/models/sklearn-iris:predict HTTP/1.1
    > Host: sklearn-iris-predictor-default.default.example.com
    > User-Agent: curl/7.58.0
    > Accept: */*
    > Content-Length: 76
    > Content-Type: application/x-www-form-urlencoded
    > 
    * upload completely sent off: 76 out of 76 bytes
    < HTTP/1.1 200 OK
    < content-length: 21
    < content-type: application/json
    < date: Tue, 11 Jul 2023 09:56:00 GMT
    < server: istio-envoy
    < req-cost-time: 5
    < req-arrive-time: 1689069360639
    < resp-start-time: 1689069360645
    < x-envoy-upstream-service-time: 4
    < 
    * Connection #0 to host 47.107.XX.XX left intact
    {"predictions":[1,1]}

    結果返回了兩個預測 {"predictions": [1, 1]},該結果為推理髮送的兩組資料點對應於索引為1的花,模型預測這兩種花都是Iris Versicolour(雜色鳶尾花)。

Kourier

  1. 執行以下命令,擷取Kourier服務訪問地址。

    kubectl -n knative-serving get svc kourier

    預期輸出:

    NAME      TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)                      AGE
    kourier   LoadBalancer   192.168.XX.XX   121.40.XX.XX  80:31158/TCP,443:32491/TCP   49m

    服務訪問IP為121.40.XX.XX,連接埠為80(HTTP)和443(HTTPS)。

  2. 執行以下命令,將以下JSON內容寫入 ./iris-input.json檔案中,以準備推理輸入請求。

    cat <<EOF > "./iris-input.json"
    {
      "instances": [
        [6.8,  2.8,  4.8,  1.4],
        [6.0,  3.4,  4.5,  1.6]
      ]
    }
    EOF
  3. 執行以下命令,訪問服務。

    INGRESS_HOST=$(kubectl -n knative-serving get service kourier -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    SERVICE_HOSTNAME=$(kubectl get inferenceservice sklearn-iris -o jsonpath='{.status.url}' | cut -d "/" -f 3)
    curl -v -H "Host: ${SERVICE_HOSTNAME}" "http://${INGRESS_HOST}/v1/models/sklearn-iris:predict" -d @./iris-input.json

    預期輸出:

    *   Trying 121.40.XX.XX...
    * TCP_NODELAY set
    * Connected to 121.40.XX.XX (121.40.XX.XX) port 80 (#0)
    > POST /v1/models/sklearn-iris:predict HTTP/1.1
    > Host: sklearn-iris-predictor-default.default.example.com
    > User-Agent: curl/7.58.0
    > Accept: */*
    > Content-Length: 76
    > Content-Type: application/x-www-form-urlencoded
    > 
    * upload completely sent off: 76 out of 76 bytes
    < HTTP/1.1 200 OK
    < content-length: 21
    < content-type: application/json
    < date: Wed, 12 Jul 2023 08:23:13 GMT
    < server: envoy
    < x-envoy-upstream-service-time: 4
    < 
    * Connection #0 to host 121.40.XX.XX left intact
    {"predictions":[1,1]}

    結果返回了兩個預測 {"predictions": [1, 1]},該結果為推理髮送的兩組資料點對應於索引為1的花,模型預測這兩種花都是Iris Versicolour(雜色鳶尾花)。