Amazon Web Services ブログ

MLOps を適用して、Amazon Forecast で AI を利用した予測の自動化を構築する

この投稿では、Amazon Forecast で構築された予測モデルを開発して視覚化するために、サーバーレス Machine Learning Operations (MLOps) パイプラインを作成する方法を示します。Machine Learning (ML) のワークロードはスケーリングする必要があるため、ビジネス価値を得るために、さまざまな利害関係者間のサイロを取り除くことが重要です。MLOps モデルにより、データサイエンス、プロダクション、および運用の各チームが、可能な限り自動化されたワークフロー全体でシームレスに連携することができ、スムーズなデプロイと効果的かつ継続的なモニタリングが確実に行われるようにします。

ソフトウェア開発の DevOps モデルと同様に、ML の MLOps モデルは、ML ツールとフレームワーク全体におけるコードの構築と統合をサポートします。カスタムコードを書き直したり、既存のインフラストラクチャを再考したりすることなく、データパイプラインを自動化、運用、およびモニタリングできます。MLOps は、既存の分散ストレージと処理インフラストラクチャをスケーリングして、ML モデルを大規模にデプロイして管理するのに役立ちます。また、組織全体のすべてのモデルのドリフトを、一元化された場所で経時的に追跡および視覚化して、自動データ検証ポリシーを実装することもできます。

MLOps は、継続的な統合、継続的なデプロイ、および継続的なトレーニングを適用することにより、DevOps と ML の世界のベストプラクティスを組み合わせています。MLOps は、本番環境における ML ソリューションのライフサイクルを合理化するのに役立ちます。詳細については、Machine Learning Lens: AWS Well-Architected Framework と題したホワイトペーパーを参照してください。

以降のセクションでは、Amazon Forecast、AWS Lambda、およびAWS Step Functions を含む MLOps パイプラインを活用して、時系列予測モデルを構築、トレーニング、およびデプロイします。生成された予測を視覚化するには、Amazon AthenaAmazon QuickSight などの AWS サーバーレス分析サービスの組み合わせを使用します。

ソリューションのアーキテクチャ

このセクションでは、Amazon Forecast の使用とデプロイを自動化するための青写真として使用できる MLOps アーキテクチャをデプロイします。提供されているアーキテクチャとサンプルコードは、時系列データの MLOps パイプラインを構築するのに役立ち、予測を生成して将来のビジネス戦略を定義し、お客様のニーズを満たすことができます。

AWS が管理するサービスを使用してこのサーバーレスアーキテクチャを構築できます。つまり、ML パイプラインを作成するときにインフラストラクチャの管理について心配する必要はありません。これにより、新しいデータセットを反復処理し、機能とハイパーパラメータを調整してパフォーマンスを最適化することでモデルを調整できます。

次の図は、この投稿で作成するコンポーネントを示しています。

上の図では、Step Functions ワークフローを使用してサーバーレス MLOps パイプラインがデプロイされています。このワークフローでは、Lambda 関数がつなぎ合わされて、Amazon Forecast をセットアップし、結果を Amazon Simple Storage Service (Amazon S3) にエクスポートするために必要な手順を調整します。

アーキテクチャには次のコンポーネントが含まれます。

  • 時系列データセットは、/train ディレクトリ (プレフィックス) の下の Amazon S3 クラウドストレージにアップロードされます。
  • アップロードされたファイルは Lambda をトリガーします。Lambda は、Step Functions ステートマシンを使用して構築された MLOps パイプラインを開始します。
  • ステートマシンは、一連の Lambda 関数をつなぎ合わせて、Amazon Forecast で ML モデルを構築、トレーニング、およびデプロイします。ステートマシンの Lambda コンポーネントの詳細については、次のセクションで詳細を説明します。
  • ログ分析のために、ステートマシンは、Forecast のメトリクスをキャプチャする Amazon CloudWatch を使用します。/forecast ディレクトリのソース Amazon S3 バケットで最終予測が利用可能になったときに、Amazon Simple Notification Service (Amazon SNS) を使用して E メール通知を送信します。ML パイプラインは、古い予測を /history ディレクトリに保存します。
  • 最後に、Athena と QuickSight を使用して、現在の予測を視覚的に表現します。

