🧠

Amazon SageMaker AIの推論エンドポイントでの複数モデルホストの方法を整理する

に公開

はじめに

Amazon SageMaker AIの推論エンドポイントを使うと、SageMakerでトレーニングした機械学習モデルを簡単にインスタンスにデプロイし、インスタンスをオートスケールさせつつ、モデルのユーザーに提供することができます。

SageMakerの歴史は長く、東京リージョンには2018年にやってきました。

https://aws.amazon.com/jp/about-aws/whats-new/2018/06/amazon-sagemaker-tokyo-region-launch/

推論エンドポイントもユーザーのユースケースに合わせて都度改良されており、複数モデルをホストする方法も複数あります。
そのため、後からみるとどれを選べばよいか分かりにくい側面があります。
今回は調べた中で選択肢を整理したかったため、記事にまとめました。

なお、ここでは以下のガイドに記載のリアルタイム推論のみ取り上げます。

https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/realtime-endpoints-options.html

現状のモデルホストの選択肢

以下の選択肢があると思います。

  • シングルモデルエンドポイント
    • 推論コンポーネントを使わないパターン
    • 推論コンポーネントを使ったパターン
    • 推論パイプライン
  • マルチモデルエンドポイント
    • 推論コンポーネントを使ったパターン
    • マルチバリアント
    • マルチモデル
    • マルチコンテナ

最近では特に生成AIモデルホストのため、後述する推論コンポーネント機能が出てきています。若干エンドポイントの種類分けとは粒度が違うように思われ、分類がややこしいのですが、シングルモデル・マルチモデル両方を実現できるため、このように記載しています。

各選択肢について

推論コンポーネント

生成AIの出現により、推論エンドポイントのリソース効率を上げるため、登場した機能です。

https://aws.amazon.com/jp/blogs/news/amazon-sagemaker-adds-new-inference-capabilities-to-help-reduce-foundation-model-deployment-costs-and-latency/

コンソール・各種SDK・AWS CLIなどインターフェースによって必要な操作が異なりますが、boto3およびAWS CLIが最も操作が細かく、以下が必要になります。

  1. SageMakerモデルの作成
  2. エンドポイント設定の作成(ここでバリアントも一緒に作成)
  3. エンドポイントの作成
  4. 推論コンポーネントのエンドポイントへのデプロイ(バリアントを指定)

エンドポイントには複数の推論コンポーネントをデプロイできるため、単一のエンドポイントで複数モデルをホストできます。推論実行にはInvokeEndpoint APIで推論コンポーネント名を指定します。

https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_runtime_InvokeEndpoint.html

現状、公開されている推論コンポーネントは生成AI向けのものがほとんどですが、複数のモデルでエンドポイントのリソースを共有する場合は生成AIでなくても推論コンポーネントを使ってしまってよいようには思います。

2025/3/30に以下から引用
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/realtime-endpoints-deploy-models.html

Amazon SageMaker AI を使用して、1 つ以上のモデルをエンドポイントにデプロイできます。複数のモデルがエンドポイントを共有する場合は、そこでホストされるリソース (ML 演算処理インスタンス、CPU、アクセラレーターなど) を共同で使用します。エンドポイントに複数のモデルを柔軟にデプロイするには、各モデルを推論コンポーネントとして定義するのが一番です。

一応、登場した年のre:Inventのセッションでは、小さめのモデルはマルチモデルエンドポイントを使うというような違いは紹介されていました。

https://youtu.be/6xENDvgnMCs

ただ、推論コンポーネントを使うとエンドポイントをインスタンス数0までスケールできるなど固有のメリットがありとても魅力的です。

https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/endpoint-auto-scaling-zero-instances.html

推論パイプライン

SageMakerモデルを、前処理用のscikit-learnやPySparkなどのコンテナと一緒に推論エンドポイントにデプロイできる機能です。

https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/inference-pipeline-real-time.html

推論エンドポイント側で受信したデータをさらに加工したい場合にはこの機能が使えます。

シングルモデルエンドポイント

エンドポイントに単一のモデルをデプロイするパターンで、推論エンドポイントの最も基本的な使い方です。

推論エンドポイント背後でモデルをホストするためのインスタンスの定義をする箱であるProduction Variants(以降、バリアント)を定義し、推論コンポーネントなしでデプロイします。

  1. SageMakerモデルの作成
  2. エンドポイント設定の作成(ここでバリアントも一緒に作成)
  3. エンドポイントの作成

A/Bテストなど一時的に複数バリアントをデプロイするようなときにも一番イメージがつきやすいです。

https://dev.classmethod.jp/articles/amazon-sagemaker-a-b-testing-production-variant/

マルチバリアントエンドポイント

シングルモデルエンドポイントでバリアントを複数起動している状態のことを分けて記載しています。簡単に複数モデルをエンドポイントにデプロイできますが、バリアント同士はインスタンスを共有しないためコスト効率はよくありません。

例えば、同じインスタンスサイズを指定したバリアントAおよびBがある場合に、バリアントBはそれほどトラフィックがなくても、バリアントAと同じインスタンス料金がかかります。

マルチモデルエンドポイント

エンドポイントに複数のモデルをデプロイする基本のパターンです。モデルは同一のフレームワークで、同一のS3プレフィクスに置いておく必要があるため、この点がシステム要件に合うかや使いやすいと思うかどうかがポイントとなります。

https://dev.classmethod.jp/articles/amazon-sagemaker-multi-model-endpoints-introduction/

マルチコンテナエンドポイント

マルチモデルエンドポイントとは違って、異なるフレームワークでも同一のエンドポイントにデプロイすることが可能になります。

https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/multi-container-endpoints.html

さいごに

複数モデルを単一のSageMaker推論エンドポイントにデプロイする際の選択肢を整理しました。

結局どれがいいの?というところですが、生成AIモデルをデプロイする場合は推論コンポーネントを使った方法を、そうでない場合はマルチコンテナエンドポイントなど従来の方法で最も運用しやすいものが選択肢になると思いました。

従来モデルの場合も推論コンポーネントでよいようには思うのですが、あまりそのユースケースの情報が見つけられておらず、なにか性能面などで生成AIモデルの方が最適な理由があるのかもしれません。特に問題ないという情報が掴めているのであれば、推論コンポーネントを使う方法に倒してしまうのが分かりやすくていいんじゃないかなと思います。

Discussion