SageMakerの推論エンドポイントで複数モデルをホストするには

現在サポートされている選択肢
SageMakerでは推論エンドポイントの効果的な利用オプションが随時追加されており、後から見ると調査コストが高いので、本日時点での情報を整理していきたい。
- 推論コンポーネント(一番新しい選択肢、re:Invent2023で追加)
- マルチモデルエンドポイント
- マルチコンテナエンドポイント
上記はSageMakerのドキュメントに記載されている。

シングルポイントエンドポイントの課題
元々あったのはシングルモデルエンドポイント。SageMakerのモデルに対して1:1で推論エンドポイントを作成する方法。
ガイドだと以下のページに該当するが、現在は主に推論コンポーネントの使用を推した記載にリダイレクトされるので、コンテキストが分からないと若干経緯が理解しにくくなっている。
この方法だと1つのモデルに対して必ずインスタンスが必要になるため、トラフィックがあまりないモデルについても指定されたインスタンスを起動しておく必要があった。
また、単純にモデルの数だけエンドポイントが増えるため、管理コストも高くなってしまう。

マルチモデルエンドポイント
マルチモデルエンドポイントでは、1つのエンドポイントに複数のモデルをデプロイすることができる。
これにより、あるインスタンスの空いているリソースで別のモデルを使って推論するといったことが可能になり、はるかにリソースを効率的に使用することができる。
ただし、重要なポイントとして、同じMLフレームワークのモデルのエンドポイントをまとめるという考えになる。
マルチモデルエンドポイントは、共有サービングコンテナ上で同じ ML フレームワークを使用する多数のモデルをホストするのに理想的です。
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/multi-model-endpoints.html#how-multi-model-endpoints-work
つまり、フレームワークが異なる場合は別の方法が必要になる。
また、S3バケットの同じパスプレフィックスにモデルアーティファクトを配置しておく必要もある。

マルチコンテナエンドポイント
マルチコンテナエンドポイントを使うことにより、異なるフレームワークのモデルを1つのエンドポイントにホストすることができるようになった。
これが2023年3月のこと。

推論コンポーネント
生成AIの出現により、さらに推論エンドポイントのリソース効率を上げるため、re:Invent2023で推論コンポーネントが登場した。
推論コンポーネントにより、推論エンドポイントに対して複数のモデルをデプロイすることができるようになった。
このころに出ている情報では、生成AIモデルの複数デプロイに関するものが多いため、生成AIモデルを意識した機能であることが推測されるが、既存のモデルでも普通に利用できると考えられる。
概念としては、推論エンドポイントとして起動しているマネージドインスタンス上で動く、コンテナアプリケーション粒度のものと捉えるとよさそう。

推論コンポーネントについては以下のセッションをみてもらうと分かりやすい。
マルチモデルエンドポイントとの差としては以下のように紹介されていた。
Multi Model Endpoints
Smaller models, homogeneous and scaling
For larger FMs, use SageMaker Inference Component Endpoints

推論コンポーネントのメリットとして、推論エンドポイントのインスタンスを0にスケールダウンできることもある。

推論コンポーネントのデプロイ
SageMaker Python SDKの場合はモデルのdeployメソッドのendpoint_type
にEndpointType.INFERENCE_COMPONENT_BASED
を設定します。
# https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/realtime-endpoints-deploy-models.html
predictor = model.deploy(
initial_instance_count = 1,
instance_type = "ml.p4d.24xlarge",
endpoint_type = EndpointType.INFERENCE_COMPONENT_BASED,
resources = resources,
)
boto3の場合、create_inference_component
をEndpointName
およびVariantName
を指定の上実行する。
# https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/realtime-endpoints-deploy-models.html
sagemaker_client.create_inference_component(
InferenceComponentName = inference_component_name,
EndpointName = endpoint_name,
VariantName = variant_name,
Specification = {
"Container": {
"Image": "image-uri",
"ArtifactUrl": model_url,
},
"ComputeResourceRequirements": {
"NumberOfCpuCoresRequired": 1,
"MinMemoryRequiredInMb": 1024
}
},
RuntimeConfig = {"CopyCount": 2}
)