この投稿では、UCI Machine Learning Repository にある個別家庭の電力消費データセットを使用します。時系列データセットは、さまざまなお客様の家庭における 1 時間あたりのエネルギー消費量を集計し、平日におけるエネルギー使用率の急上昇を示しています。後のユースケースでは、必要に応じてサンプルデータを置き換えることができます。

これでアーキテクチャに慣れることができたので、ステートマシンの各 Lambda コンポーネントの詳細について学習する準備ができました。

Step Functions を使用して MLOps パイプラインを構築する

前のセクションでは、Step Functions ステートマシンが、MLOPs パイプライン全体を自動化するアーキテクチャの中核であることを学びました。次の図は、ステートマシンを使用してデプロイされたワークフローを示しています。

前の図に示すように、Step Functions ワークフローの Lambda 関数は次のとおりです (この手順では、Lambda 関数と、Amazon S3 に保存されている params.json ファイルから使用されるパラメータとの間のマッピングも強調表示しています)。

  • Create-Dataset – Forecast データセットを作成します。データセットに関する情報は、Forecast がモデルのトレーニングのためにデータを利用する方法を理解するのに役立ちます。
  • Create-DatasetGroup – データセットグループを作成します。
  • Import-Data – データセットグループ内にあるデータセットにデータをインポートします。
  • Create-Predictor – パラメータファイルが指定する予想期間を使用して予測子を作成します。
  • Create-Forecast – 予測を作成し、Amazon S3 へのエクスポートジョブを開始します (パラメータファイルで指定された分位数を含みます)。
  • Update-Resources – 必要な Athena リソースを作成し、エクスポートされた予測を入力データセットと同じ形式に変換します。
  • Notify Success – Amazon SNS にメッセージを投稿して、ジョブが終了したときに E メールでアラートを送信します。
  • Strategy-Choice – パラメータファイルに従って、Forecast リソースを削除するかどうかを確認します。
  • Delete-Forecast – 予測を削除し、エクスポートされたデータを保持します。
  • Delete-Predictor – 予測子を削除します。
  • Delete-ImportJob – Forecast の Import-Data ジョブを削除します。

Amazon Forecast では、データセットグループは、予測の特定のコレクションのすべてのデータセットを含む抽象概念です。データセットグループ間での情報共有はありません。 スキーマのさまざまな代替案を試すには、新しいデータセットグループを作成し、対応するデータセット内で変更を加えます。詳細については、データセットおよびデータセットグループを参照してください。このユースケースでは、ワークフローはターゲットの時系列データセットをデータセットグループにインポートします。

これらの手順を完了すると、ワークフローは予測子のトレーニングジョブをトリガーします。予測子は、時系列データに基づいて予測を行うために使用される Forecast トレーニング済みモデルです。詳細については、予測子を参照してください。

予測子がトレーニングされると、ワークフローはその予測子を使用して予測の作成をトリガーします。予測の作成中、Amazon Forecast はモデルをホストして推論を行う前に、データセット全体でモデルをトレーニングします。詳細については、予測 を参照してください。

ステートマシンは、正常な予測エクスポートのデプロイ時に指定されたアドレスに通知メールを送信します。予測をエクスポートした後、Update-Resources の手順はエクスポートされたデータを再フォーマットするため、Athena および QuickSight は簡単にデータを利用できます。

この MLOps パイプラインを再利用して、各手順の Lambda 関数のアルゴリズムとデータセットを置き換えることにより、他の ML モデルを構築、トレーニング、およびデプロイできます。

前提条件

