すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:KServeに基づくInferenceServiceの迅速なデプロイ

最終更新日:Nov 15, 2024

KServeは、TFServingやTorchServeなどの1つ以上のトレーニング済みモデルをKubernetes CustomResourceDefinitions (CRD) としてモデルサービングランタイムにデプロイすることをサポートしています。 この機能により、モデルの展開と管理が簡単になります。 Knativeに基づく推論サービスを使用してモデルをデプロイすることもできます。 このアプローチでは、1秒あたりのリクエスト数 (RPS) 、同時実行性、CPUおよびGPUメトリックに基づく自動スケーリングが可能です。 さらに、トラフィックがない場合にインスタンスを自動的にゼロにスケールダウンしたり、マルチバージョン管理を簡素化したりするなど、Knative機能を利用できます。

前提条件

Knativeはクラスターにデプロイされています。 詳細については、「Knativeのデプロイ」「」をご参照ください。

手順1: 推論サービスのデプロイ

最初に、Irisデータセットに基づいてトレーニングされたscikit-learnモデルを使用する予測推論サービスを展開する必要があります。 データセットは、3つのIrisタイプ、Iris Setosa (インデックス0) 、Iris Versicolour (インデックス1) 、およびIris Virginica (インデックス2) をカバーしています。 推論リクエストをモデルに送信して、アイリスのタイプを予測できます。

説明

Irisデータセットは、アイリスの各タイプについて50個のサンプルを含む。 各サンプルには、がく片の長さと幅、花びらの長さと幅を含む4つの特徴があります。

  1. 次のコマンドを実行して、sklearn-irisという名前の推論サービスをデプロイします。

    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

手順2: サービスへのアクセス

本サービスの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であることを示します。 これは、両方のサンプルのアイリスがアイリス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ゲートウェイのパブリックIPアドレスで、推論サービスへのアクセスに使用されます。 MSEゲートウェイのパブリックIPアドレスとプライベートIPアドレスがソートされる順序は固定されていません。 場合によっては、パブリックIPアドレスは、プライベートIPアドレス、例えば、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. 次のコマンドを実行して、サービスにアクセスします。

    # The order in which the public and private IP addresses of the MSE gateway are sorted is not fixed. In this example, the public IP address is used to access the inference Service. ingress[1] indicates that the public IP address follows the private IP address and ingress[0] indicates that the private IP address follows the public IP address. Choose one of them based on the actual order of the IP addresses. 
    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 is the public IP address of the MSE gateway. 
    * 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であることを示します。 これは、両方のサンプルのアイリスがアイリスVersicolourであることを意味します。

クーリエ

  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で、サービスポートはHTTP 80およびHTTPS 443です。

  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であることを示します。 これは、両方のサンプルのアイリスがアイリスVersicolourであることを意味します。

関連ドキュメント