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

Alibaba Cloud Service Mesh:ModelMesh を使用してカスタムモデルサービスランタイムを作成する

最終更新日:Jan 13, 2025

異なるランタイム環境を必要とする複数のモデルをデプロイする場合、またはモデル推論効率を向上させる、あるいはリソース割り当てを制御する必要がある場合は、Model Service Mesh(ModelMesh)を使用してカスタムモデルサービスランタイムを作成できます。カスタムモデルサービスランタイムの微調整された構成により、各モデルが最適な環境で実行されることが保証されます。これにより、サービス品質の向上、コストの削減、複雑なモデルの O&M の簡素化を実現できます。このトピックでは、ModelMesh Serving を使用してモデルサービスランタイムをカスタマイズする方法について説明します。

前提条件

Container Service for Kubernetes(ACK)クラスターが Service Mesh(ASM)インスタンスに追加されていること、および ASM インスタンスのバージョンが 1.18.0.134 以降であること。

機能の説明

デフォルトでは、ModelMesh は次のモデルサービスランタイムと統合されています。

モデルサーバー

開発元

該当するフレームワーク

メリット

Triton Inference Server

NVIDIA

TensorFlow、PyTorch、TensorRT、および ONNX

このモデルサーバーは、高性能でスケーラブル、かつ低レイテンシの推論サービスに適しており、管理と監視のためのツールを提供します。

MLServer

Seldon

SKLearn、XGBoost、および LightGBM

このモデルサーバーは、統一された API とフレームワークを提供し、複数のフレームワークと高度な機能をサポートします。

OpenVINO Model Server

Intel

OpenVINO および ONNX

このモデルサーバーは、Intel のハードウェアアクセラレーション技術を使用し、複数のフレームワークをサポートします。

TorchServe

PyTorch

PyTorch(eager モードを含む)

TorchServe は、PyTorch によって開発された軽量でスケーラブルなモデルサーバーです。

上記のモデルサーバーが特定の要件を満たせない場合、たとえば、推論のカスタムロジックを処理する必要がある場合、またはモデルに必要なフレームワークが上記のモデルサーバーでサポートされていない場合は、要件を満たすカスタムサービスランタイムを作成できます。

手順 1:カスタムサービスランタイムを作成する

名前空間スコープの ServingRuntime またはクラスタースコープの ClusterServingRuntime は、1 つ以上の特定のモデル形式を提供できるポッドのテンプレートを定義します。各 ServingRuntime または ClusterServingRuntime は、ランタイムのコンテナーイメージや、サポートされているモデル形式のリストなどの主要な情報を定義します。ランタイムのその他の構成は、spec フィールドの環境変数によって渡すことができます。

ServingRuntime CustomResourceDefinitions(CRD)により、柔軟性と拡張性が向上し、ModelMesh コントローラーコードやコントローラー名前空間内のその他のリソースを変更することなく、再利用可能なランタイムをカスタマイズできます。つまり、フレームワークをサポートするカスタムランタイムを簡単に構築できます。

カスタムサービスランタイムを作成するには、目的のフレームワークをサポートする新しいコンテナーイメージをビルドし、そのイメージを使用する ServingRuntime リソースを作成する必要があります。これは、目的のランタイムのフレームワークが Python バインディングを使用している場合に特に簡単です。この場合、MLServer の拡張ポイントを使用して追加のフレームワークを追加できます。MLServer はサービスインターフェースを提供します。ModelMesh Serving は MLServer を ServingRuntime として統合します。

