複数の機械学習モデルを実行して推論を実行する必要がある場合は、Model Service Mesh(ModelMesh)を使用して、マルチモデル推論サービスをロールアウトおよび管理できます。 ModelMesh は、KServe ModelMesh に基づいて実装されており、大規模、高密度、頻繁に変更されるモデルのユースケース向けに最適化されています。 ModelMesh は、応答性とコンピューティングのバランスをとるために、モデルをメモリにインテリジェントにロードおよびアンロードします。 これにより、マルチモデル推論サービスのデプロイと O&M が簡素化され、推論の効率とパフォーマンスが向上します。
前提条件
コンテナサービス Kubernetes 版(ACK)クラスターが Service Mesh(ASM)インスタンスに追加されていること、および ASM インスタンスのバージョンが 1.18.0.134 以降であること。
クラスターのイングレス ゲートウェイが作成されます。詳細については、「イングレス ゲートウェイの作成」をご参照ください。
この例では、ASM イングレスゲートウェイがクラスターのゲートウェイとして使用されます。 デフォルトのゲートウェイ名は ingressgateway で、ポート 8008 が有効になっており、HTTP プロトコルが使用されます。
機能
ModelMesh は、次の機能を提供します。
機能 | 説明 |
キャッシュ管理 |
|
インテリジェントな配置とロード |
|
回復力 | モデルのロードが失敗した場合、異なる Pod で自動的に再試行されます。 |
運用の簡素化 | ローリングモデルの更新は自動的かつシームレスに処理されます。 |
手順 1:ASM で ModelMesh 機能を有効にする
ASM コンソール にログインします。 左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、[エコシステム] > [ASM 上の Kserve] を選択します。
[ASM 上の Kserve] ページで、[ASM 上の Kserve を有効にする] をクリックします。
説明KServe は CertManager に依存しており、KServe のインストールでは CertManager コンポーネントが自動的にインストールされます。 セルフビルドの CertManager を使用する場合 は、[クラスターに Certmanager コンポーネントを自動的にインストールする] を無効にします。
KServe を有効にした後、kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続し、次のコマンドを実行して ServingRuntime リソースが使用可能かどうかを確認します。
kubectl get servingruntimes -n modelmesh-serving予期される出力:
NAME DISABLED MODELTYPE CONTAINERS AGE mlserver-1.x sklearn mlserver 1m ovms-1.x openvino_ir ovms 1m torchserve-0.x pytorch-mar torchserve 1m triton-2.x keras triton 1mServingRuntime リソースは、1 つ以上の特定のモデル形式を提供できる Pod のテンプレートを定義します。 デプロイされたモデルのフレームワークに応じて、Pod が自動的にプロビジョニングされます。
次の表に、ModelMesh でサポートされているランタイムとモデル形式を示します。 詳細については、「サポートされているモデル形式」をご参照ください。 これらのモデルサーバーがお客様の特定の要件をすべて満たすことができない場合は、カスタムモデルサービングランタイムを作成できます。 詳細については、「ModelMesh を使用してカスタムモデルサービングランタイムを作成する」をご参照ください。
ServingRuntime
サポートされているモデルフレームワーク
mlserver-1.x
sklearn、xgboost、lightgbm
ovms-1.x
openvino_ir、onnx
torchserve-0.x
pytorch-mar
triton-2.x
tensorflow、pytorch、onnx、tensorrt
手順 2:ASM 環境を構成する
ACK クラスタから ASM インスタンスに modelmesh-serving 名前空間を同期します。詳細については、「データプレーン上の Kubernetes クラスタから ASM インスタンスへの自動サイドカープロキシインジェクションラベルの同期」をご参照ください。同期後、modelmesh-serving 名前空間が存在することを確認します。
イングレスゲートウェイの Istio ゲートウェイを作成します。
次の内容を含む grpc-gateway.yaml ファイルを作成します。
kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスター(または ASM インスタンス)に接続し、次のコマンドを実行して Istio ゲートウェイを作成します。
kubectl apply -f grpc-gateway.yaml
仮想サービスを作成します。
次の内容を含む vs-modelmesh-serving-service.yaml ファイルを作成します。
kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスター(または ASM インスタンス)に接続し、次のコマンドを実行して仮想サービスを作成します。
kubectl apply -f vs-modelmesh-serving-service.yaml
Google Remote Procedure Call(gRPC)-JSON トランスコーダーを構成します。
次の内容を含む grpcjsontranscoder-for-kservepredictv2.yaml ファイルを作成します。
apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMGrpcJsonTranscoder metadata: name: grpcjsontranscoder-for-kservepredictv2 namespace: istio-system spec: builtinProtoDescriptor: kserve_predict_v2 isGateway: true portNumber: 8008 workloadSelector: labels: istio: ingressgatewaykubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスター(または ASM インスタンス)に接続し、次のコマンドを実行して gRPC-JSON トランスコーダーをデプロイします。
kubectl apply -f grpcjsontranscoder-for-kservepredictv2.yaml次の内容を含む grpcjsontranscoder-increasebufferlimit.yaml ファイルを作成し、
per_connection_buffer_limit_bytesパラメーターを設定してレスポンスのサイズを大きくします。kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスター(または ASM インスタンス)に接続し、次のコマンドを実行して Envoy フィルターをデプロイします。
kubectl apply -f grpcjsontranscoder-increasebufferlimit.yaml
手順 3:サンプルモデルをデプロイする
StorageClass を作成します。 詳細については、「動的にプロビジョニングされた NAS ボリュームをマウントする」をご参照ください。
ACK コンソール にログインします。 左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけて名前をクリックします。 左側のペインで、 を選択します。
[storageclasses] ページの右上隅にある [作成] をクリックし、次の図に示すパラメーターを設定して、[作成] をクリックします。

