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 つの特徴があります。
次のコマンドを実行して、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次のコマンドを実行して、サービスのステータスをクエリします。
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
次のコマンドを実行して、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次のコマンドを実行して、次の 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次のコマンドを実行して、アプリケーションにアクセスします。
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
次のコマンドを実行して、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 15d47.107.XX.XXは ADDRESS 列にある MSE ゲートウェイのパブリック IP アドレスで、推論サービスへのアクセスに使用されます。MSE ゲートウェイのパブリック IP アドレスとプライベート IP アドレスのソート順序は固定されていません。場合によっては、パブリック IP アドレスがプライベート IP アドレスの後に続くことがあります(例:47.107.XX.XX,192.168.XX.XX)。次のコマンドを実行して、次の 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次のコマンドを実行して、アプリケーションにアクセスします。
# 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
次のコマンドを実行して、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 です。次のコマンドを実行して、次の 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次のコマンドを実行して、アプリケーションにアクセスします。
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 です。