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

Container Compute Service:KServe ベースの推論サービスを迅速にデプロイする

最終更新日:Dec 28, 2024

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

前提条件

KServe コンポーネントがインストールされていること。詳細については、KServe コンポーネントをデプロイするを参照してください。

ステップ 1: 推論サービスをデプロイする

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

説明

Iris データセットには、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: Stable Diffusion サービスにアクセスする

サービスの 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 は 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

    47.107.XX.XX は ADDRESS 列にある 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. 次のコマンドを実行して、アプリケーションにアクセスします。

    # MSE ゲートウェイのパブリック IP アドレスとプライベート IP アドレスのソート順序は固定されていません。この例では、パブリック IP アドレスを使用して推論サービスにアクセスします。ingress[1] はパブリック IP アドレスがプライベート IP アドレスの後に続くことを示し、ingress[0] はプライベート IP アドレスがパブリック IP アドレスの後に続くことを示します。IP アドレスの実際の順序に基づいていずれかを選択してください。
    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 ゲートウェイのパブリック IP アドレスです。
    * 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 は 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 で、サービスポートは 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 であることを示しています。つまり、両方のサンプルの Iris は Iris Versicolour です。