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

Alibaba Cloud Service Mesh:Model Service Mesh を使用してマルチモデル推論サービスをロールアウトする

最終更新日:Jan 13, 2025

複数の機械学習モデルを実行して推論を実行する必要がある場合は、Model Service Mesh(ModelMesh)を使用して、マルチモデル推論サービスをロールアウトおよび管理できます。 ModelMesh は、KServe ModelMesh に基づいて実装されており、大規模、高密度、頻繁に変更されるモデルのユースケース向けに最適化されています。 ModelMesh は、応答性とコンピューティングのバランスをとるために、モデルをメモリにインテリジェントにロードおよびアンロードします。 これにより、マルチモデル推論サービスのデプロイと O&M が簡素化され、推論の効率とパフォーマンスが向上します。

前提条件

説明

この例では、ASM イングレスゲートウェイがクラスターのゲートウェイとして使用されます。 デフォルトのゲートウェイ名は ingressgateway で、ポート 8008 が有効になっており、HTTP プロトコルが使用されます。

機能

ModelMesh は、次の機能を提供します。

機能

説明

キャッシュ管理

  • Pod は、使用頻度とアクセスの最新性に基づいて自動的に最適化および管理されます。

  • モデルのコピーは、使用頻度と現在のリクエスト量に基づいてロードおよびアンロードされます。

インテリジェントな配置とロード

  • モデルの配置は、Pod 全体のキャッシュの経過時間とリクエスト負荷の両方によってバランスが取られます。

  • キューを使用して同時モデルロードを処理し、ランタイムトラフィックへの影響を最小限に抑えます。

回復力

モデルのロードが失敗した場合、異なる Pod で自動的に再試行されます。

運用の簡素化

ローリングモデルの更新は自動的かつシームレスに処理されます。

手順 1:ASM で ModelMesh 機能を有効にする

  1. ASM コンソール にログインします。 左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、[エコシステム] > [ASM 上の Kserve] を選択します。

  3. [ASM 上の Kserve] ページで、[ASM 上の Kserve を有効にする] をクリックします。

    説明

    KServe は CertManager に依存しており、KServe のインストールでは CertManager コンポーネントが自動的にインストールされます。 セルフビルドの CertManager を使用する場合 は、[クラスターに Certmanager コンポーネントを自動的にインストールする] を無効にします。

  4. 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       1m

    ServingRuntime リソースは、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 環境を構成する

  1. ACK クラスタから ASM インスタンスに modelmesh-serving 名前空間を同期します。詳細については、「データプレーン上の Kubernetes クラスタから ASM インスタンスへの自動サイドカープロキシインジェクションラベルの同期」をご参照ください。同期後、modelmesh-serving 名前空間が存在することを確認します。

  2. イングレスゲートウェイの Istio ゲートウェイを作成します。

    1. 次の内容を含む grpc-gateway.yaml ファイルを作成します。

      grpc-gateway.yaml ファイルを表示

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: grpc-gateway
        namespace: modelmesh-serving
      spec:
        selector:
          istio: ingressgateway
        servers:
          - hosts:
              - '*'
            port:
              name: grpc
              number: 8008
              protocol: GRPC
      
    2. kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスター(または ASM インスタンス)に接続し、次のコマンドを実行して Istio ゲートウェイを作成します。

      kubectl apply -f grpc-gateway.yaml
  3. 仮想サービスを作成します。

    1. 次の内容を含む vs-modelmesh-serving-service.yaml ファイルを作成します。

      vs-modelmesh-serving-service.yaml ファイルを表示

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: vs-modelmesh-serving-service
        namespace: modelmesh-serving
      spec:
        gateways:
          - grpc-gateway
        hosts:
          - '*'
        http:
          - match:
              - port: 8008
            name: default
            route:
              - destination:
                  host: modelmesh-serving
                  port:
                    number: 8033
      
    2. kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスター(または ASM インスタンス)に接続し、次のコマンドを実行して仮想サービスを作成します。

      kubectl apply -f vs-modelmesh-serving-service.yaml
  4. Google Remote Procedure Call(gRPC)-JSON トランスコーダーを構成します。

    1. 次の内容を含む 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: ingressgateway
    2. kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスター(または ASM インスタンス)に接続し、次のコマンドを実行して gRPC-JSON トランスコーダーをデプロイします。

      kubectl apply -f grpcjsontranscoder-for-kservepredictv2.yaml
    3. 次の内容を含む grpcjsontranscoder-increasebufferlimit.yaml ファイルを作成し、per_connection_buffer_limit_bytes パラメーターを設定してレスポンスのサイズを大きくします。

      grpcjsontranscoder-increasebufferlimit.yaml ファイルを表示

      apiVersion: networking.istio.io/v1alpha3
      kind: EnvoyFilter
      metadata:
        labels:
          asm-system: "true"
          manager: asm-voyage
          provider: asm
        name: grpcjsontranscoder-increasebufferlimit
        namespace: istio-system
      spec:
        configPatches:
        - applyTo: LISTENER
          match:
            context: GATEWAY
            listener:
              portNumber: 8008
            proxy:
              proxyVersion: ^1.*
          patch:
            operation: MERGE
            value:
              per_connection_buffer_limit_bytes: 100000000
        workloadSelector:
          labels:
            istio: ingressgateway
      
    4. kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスター(または ASM インスタンス)に接続し、次のコマンドを実行して Envoy フィルターをデプロイします。

      kubectl apply -f grpcjsontranscoder-increasebufferlimit.yaml