アーキテクチャをデプロイする前に、前提条件となる以下の手順を完了してください。

  1. Git をインストールします。
  2. AWS サーバーレスアプリケーションモデル (AWS SAM) CLI をシステムにインストールします。手順については、AWS SAM CLI のインストールを参照してください。次のコードで最新バージョンがインストールされていることを確認してください。
    sam --version 

AWS アカウントにサンプルアーキテクチャをデプロイする

デプロイを簡素化するために、この投稿では、アーキテクチャ全体を AWS CloudFormation を使用する Infrastructure as Code として提供します。これは Forecast Visualization Automation Blogpost GitHub リポジトリで入手できます。AWS SAM を使用してこのソリューションをデプロイします。

  1. Git リポジトリのクローンを作成します。次のコードを参照してください。
    git clone https://github.com/aws-samples/amazon-forecast-samples.git

    このコードは、Forecast Visualization Automation Blogpost GitHub リポジトリでも入手できます。

  2. 新しく作成された amazon-forecast-samples/ml_ops/visualization_blog ディレクトリに移動し、次のコードを入力してソリューションのデプロイを開始します。
    cd amazon-forecast-samples/ml_ops/visualization_blog
    
    sam build && sam deploy --guided
    

    この段階で、AWS SAM は CloudFormation テンプレート変更セットを構築します。数秒後、AWS SAM から CloudFormation スタックをデプロイするように求められます。

  3. スタックデプロイのパラメータを指定します。この投稿では次のパラメータを使用しています。 デフォルトのパラメータを維持できます。
    Setting default arguments for 'sam deploy'
    	=========================================
    	Stack Name [ForecastSteps]:  <Enter Stack Name e.g.  - forecast-blog-stack>
    	AWS Region [us-east-1]: <Enter region e.g. us-east-1>
    	Parameter Email [youremail@yourprovider.com]: <Enter valid e-mail id>
    	Parameter ParameterFile [params.json]: <Leave Default>
    	#デプロイするリソースの変更を示します。デプロイを開始するには「Y」が必要です
    	Confirm changes before deploy [Y/n]: y
    	#SAM には、テンプレート内のリソースに接続するためのロールを作成できるアクセス許可が   
            必要です
    	Allow SAM CLI IAM role creation [Y/n]: y
            Save arguments to samconfig.toml [Y/n]: n 
    

    AWS SAM は AWS CloudFormation 変更セットを作成し、確認を求めます。

  4. Y と入力します。

変更セットの詳細については、変更セットを使用したスタックの更新を参照してください。

デプロイが成功すると、次の出力が表示されます。

CloudFormation outputs from the deployed stack
------------------------------------------------------------
Outputs                                                                                                                                
-------------------------------------------------------------
Key                 AthenaBucketName                                                                                                   
Description         Athena bucket name to drop your files                                                                              
Value               forecast-blog-stack-athenabucket-1v6qnz7n5f13w                                                                     

Key                 StepFunctionsName                                                                                                  
Description         Step Functions Name                                                                                                
Value               arn:aws:states:us-east-1:789211807855:stateMachine:DeployStateMachine-5qfVJ1kycEOj                                 

Key                 ForecastBucketName                                                                                                 
Description         Forecast bucket name to drop your files                                                                            
Value               forecast-blog-stack-forecastbucket-v61qpov2cy8c                                                                    
-------------------------------------------------------------
Successfully created/updated stack - forecast-blog-stack in us-east-1
  1. AWS CloudFormation コンソールの [出力] タブで、テスト手順で使用する ForecastBucketName の値を記録します。

サンプルアーキテクチャをテストする