Python ベースのカスタムサービスランタイムをビルドするには、次の手順を実行します。

  1. MLServer の MLModel クラスを継承するクラスを実装します。

    MLModel クラスの実装を追加して、MLServer を拡張できます。load() 関数と predict() 関数の 2 つの主要な関数が関係しています。必要に応じて、load() 関数を使用してモデルを読み込み、predict() 関数を使用して予測を行うことができます。MLServer のドキュメントで MLModel クラスの実装例を確認することもできます。

  2. モデルクラスと依存関係をコンテナーイメージにパッケージ化します。

    モデルクラスを実装した後、MLServer を含むその依存関係を、ServingRuntime リソースとしてサポートされているイメージにパッケージ化する必要があります。MLServer は、mlserver build コマンドを使用してイメージをビルドするためのヘルパーを提供します。詳細については、「Building a custom image」をご参照ください。

  3. そのイメージを使用して新しい ServingRuntime リソースを作成します。

    1. 次の内容を使用して新しい ServingRuntime リソースを作成し、作成したイメージをポイントします。

      YAML ファイルを表示

      apiVersion: serving.kserve.io/v1alpha1
      kind: ServingRuntime
      metadata:
        name: {{CUSTOM-RUNTIME-NAME}}
      spec:
        supportedModelFormats:
          - name: {{MODEL-FORMAT-NAMES}}
            version: "1"
            autoSelect: true
        multiModel: true
        grpcDataEndpoint: port:8001
        grpcEndpoint: port:8085
        containers:
          - name: mlserver
            image: {{CUSTOM-IMAGE-NAME}}
            env:
              - name: MLSERVER_MODELS_DIR
                value: "/models/_mlserver_models/"
              - name: MLSERVER_GRPC_PORT
                value: "8001"
              - name: MLSERVER_HTTP_PORT
                value: "8002"
              - name: MLSERVER_LOAD_MODELS_AT_STARTUP
                value: "false"
              - name: MLSERVER_MODEL_NAME
                value: dummy-model
              - name: MLSERVER_HOST
                value: "127.0.0.1"
              - name: MLSERVER_GRPC_MAX_MESSAGE_LENGTH
                value: "-1"
            resources:
              requests:
                cpu: 500m
                memory: 1Gi
              limits:
                cpu: "5"
                memory: 1Gi
        builtInAdapter:
          serverType: mlserver
          runtimeManagementPort: 8001
          memBufferBytes: 134217728
          modelLoadingTimeoutMillis: 90000

      フィールド

      説明

      {{CUSTOM-RUNTIME-NAME}}

      ランタイムの名前(例:my-model-server-0.x)。

      {{MODEL-FORMAT-NAMES}}

      ランタイムがサポートするモデル形式のリスト(例:my-model)。たとえば、my-model 形式のモデルをデプロイすると、ModelMesh はこのリストとモデル形式をチェックして、このランタイムがモデルに適しているかどうかを判断します。

      {{CUSTOM-IMAGE-NAME}}

      手順 2 で作成したイメージ。

    2. 次のコマンドを実行して、ServingRuntime リソースを作成します。

      kubectl apply -f ${Name of the YAML file}.yaml

      ServingRuntime リソースを作成すると、ModelMesh デプロイメントに新しいカスタムランタイムが表示されます。

手順 2:モデルをデプロイする

新しく作成したランタイムを使用してモデルをデプロイするには、モデルを提供するための InferenceService リソースを作成する必要があります。このリソースは、KServe および ModelMesh がモデルを管理するために使用するメインインターフェースです。これは、推論を提供するためのモデルの論理エンドポイントを表します。

  1. 次の内容を使用して、モデルを提供するための InferenceService リソースを作成します。

    YAML ファイルを表示

    apiVersion: serving.kserve.io/v1beta1
    kind: InferenceService
    metadata:
      name: my-model-sample
      namespace: modelmesh-serving
      annotations:
        serving.kserve.io/deploymentMode: ModelMesh
    spec:
      predictor:
        model:
          modelFormat:
            name: my-model
          runtime: my-model-server
          storage:
            key: localMinIO
            path: sklearn/mnist-svm.joblib
    

    YAML ファイルでは、InferenceService リソースはモデルに my-model-sample という名前を付け、そのモデル形式 my-model を宣言しています。これは、前の手順で作成したカスタムランタイムの例と同じ形式です。オプションのフィールド runtime も渡され、ModelMesh に my-model-server-0.x ランタイムを使用してこのモデルをデプロイするように明示的に指示しています。storage フィールドは、モデルがどこにあるかを指定します。この場合、ModelMesh Serving のクイックスタートガイドを使用してデプロイされた localMinIO インスタンスが使用されます。

  2. 次のコマンドを実行して、InferenceService リソースをデプロイします。

    kubectl apply -f ${Name of the YAML file}.yaml