Amazon Web Services ブログ

自動シャットダウンソリューションを使ってAmazon SageMaker Canvas のコストを最適化する方法

Amazon SageMaker Canvasは、様々な機能を備えたコーディング不要の機械学習 (ML) と生成 AI ワークスペースです。見やすい画面とコーディング不要のインターフェースにより、世界中のお客様が ML テクノロジーをより簡単に採用し、いろいろな課題を解決できるようになりました。 これは、SageMaker Canvas が ML のワークフロー全体をカバーできていることに起因します。データの前処理やAutoMLの強力な機能、管理されたエンドポイントのデプロイ、簡略化された MLOps 機能、AWS AIサービスと生成 AI を活用したすぐに使えるモデルを利用者が探しているかどうかに関わらず、 SageMaker Canvas は目標達成を支援できます。

あらゆる規模の企業が SageMaker Canvas を採用するにつれ、お客様はコストの最適化の方法を求めてきました。 AWS Well-Architected Frameworkで定義されているように、コスト最適化されたワークロードは、すべてのリソースをフルに使用し、お客様の機能要件を満たし、可能な限り低い価格で成果を達成します。

この投稿では SageMaker Canvas アプリケーションのコストをより最適化する新しい方法を紹介します。 SageMaker Canvas は現在、アプリの使用状況とアイドル時間に関するインサイトを提供する Amazon CloudWatch Metrics を収集しています。 お客様はこの情報を使用して、意図しないコストの発生を避けるために自動的にアイドル状態の SageMaker Canvas アプリケーションをシャットダウンできます。

この投稿では、シンプルなサーバーレスアーキテクチャを使用して、アイドル状態のSageMaker Canvasアプリをシャットダウンしてコストを制御する方法を示します。 この投稿で使用されるテンプレートはこちらの GitHub で入手できます。

SageMaker Canvas のコストについて理解する

オンプレミスまたはクラウドのどちらのワークロードでも、コストを理解し制御するためには、コストについて学ぶことから始まります。まずは SageMaker Canvas の課金モデルを確認することから始めましょう。 簡単に言うと、SageMaker Canvasには次の2つの側面に基づいた従量課金モデルがあります。

  • Workspace instance : 以前はセッション時間と呼ばれていたもので、SageMaker Canvas アプリの実行に関連するコスト。
  •  AWSサービス料金 : モデルのトレーニング、エンドポイントのデプロイ、推論の生成といった SageMaker Canvas を起動するためのリソースに関連するコスト。

お客様は、SageMaker Canvasによって起動されるリソースを常に完全に制御することができ、AWS Billing and Cost Management Service を使用して、SageMaker Canvasアプリに関連するコストを追跡できます。 詳細については、「SageMaker Canvasの課金とコストの管理」を参照してください。

Workspace instance に関連するコストを制限するためのベストプラクティスとして、ブラウザタブは閉じずにログアウトをする方法があります。ログアウトするには、SageMaker Canvas アプリの左パネルにあるログアウトボタンを選択します。

自動で SageMaker Canvas アプリケーションをシャットダウンする

SageMaker Canvasアプリケーションを自動的にシャットダウンしてコストを抑えたいIT管理者は、次の2つのアプローチをとることができます。

  • スケジュールに従ったアプリケーションのシャットダウン(毎日 19:00 または毎週金曜日 19:00)
  • アイドル状態のアプリケーションの自動シャットダウン(アプリケーションが 2 時間使用されていない場合)

スケジュールに従ったアプリケーションのシャットダウン

スケジュールに従った SageMaker Canvas アプリケーションのシャットダウンは、Amazon SageMaker API である DeleteApp を呼び出すコンピューティングコンポーネント (AWS Lambda 関数) である cron 式 (Amazon EventBridge Cron ルールを使用) を使用することで、ほとんど手間をかけずに実行できます。このアプローチについては、「AWS CDKとAWS Service Catalogを使用したAmazon SageMaker Canvasの機械学習環境のプロビジョニングと管理」の記事で説明されており、こちらの GitHub リポジトリで実装が公開されています。

上記のアーキテクチャの利点の 1 つは、SageMaker Canvas アプリケーションの定期的な作成をとても簡単に複製できることにあります。定期的な作成と削除を組み合わせることで、ユーザーが業務を開始する時間帯(例 : 営業日の AM9:00)にSageMaker Canvas アプリケーションを立ち上げ、ユーザーが業務を終了する時間帯(例 : 営業日の PM7:00、週末は常にシャットダウン)に自動で SageMaker Canvas アプリケーションを削除することを確実にしておくことができます。必要なことは、DeleteApp API を呼び出すコード行を CreateApp に変更することと、アプリ作成時間を反映するように cron 式を更新することだけです。

このアプローチは実装とテストが非常に簡単ですが、欠点としてアプリケーションが使用されているかどうかを考慮せず、アクティビティステータスに関係なくアプリケーションをシャットダウンしてしまうことです。セッションが突然終了するかもしれないため、アクティブユーザーと軋轢が生じてしまう可能性があります。