手順 3:サンプルモデルをデプロイする

  1. StorageClass を作成します。 詳細については、「動的にプロビジョニングされた NAS ボリュームをマウントする」をご参照ください。

    1. ACK コンソール にログインします。 左側のナビゲーションペインで、[クラスター] をクリックします。

    2. [クラスター] ページで、管理するクラスターを見つけて名前をクリックします。 左側のペインで、[ボリューム] > [storageclasses] を選択します。

    3. [storageclasses] ページの右上隅にある [作成] をクリックし、次の図に示すパラメーターを設定して、[作成] をクリックします。

      Dingtalk_20231107170754.png

  2. 永続ボリュームクレーム(PVC)を作成します。

    1. 次の内容を含む 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: Filesystem
    2. kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続し、次のコマンドを実行して PVC を作成します。

      kubectl apply -f my-models-pvc.yaml
    3. 次のコマンドを実行して、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
  3. PVC にアクセスする Pod を作成します。

    新しい PVC を使用するには、Kubernetes Pod にボリュームとしてマウントし、その Pod を使用してモデルファイルを永続ボリュームにアップロードする必要があります。

    1. 次の内容を含む 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"
    2. kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続し、次のコマンドを実行して Pod を作成します。

      kubectl apply  -n modelmesh-serving  -f pvc-access.yaml
    3. pvc-access Pod が実行されていることを確認します。

      kubectl get pods -n modelmesh-serving | grep pvc-access

      予期される出力:

      pvc-access             1/1     Running   0          51m
  4. 永続ボリュームにモデルを保存します。

    AI モデルを永続ボリュームに追加します。 この例では、scikit-learn でトレーニングされた MNIST 手書き数字文字認識モデルを使用します。 mnist-svm.joblib モデルファイルのコピーは、kserve/modelmesh-minio-examples リポジトリからダウンロードできます。

    1. kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続し、次のコマンドを実行して mnist-svm.joblib モデルファイルを pvc-access Pod の /mnt/models フォルダーにコピーします。

      kubectl -n modelmesh-serving cp mnist-svm.joblib pvc-access:/mnt/models/
    2. 次のコマンドを実行して、モデルが永続ボリュームに存在することを確認します。

      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
  5. 推論サービスをデプロイします。

    1. 次の内容を含む sklearn-mnist.yaml ファイルを作成します。

      sklearn-mnist.yaml ファイルを表示

      apiVersion: serving.kserve.io/v1beta1
      kind: InferenceService
      metadata:
        name: sklearn-mnist
        namespace: modelmesh-serving
        annotations:
          serving.kserve.io/deploymentMode: ModelMesh
      spec:
        predictor:
          model:
            modelFormat:
              name: sklearn
            storage:
              parameters:
                type: pvc
                name: my-models-pvc
              path: mnist-svm.joblib
    2. kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続し、次のコマンドを実行して sklearn-mnist 推論サービスをデプロイします。

      kubectl apply -f sklearn-mnist.yaml
    3. 数十秒待って(待ち時間はイメージのプル速度によって異なります)、次のコマンドを実行して sklearn-mnist 推論サービスがデプロイされているかどうかを確認します。

      kubectl get isvc -n modelmesh-serving

      予期される出力:

      NAME            URL                                               READY
      sklearn-mnist   grpc://modelmesh-serving.modelmesh-serving:8033   True
  6. 推論を実行します。

    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 のトラブルシューティング」を参照してトラブルシューティングを行うことができます。