次の手順は、サンプルアーキテクチャをテストする方法の概要です。Step Functions ワークフローをトリガーするには、新しく作成された S3 バケットにパラメータファイルと時系列トレーニングデータセットの 2 つのファイルをアップロードする必要があります。

  1. GitHub リポジトリのクローンを作成したのと同じディレクトリで、次のコードを入力します。YOURBUCKETNAME を、前にコピーした AWS CloudFormation の [出力] タブの値に置き換えます。
    aws s3 cp ./testing-data/params.json s3://{YOURBUCKETNAME}

    上記のコマンドは、Lambda 関数が Forecast API 呼び出しを設定するために使用するパラメータファイルをコピーしました。

  2. 次のコードを入力して、時系列データセットをアップロードします。
    aws s3 sync ./testing-data/ s3://{YOURBUCKETNAME}
  3. Step Functions ダッシュボードで、DeployStateMachine-<random string> という名前のステートマシンを見つけます。
  4. 実行中のワークフローを探すためのステートマシンを選択します。

上のスクリーンショットでは、正常に実行されたすべての手順 (Lambda 関数) が緑色のボックスに表示されています。青いボックスは、手順がまだ進行中であることを示しています。色が付いていないすべてのボックスは、実行が保留されている手順です。このワークフローのすべての手順を完了するには、最大 2 時間かかる場合があります。

ワークフローが正常に完了したら、Amazon S3 コンソールに移動して、次のディレクトリを持つ Amazon S3 バケットを見つけることができます。

/params.json    # パラメータファイル。
/train/         # トレーニング CSV ファイルの保存場所
/history/       # 以前の予測が保存されている場所
/history/raw/   # 未加工の Amazon Forecast エクスポートファイルが含まれています
/history/clean/ # 以前に処理された Amazon Forecast エクスポートファイルが含まれています
/quicksight/    # train データセットに従って最新の予測が含まれています
/tmp/           # Amazon Forecast ファイルが処理前に一時的に保存される場所

パラメータファイルである params.json は、Lambda 関数から Forecast API を呼び出すための属性を格納します。これらのパラメータ設定には、予測ドメイン、頻度、およびディメンションに加えて、予測タイプ予測子設定、およびデータセット設定などの情報が含まれています。API アクションの詳細については、Amazon Forecast Service を参照してください。

データが Amazon S3 にあるので、結果を視覚化できます。

Athena と QuickSight を使用して予測データを分析する

予測パイプラインを完了するには、データをクエリして視覚化する必要があります。Athena は、標準 SQL を使用して Amazon S3 のデータを簡単に分析できるインタラクティブなクエリサービスです。QuickSight は、クラウドを利用した高速のビジネスインテリジェンスサービスであり、データの視覚化を通じて洞察を簡単に発見できます。データの分析を開始するには、まずデータソースとして Athena を使用してデータを QuickSight に取り込みます。

AWS を初めて使用する場合は、QuickSight を設定して QuickSight アカウントを作成します。AWS アカウントがある場合は、QuickSight にサブスクライブしてアカウントを作成してください。

QuickSight で Athena を初めて使用する場合は、Athena を使用して Amazon S3 にクエリを実行するためのアクセス許可を QuickSight に付与する必要があります。詳細については、Athena を Amazon QuickSight で使用する場合のアクセス権限の不足を参照してください。

  1. QuickSight コンソールで、[新しい分析] を選択します。
  2. [新しいデータセット] を選択します。
  3. [Athena] を選択します。
  4. [新しい Athena データソース] ウィンドウで、[データソース名] に名前を入力します (例: Utility Prediction)。
  5. [接続を検証] を選択します。
  6. [データソースを作成] を選択します。

[テーブルの選択] のウィンドウが表示されます。

  1. [カスタム SQL を使用] を選択します。
  2. [カスタム SQL クエリの入力] ウィンドウで、クエリの名前を入力します (例: Query to merge Forecast result with training data)。
  3. クエリテキストボックスに次のコードを入力します。
    SELECT LOWER(forecast.item_id) as item_id,
             forecast.target_value,
             date_parse(forecast.timestamp, '%Y-%m-%d %H:%i:%s') as timestamp,
             forecast.type
    FROM default.forecast
    UNION ALL
    SELECT LOWER(train.item_id) as item_id,
             train.target_value,
             date_parse(train.timestamp, '%Y-%m-%d %H:%i:%s') as timestamp,
             'history' as type
    FROM default.train
    
  4. [クエリの確認] をクリックします。

