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つの特徴があります。
次のコマンドを実行して、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: サービスへのアクセス
本サービスの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であることを示します。 これは、両方のサンプルのアイリスがアイリス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 15d
[ADDRESS] 列の
47.107.XX.XX
は、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
次のコマンドを実行して、サービスにアクセスします。
# 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であることを意味します。
クーリエ
次のコマンドを実行して、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であることを示します。 これは、両方のサンプルのアイリスがアイリスVersicolourであることを意味します。
関連ドキュメント
KnativeでのAI推論サービスのデプロイに関する推奨設定については、「KnativeでのAI推論サービスのデプロイのベストプラクティス」をご参照ください。
ACK Knativeは、Stable Diffusionのアプリケーションテンプレートを提供します。 詳細については、「Knativeに基づく安定した拡散サービスのデプロイ」をご参照ください。