永続ボリュームクレーム(PVC)を作成します。
次の内容を含む my-models-pvc.yaml ファイルを作成します。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-models-pvc namespace: modelmesh-serving spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: alibabacloud-cnfs-nas volumeMode: Filesystemkubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続し、次のコマンドを実行して PVC を作成します。
kubectl apply -f my-models-pvc.yaml次のコマンドを実行して、modelmesh-serving 名前空間の PVC を表示します。
kubectl get pvc -n modelmesh-serving予期される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE my-models-pvc Bound nas-379c32e1-c0ef-43f3-8277-9eb4606b53f8 1Gi RWX alibabacloud-cnfs-nas 2h
PVC にアクセスする Pod を作成します。
新しい PVC を使用するには、Kubernetes Pod にボリュームとしてマウントし、その Pod を使用してモデルファイルを永続ボリュームにアップロードする必要があります。
次の内容を含む pvc-access.yaml ファイルを作成します。
次の YAML ファイルは、pvc-access Pod が作成され、
"my-models-pvc"を指定することで、以前にリクエストされた PVC をクレームするために Kubernetes コントローラーが必要であることを示しています。apiVersion: v1 kind: Pod metadata: name: "pvc-access" spec: containers: - name: main image: ubuntu command: ["/bin/sh", "-ec", "sleep 10000"] volumeMounts: - name: "my-pvc" mountPath: "/mnt/models" volumes: - name: "my-pvc" persistentVolumeClaim: claimName: "my-models-pvc"kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続し、次のコマンドを実行して Pod を作成します。
kubectl apply -n modelmesh-serving -f pvc-access.yamlpvc-access Pod が実行されていることを確認します。
kubectl get pods -n modelmesh-serving | grep pvc-access予期される出力:
pvc-access 1/1 Running 0 51m
永続ボリュームにモデルを保存します。
AI モデルを永続ボリュームに追加します。 この例では、scikit-learn でトレーニングされた MNIST 手書き数字文字認識モデルを使用します。 mnist-svm.joblib モデルファイルのコピーは、kserve/modelmesh-minio-examples リポジトリからダウンロードできます。
kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続し、次のコマンドを実行して mnist-svm.joblib モデルファイルを pvc-access Pod の
/mnt/modelsフォルダーにコピーします。kubectl -n modelmesh-serving cp mnist-svm.joblib pvc-access:/mnt/models/次のコマンドを実行して、モデルが永続ボリュームに存在することを確認します。
kubectl -n modelmesh-serving exec -it pvc-access -- ls -alr /mnt/models/予期される出力:
-rw-r--r-- 1 501 staff 344817 Oct 30 11:23 mnist-svm.joblib
推論サービスをデプロイします。
次の内容を含む sklearn-mnist.yaml ファイルを作成します。
kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続し、次のコマンドを実行して sklearn-mnist 推論サービスをデプロイします。
kubectl apply -f sklearn-mnist.yaml数十秒待って(待ち時間はイメージのプル速度によって異なります)、次のコマンドを実行して sklearn-mnist 推論サービスがデプロイされているかどうかを確認します。
kubectl get isvc -n modelmesh-serving予期される出力:
NAME URL READY sklearn-mnist grpc://modelmesh-serving.modelmesh-serving:8033 True
推論を実行します。
curlコマンドを実行して、sklearn-mnist モデルに推論リクエストを送信します。 データ配列は、分類される数字のイメージスキャンの 64 ピクセルのグレースケール値を示します。MODEL_NAME="sklearn-mnist" ASM_GW_IP="イングレスゲートウェイの IP アドレス" // 翻訳済み curl -X POST -k "http://${ASM_GW_IP}:8008/v2/models/${MODEL_NAME}/infer" -d '{"inputs": [{"name": "predict", "shape": [1, 64], "datatype": "FP32", "contents": {"fp32_contents": [0.0, 0.0, 1.0, 11.0, 14.0, 15.0, 3.0, 0.0, 0.0, 1.0, 13.0, 16.0, 12.0, 16.0, 8.0, 0.0, 0.0, 8.0, 16.0, 4.0, 6.0, 16.0, 5.0, 0.0, 0.0, 5.0, 15.0, 11.0, 13.0, 14.0, 0.0, 0.0, 0.0, 0.0, 2.0, 12.0, 16.0, 13.0, 0.0, 0.0, 0.0, 0.0, 0.0, 13.0, 16.0, 16.0, 6.0, 0.0, 0.0, 0.0, 0.0, 16.0, 16.0, 16.0, 7.0, 0.0, 0.0, 0.0, 0.0, 11.0, 13.0, 12.0, 1.0, 0.0]}}]}'次のコードブロックは、JSON レスポンスを示しています。 スキャンされた数字は
8であると推測できます。{ "modelName": "sklearn-mnist__isvc-3c10c62d34", "outputs": [ { "name": "predict", "datatype": "INT64", "shape": [ "1", "1" ], "contents": { "int64Contents": [ "8" ] } } ] }
関連情報
異なるランタイム環境を必要とする複数のモデルをデプロイする場合、またはモデル推論効率を向上させるかリソース割り当てを制御する必要がある場合は、ModelMesh を使用してカスタムモデルサービングランタイムを作成できます。 カスタムモデルサービングランタイムの微調整された構成により、各モデルが最適な環境で実行されることが保証されます。 詳細については、「ModelMesh を使用してカスタムモデルサービングランタイムを作成する」をご参照ください。
大量の自然言語データを処理する必要がある場合、または複雑な言語理解システムを構築する場合、大規模言語モデル(LLM)を推論サービスとして使用できます。 詳細については、「LLM を推論サービスとして使用する」をご参照ください。
Pod エラーが発生した場合は、「Pod のトラブルシューティング」を参照してトラブルシューティングを行うことができます。