このアーキテクチャに関連するテンプレートは、次の GitHub リポジトリから取得できます。

アイドル状態のアプリケーションの自動シャットダウン

2023/11/24 から新たに、Amazon SageMaker Canvas はアプリケーションの使用状況とアイドル状態に関するインサイトを提供する CloudWatch Metrics を出力するようになりました。これにより、管理者はアイドル状態メトリクスを読み取り、しきい値と比較して自動シャットダウンの特定のロジックを定義するソリューションを定義できます。SageMaker Canvas によって出力されるアイドル状態メトリクスのより詳細な概要を次の段落に示します。

アイドル状態メトリクスに基づく SageMaker Canvas アプリケーションの自動シャットダウンを実現するために、AWS CloudFormation テンプレートを提供しています。このテンプレートは、次の 3 つの主要コンポーネントで構成されています。

  1. Amazon CloudWatch Alarm はクエリを実行して TimeSinceLastActive メトリクスの最大値をチェックします。この値が CloudFormation テンプレートの入力で指定されたしきい値より大きい場合、以下の残りの工程が自動で実行されます。このクエリは、単一のユーザープロファイル、単一のドメイン、またはすべてのドメインのどれでも実行できます。希望する制御レベルに応じて、以下を使用できます。
    • all-domains-all-users テンプレート。テンプレートがデプロイされているリージョン内のすべてのユーザーとすべてのドメインをチェックします。
    • one-domain-all-users テンプレート。テンプレートがデプロイされているリージョン内の 1 つのドメインのすべてのユーザーを対象にチェックします。
    • one-domain-one-user テンプレート。テンプレートがデプロイされているリージョンの 1 つのドメイン内の 1 つのユーザープロファイルについてチェックします。
  2. アラーム状態が変更されると、Amazon EventBridge のデフォルトイベントバスにイベントが作成されます。このイベントバスには、AWS Lambda 関数をトリガーするように設定された Amazon EventBridge ルールがあります。
  3. AWS Lambda 関数は、指定されたしきい値を超えてアイドル状態で稼働している SageMaker Canvas アプリケーションを特定し、DeleteApp API を使用してそのアプリケーションを削除します。

このアーキテクチャに関連付けられた AWS CloudFormation テンプレートは、次の GitHub リポジトリから取得できます。

SageMaker Canvas のアイドル状態メトリックの仕組み

SageMaker Canvas は /aws/SageMaker/Canvas/AppActivity 名前空間で TimeSinceLastActive メトリクスを出力します。このメトリックは、ユーザーが何の操作もしていないアプリケーションがアイドル状態であった秒数を示します。この新しいメトリックを使用して、SageMaker Canvas アプリケーションが一定期間アイドル状態になると、SageMaker Canvas アプリの自動シャットダウンをトリガーできます。SageMaker Canvas は、次のスキーマを使用して TimeSinceLastActive を公開します。

{ "Namespace": "/aws/sagemaker/Canvas/AppActivity", 
  "Dimensions": [ 
      [
          "DomainId",
          "UserProfileName" 
       ] 
  ],
  "Metrics": [ 
      { 
          "Name": "TimeSinceLastActive",
          "Unit": "Seconds", 
          "Value": 12345
      } 
  ]
}

このメトリックの主要なコンポーネントは次の通りです。

  • Dimensions, 特に DomainIdUserProfileName は全てのドメインとユーザーでアイドル状態になっているアプリケーションを特定することができる
  • Value は SageMaker Canvas アプリケーションの中で最後のアクティビティからの秒数を示す。SgaeMaker Canvas は以下の操作をアクティビティがあったとみなす
    • SageMaker Canvas アプリケーション内で行った全ての動作(例:ボタンを押下する、データセットを変換する、アプリ内で推論を行う、モデルをデプロイするなど)
    • ready-to-use model を使用する、もしくはチャット画面を使って生成 AI モデルとやり取りをする
    • 特定の時間にバッチ推論を実行するようにスケジューリングする(詳細については を参照)

このメトリックは、get_metric_data などの Amazon CloudWatch API を介して読み取ることができます。たとえば、Python 用 AWS SDK (boto3) を使用する場合は以下となります。

import boto3, datetime 
cw = boto3.client('cloudwatch') 
metric_data_results = cw.get_metric_data(
    MetricDataQueries=[
        {
            "Id": "q1",
            "Expression": 'SELECT MAX(TimeSinceLastActive) FROM "/aws/sagemaker/Canvas/AppActivity" GROUP BY DomainId, UserProfileName',
            "Period": 900
        }
    ], 
    StartTime=datetime.datetime(2023, 1, 1),
    EndTime=datetime.datetime.now(),
    ScanBy='TimestampAscending'
)

Python クエリは DomainIDUserProfileName でグループ化した後、SageMaker Canvas に関連付けられた名前空間から TimeSinceLastActive の MAX 値を抽出します。

