異なるランタイム環境を必要とする複数のモデルをデプロイする場合、またはモデル推論効率を向上させる、あるいはリソース割り当てを制御する必要がある場合は、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 ベースのカスタムサービスランタイムをビルドするには、次の手順を実行します。
MLServer の MLModel クラスを継承するクラスを実装します。
MLModel クラスの実装を追加して、MLServer を拡張できます。
load()関数とpredict()関数の 2 つの主要な関数が関係しています。必要に応じて、load()関数を使用してモデルを読み込み、predict()関数を使用して予測を行うことができます。MLServer のドキュメントで MLModel クラスの実装例を確認することもできます。モデルクラスと依存関係をコンテナーイメージにパッケージ化します。
モデルクラスを実装した後、MLServer を含むその依存関係を、ServingRuntime リソースとしてサポートされているイメージにパッケージ化する必要があります。MLServer は、
mlserver buildコマンドを使用してイメージをビルドするためのヘルパーを提供します。詳細については、「Building a custom image」をご参照ください。そのイメージを使用して新しい ServingRuntime リソースを作成します。
次の内容を使用して新しい ServingRuntime リソースを作成し、作成したイメージをポイントします。
フィールド
説明
{{CUSTOM-RUNTIME-NAME}}ランタイムの名前(例:my-model-server-0.x)。
{{MODEL-FORMAT-NAMES}}ランタイムがサポートするモデル形式のリスト(例:my-model)。たとえば、my-model 形式のモデルをデプロイすると、ModelMesh はこのリストとモデル形式をチェックして、このランタイムがモデルに適しているかどうかを判断します。
{{CUSTOM-IMAGE-NAME}}手順 2 で作成したイメージ。
次のコマンドを実行して、ServingRuntime リソースを作成します。
kubectl apply -f ${Name of the YAML file}.yamlServingRuntime リソースを作成すると、ModelMesh デプロイメントに新しいカスタムランタイムが表示されます。
手順 2:モデルをデプロイする
新しく作成したランタイムを使用してモデルをデプロイするには、モデルを提供するための InferenceService リソースを作成する必要があります。このリソースは、KServe および ModelMesh がモデルを管理するために使用するメインインターフェースです。これは、推論を提供するためのモデルの論理エンドポイントを表します。
次の内容を使用して、モデルを提供するための InferenceService リソースを作成します。
YAML ファイルでは、InferenceService リソースはモデルに
my-model-sampleという名前を付け、そのモデル形式my-modelを宣言しています。これは、前の手順で作成したカスタムランタイムの例と同じ形式です。オプションのフィールドruntimeも渡され、ModelMesh に my-model-server-0.x ランタイムを使用してこのモデルをデプロイするように明示的に指示しています。storageフィールドは、モデルがどこにあるかを指定します。この場合、ModelMesh Serving のクイックスタートガイドを使用してデプロイされた localMinIO インスタンスが使用されます。次のコマンドを実行して、InferenceService リソースをデプロイします。
kubectl apply -f ${Name of the YAML file}.yaml