Amazon Web Services ブログ

Chronos-2 on Amazon SageMaker AI にアクセスする3つのパターン – AutoGluon-Cloud v0.5.0 で数行に

みなさん、こんにちは。ソリューションアーキテクトの 寺山です。
AutoGluon-Cloud v0.5.0 のアップデートにより、Chronos-2 は Amazon SageMaker AI へコード数行でデプロイ/利用できるようになりました。デプロイが簡単になった今、本番運用で本当に悩むのは「どの推論タイプを選ぶか」です。本記事ではアップデートの要点を押さえたうえで、3 つの推論パターン(リアルタイム推論:Realtime Inference、サーバーレス推論:Serverless Inference、バッチ変換:Batch Transform)をユースケースに応じてどう使い分けるかを具体的に紹介します。

1.背景

AutoGluon-Cloud は、AutoGluonAmazon SageMaker AI 上で実行するためのデプロイ・推論ライブラリです。v0.5.0 の核心は、Foundation Model 向けの新クラス(TimeSeriesFoundationModel)の追加です。学習(fit)ステップが不要になり、model_id="chronos-2" を指定するだけで、この共通クラスから 3 つの推論タイプすべてにデプロイ・推論できますこれにより、Chronos 2 on Amazon SageMaker AI のデプロイ~ 推論までをコード数行で 実現できるようになりました。 AutoGluon-Cloud には v0.5.0 以前 Foundation Model 専用のクラスが存在せず、Chronos-2 のようなゼロショットモデルを扱う手段がありませんでした。また異なる手段として、Amazon SageMaker JumpStart からリアルタイム推論にアクセスできます。一方で、サーバーレス推論・バッチ変換にはモデルアーティファクトの再パッケージなど一手間が必要でした。 Autogluon-Cloud v0.5.0 の登場により、SageMaker AI 上にデプロイする 3 パターンとも同じ手軽さでアクセスできるようになりました。

その他の変更点(詳細はリリースノート参照):

  • bootstrap() による 1 コマンドセットアップ、ローカルに AutoGluon 本体が不要(pip install autogluon.cloud のみ)
  • サーバーレス推論のサポート、共変量(known_covariates)のフルサポート

Note: v0.5.0 より前のバージョンでデプロイしたエンドポイントは互換性がありません。再デプロイが必要です。

2. 事前準備

デプロイする全ての環境(AWS アカウントとリージョンの組み合わせ) をブートストラップする必要があります。bootstrap() を実行するだけで、SageMaker が利用する IAM ロールと S3 バケットが自動的に作成され、設定は ~/.autogluon/cloud.yaml に保存されます。環境がすでにブートストラップされているかどうかが不明な場合は、いつでもコマンドを再実行できます。

既存のロール・バケットを使う場合は register() で登録します。

pip install autogluon.cloud 

from autogluon.cloud import bootstrap 

bootstrap()  # 初回のみ実行すれば十分 

`bootstrap()`は、IAM ロールや S3バケットが未設定の場合に実行するものです。既にリソースがある場合は`register()`で登録できます。いずれも設定は`~/.autogluon/cloud.yaml`に保存され、以降の呼び出しで自動的に読み込まれます。この保存済み設定を使わず、呼び出しごとに明示的にリソースを渡したい場合は、IAM ロールの ARN と S3 パスを直接指定することもできます。

3. Chronos-2 をデプロイする3つの方法

Autogluon-Cloud を使うと、Chronos-2 は 3 つの推論タイプから選択して設定すると SageMaker AI 上にデプロイできます。もちろん、このライブラリを使わなくても Amazon SageMaker AI 上にデプロイできます。その場合は、推論タイプもこの3つに限りません。
下記では、3つの推論タイプそれぞれでコード例を示します。例はすべて同じ入力データ・同じ予測タスクを想定しています。今回は具体的なデータを用意しているわけではありませんが、サンプルコードの理解のためにデータについて補足します。

  • data: 店舗・SKU ごとの過去の売上時系列(列: id=系列の識別子、timestamp=日時、Sales=売上)
  • target=”Sales”: 予測したい対象列
  • known_covariates: 予測期間中に既知の説明変数(例: 価格やプロモーション実施の有無)。Chronos-2 が共変量を使って予測精度を高める
  • prediction_length=13: 何ステップ先まで予測するか(例: 13 週先までの週次売上)

「何を予測したいか」を target に、「その予測に効く既知の情報は何か」を known_covariates に対応させて考えると、どのカラムをどこに渡せばよいかイメージしやすくなります。例えばコールセンターの入電数予測であれば、target は入電数、known_covariates はキャンペーン実施の有無や祝日フラグに相当します。

3.1 リアルタイム推論

図1 : リアルタイム推論の場合の構成

GPU/CPU インスタンスを選択でき、常時稼働してリクエストに即座にレスポンスを返します。

model.deploy() で SageMaker 上にエンドポイントが立ち上がり、以降は endpoint.predict() を呼ぶたびに Client Application からのリクエストがそのエンドポイントに直接渡されます。図1 では、ラップトップからSageMaker 上に モデルをデプロイする構成を示しています。

from autogluon.cloud import TimeSeriesFoundationModel

model = TimeSeriesFoundationModel(model_id="chronos-2")
endpoint = model.deploy(instance_type="ml.g5.xlarge")