(訳者追記:この TimeSinceLastActive は SageMaker Canvas から 30 分間隔で発行される CloudWatch カスタムメトリクスです。2024年3月時点で、この発行間隔を変更することはできません。)

自動シャットダウンソリューションをデプロイして試してみる

自動シャットダウンスタックをデプロイするには、以下を実行します。

  1. 上記の GitHub リポジトリから、実装したいソリューションを実装している AWS CloudFormation テンプレートをダウンロードしてください。ソリューションをすべての SageMaker Domainか、単一の SageMaker Domainか、単一ユーザー向けに適用するかを選択します。
  2. 以下のテンプレートパラメータの更新してください。
    • アイドルタイムアウト(idle timeout) — SageMaker Canvas アプリがシャットダウンされる前にアイドル状態でいられる時間 (秒単位)。デフォルト値は 2 時間です。
    • アラーム期間(alarm period) — CloudWatch Alarm がアイドルタイムアウトを計算するために使用する集計時間 (秒単位)。デフォルト値は 20 分です。
    • (Option) SageMaker Domain ID と ユーザープロファイル名
  3. クラウドフォーメーションスタックをデプロイしてリソースを作成します。

クラウドフォーメーションスタックをデプロイしてリソースを作成します。

デプロイが完了すると (2 分もかかりません)、AWS Lambda 関数と Amazon CloudWatch アラームは、アイドル状態のときに Canvas アプリケーションを自動的にシャットダウンするように設定されます。自動シャットダウンスクリプトをテストするには、次の操作を行います。

  1. SageMaker Canvas アプリが適切なドメイン内で適切なユーザープロファイル (設定されている場合) で実行されていることを確認してください。
  2. SageMaker Canvas アプリの使用を停止し、アイドルタイムアウト期間 (デフォルトは 2 時間) を待ちます。
  3. CloudWatch アラームがトリガーされ、自動化をトリガーした後に通常の状態に戻ったことを確認して、しきい値時間アイドル状態になった後にアプリが停止したことを確認します。

このテストでは、アイドルタイムアウト期間を 2 時間 (7200 秒) に設定しました。Amazon CloudWatch Metrics によってプロットされた次のグラフでは、アラームがトリガーされたしきい値 (1) に達するまで、SageMaker Canvas アプリが TimeSinceLastActive メトリクスを出力していたことがわかります。アラームがトリガーされると、AWS Lambda 関数が実行され、アプリケーションが削除され、メトリクスがしきい値 (2) を下回りました。

結論

この投稿では、AWS Lambda と CloudWatch Alarm と SageMaker Canvas から新たに出力されるようになったアイドル状態のメトリックスを使用して、アイドル状態の SageMaker Canvas アプリケーションの自動シャットダウンソリューションを実装しました。このソリューションにより、顧客は機械学習ワークロードのコストを最適化できるだけでなく、SageMaker Domainで実行されていたことを忘れてしまったアプリケーションへの意図しない請求を回避できます。

このソリューションによってお客様が安心して解決できる新しいユースケースやワークロードを楽しみにしています。SageMaker Canvasがビジネス目標の達成にどのように役立つかについてのその他の例については、以下の記事を参照してください。

Amazon SageMaker Canvas を使用してプロダクションレベルのワークロードを実行する方法については、以下の投稿を参照してください。

(訳者注:上記のブログ記事は、日本語に翻訳済のものは日本語の翻訳記事のリンクを掲載しています。原文を読みたい場合は、日本語の記事からのリンクを参照下さい。)

著者について

Davide Gallitelliは、AI/MLのシニアスペシャリストソリューションアーキテクトです。彼はブリュッセルに拠点を置き、ローコード/ノーコードの機械学習テクノロジーとジェネレーティブAIの採用を検討している世界中の顧客と緊密に連携しています。彼は幼い頃から開発者として活躍し、7歳でコーディングを始めました。彼は大学でAI/MLを学び始め、それ以来ずっとAI/MLに夢中になっています。
 

 

Huong Nguyen は AWS のシニアプロダクトマネージャーです。彼女はSageMakerのデータエコシステム統合を主導しており、企業と消費者の両方の分野で顧客中心およびデータ主導型の製品を構築してきた14年の経験があります。

 

Gunjan Garg は AWS の Amazon SageMaker チームのプリンシパルエンジニアで、この製品の技術的リーダーシップを発揮しています。彼女は過去 5 年間、AI/ML 組織でいくつかの役職を歴任し、現在は Amazon SageMaker Canvas に焦点を当てています。

 

 

Ziyao Huang は Amazon SageMaker Data Wrangler のソフトウェア開発エンジニアです。彼は、お客様が ML を簡単に利用できるようにする優れた製品の開発に情熱を注いでいます。仕事以外では読書をしたり、友達と遊んだりするのが好きです。

 

 

本ブログはソリューションアーキテクトの辻浩季が翻訳しました。原文はこちらです。