これで、データを SPICE にインポートするか、データを直接クエリすることができるようになりました。

  1. いずれかのオプションを選択し、次に [視覚化する] をクリックします。

[フィールドリスト] では、以下のフィールドが表示されます。

  • item_id
  • target_value
  • timestamp
  • type

エクスポートされた予測には、次のフィールドが含まれています。

  • item_id
  • date
  • リクエストされた分位数 (P10、P50、P90)

type フィールドには、予測された期間の分位点タイプ(P10、P50、P90)と、トレーニングデータの値としての historyが含まれます。これは、履歴データとエクスポートされた予測との間の整合性のある履歴線を取得するために、カスタムクエリを介して行われました。

ForecastType という名前の CreateForecast API オプションパラメータを使用して、分位数をカスタマイズできます。この投稿では、Amazon S3 の params.json ファイルでこれを設定できます。

  1. X 軸には、timestamp を選択します。
  2. [] には、target_value を選択します。
  3. [] には、type を選択します。

パラメータで、72 時間の期間を指定しました。結果を視覚化するには、timestamp フィールドを 1 時間ごとに集計する必要があります。

  1. timestamp のドロップダウンメニューから、[集計] および [時間] を選択します。

次のスクリーンショットは、最終的な予測を予想したものです。グラフは、確率的予測が生成される分位数の p10、p50m、および p90 における将来予測を示しています。

まとめ

すべての組織は、より正確な予測があることで、製品の需要をより適切に予測し、計画とサプライチェーンを最適化するなどの恩恵を受けることができます。需要の予測は困難な作業であり、ML は予測と現実の間のギャップを狭めることができます。

この投稿では、AI を利用した繰り返し可能な自動予測生成プロセスを作成する方法を示しました。また、サーバーレステクノロジーを使用して ML オペレーションパイプラインを実装する方法を学び、マネージド型の分析サービスを使用して、データをクエリし、視覚化を作成することでデータの洞察を取得しました。

Forecast でできることはまだまだあります。エネルギー消費量の予測の詳細については、Amazon Forecast を使用して正確なエネルギー消費量を予測するを参照してください。分位数の詳細については、Amazon Forecast で自由選択した分位数での予測作成のサポートを開始を参照してください。

この投稿が問題の解決に役立ったり、問題の解決のヒントになったりした場合は、お考えやご質問をコメントでお寄せいただき、共有してください。GitHub リポジトリでコードを使用および拡張できます。


著者について

Luis Lopez Soria 氏は、AWS 機械学習チームと連携する AI/ML スペシャリストソリューションアーキテクトです。彼は、AWS のお客様と連携して、大規模な機械学習の導入をサポートしています。スポーツを楽しんだり、世界中を旅したり、新しい食べ物や文化を探求したりしています。

 

 

 

Saurabh Shrivastava 氏は、ソリューションアーキテクトリーダー兼 AI/ML スペシャリストであり、世界で活躍するシステムインテグレーターと連携しています。Saurabh は AWS のパートナーおよびお客様と連携して、ハイブリッド環境と AWS 環境でスケーラブルアーキテクチャを構築するためのアーキテクチャ面でのガイダンスを提供しています。彼は家族とアウトドアで過ごしたり、新しい場所に旅して未知の文化を発見したりすることを楽しんでいます。

 

 

 

Pedro Sola Pimentel 氏は、R&D ソリューションアーキテクトであり、AWS ブラジルの商用チームと連携しています。彼は AWS と連携して、新しいテクノロジーとサービスを使用して、ソリューションを革新および開発しています。最先端のコンピューターサイエンスの研究トピックに興味があり、旅行や映画鑑賞を楽しんでいます。