predictions = endpoint.predict(
    data=data,
    target="Sales",
    id_column="id",
    timestamp_column="timestamp",
    prediction_length=13,
    known_covariates=known_covariates,
)

endpoint.delete_endpoint()

3.2 サーバーレス推論

図2 : サーバーレス推論の場合の構成

サーバーレス推論を実行したい場合、リアルタイム推論を実現するコードとの差分は inference_mode=”serverless” の指定です。 このサーバーレス推論ではリクエストがない間はインスタンス台数はゼロにスケールし、推論時間のみ課金されます。ネットワーク分離環境で動作するため、モデルを事前に S3 にキャッシュする必要があります。

model = TimeSeriesFoundationModel(model_id="chronos-2") 
cached = model.cache_model_artifact("s3://my-bucket/fm-cache") 
endpoint = cached.deploy(inference_mode="serverless") 
 
predictions = endpoint.predict( 
    data=data, 
    target="Sales", 
    id_column="id", 
    timestamp_column="timestamp", 
    prediction_length=13, 
) 
 
endpoint.delete_endpoint() 

3.3 バッチ変換

図3 : バッチ変換の場合の構成

バッチ変換では、エンドポイントをデプロイせず、model.predict() に直接データを渡します。 ジョブとしてデータを処理し、完了後にリソースは自動シャットダウンされます。

model = TimeSeriesFoundationModel(model_id="chronos-2") 
 
future = model.predict( 
    data=data, 
    target="Sales", 
    id_column="id", 
    timestamp_column="timestamp", 
    prediction_length=13, 
    known_covariates=known_covariates, 
    wait=False, 
) 
 
print(future.status())        # 'InProgress' 
predictions = future.result()  # 完了まで待機し DataFrame を返す 

data には DataFrame だけでなく、ローカルファイルや S3 パス(s3://my-bucket/data.csv)も直接渡せます。大規模データをすでに S3 に置いている場合は、DataFrame にロードし直さずそのまま渡せます。また予測結果は内部で S3 を経由して書き出されます。デフォルトでは {cloud_output_path}/{job_name}/predictions.csv に保存され、predictions_path で明示的な出力先を指定することも可能です。

4. ユースケースに合わせた推論タイプの選定

3 パターンすべてに同じ手軽さでデプロイできるようになった今、実務で最も重要な判断は「どの推論タイプが自分のユースケースに合うか」です。
制約を比較する

SageMaker AI の制約:

項目 リアルタイム推論 サーバーレス推論 バッチ変換
ペイロード上限 6 MB 4 MB 100 MB / 1 レコード(S3 経由)
タイムアウト 60 秒 60 秒 なし
GPU 利用 選択可能 選択不可(CPU のみ) 選択可能
課金 常時稼働 推論時間のみ ジョブ時間のみ
コールドスタート なし あり N/A(ジョブ起動に数分)

注意したいのは サーバーレス推論が CPU 専用であることです。Chronos-2 は GPU で強みを発揮するモデルのため、サーバーレスを選ぶ場合は系列数やレイテンシ要件を見積もった上でご利用ください。

推論タイプによる違いはありませんが、Chronos-2 モデル自体の制約もあります。

  • 時間軸方向の最大コンテキスト長は 8,192 ステップ
  • 時間軸方向の最大出力長は 1,024 ステップ
  • cross_learning モード(デフォルト有効)は batch_size 単位で系列をグループ化して共同予測を行う。系列数にハードリミットはないが、 batch_size=100 程度が推奨

推論タイプの選び方例

リアルタイム推論を選ぶシーン:

  • 店長が共変量(価格、プロモーション等)を変えながら対話的に予測し、発注量を決める(What-if 分析)
  • AI エージェントから高頻度で予測 API を呼び出す
  • 系列数が多く GPU を使いたい、かつオンデマンドでレスポンスが必要

サーバーレス推論を選ぶシーン:

  • What-if 分析を行うが利用頻度が低く、エンドポイントの常時課金を避けたい
  • PoC や検証フェーズで、コストを最小限に抑えつつ動作確認したい
  • データサイズが小さく(4 MB 以下)、CPU 推論とコールドスタートを許容できる

バッチ変換を選ぶシーン:

  • 定期実行(日次・週次)で、全店舗・全 SKU の予測をまとめて生成する
  • 大量の系列を一括処理したく、タイムアウトやペイロード制限を気にしたくない
  • 予測結果を S3 に書き出し、後続のパイプラインやレポートに利用する

5. まとめ

AutoGluon-Cloud v0.5.0 により、Chronos-2 はリアルタイム・サーバーレス・バッチのいずれにも、同じ TimeSeriesFoundationModel クラス・数行のコードでアクセスできるようになりました。デプロイの複雑さという障壁が下がった今、向き合うべき問いは「どう実装するか」ではなく「自分たちのユースケースにどの推論タイプが最適か」です。
デプロイ後のエンドポイントは Amazon SageMaker AI のエンドポイントとして扱えるため、既存の監視やコスト管理にもそのまま組み込めます。まずはサーバーレスで小さく試し、要件が固まってからリアルタイムやバッチへ移行する、という段階的な導入も一つの手です。ぜひ自分たちのデータで動かしてみてください。

寺山 怜志 (Satoshi Terayama)

外食業界や百貨店業界のお客様を支援しているソリューションア―キテクトです。
最近は、時系列基盤モデル Chronos-2 を始めとした機械学習領域での学びを深めています