Amazon Web Services ブログ

AWS Step Functions を使用した Amazon SageMaker モデルの自動的で連続的なデプロイ

Amazon SageMaker は、モデルの開発、トレーニング、およびデプロイ、ソリューション構築のコスト削減、データサイエンスチームの生産性向上のための完全な機械学習 (ML) ワークフローサービスです。Amazon SageMaker には、多くの事前定義済みアルゴリズムが付属しています。また、Docker イメージ、モデルをトレーニングするためのトレーニングイメージ、および REST エンドポイントにデプロイするための推論モデルを指定して、独自のアルゴリズムを作成することもできます。

機械学習モデルの構築とデプロイを自動化することは、本稼働の機械学習サービスを作成する上で重要なステップです。コードおよび/またはデータが更新されたときは、モデルを再トレーニングしてデプロイする必要があります。このブログ記事では、AWS Step Functions を使用した Amazon SageMaker の自動化の手法について説明します。新しいオープンソースプロジェクトである aws-sagemaker-build を通してそれを実証します。このプロジェクトは私たちのワークフローを完全に実装しています。Python と Amazon Alexa を使用してビルドの作成、起動、停止、進行状況の追跡を行う方法を示す Jupyterノ ートブックも含まれています。 aws-sagemaker-build の目的は、Amazon SageMaker と AWS Step Functions を使用する一般的で有用なパイプラインのリポジトリを提供することです。このリポジトリはコミュニティと共有され、コミュニティによって成長できます。

このコードはオープンソースであり、GitHub のここでホストされています。

カスタムモデル

このブログ記事では、トレーニングや推論のために Dockerfile を作成および設計する方法の詳細については説明しません。詳細については、以下のドキュメントをご覧ください。

必要な AWS のサービス

このソリューションをシンプルに保つために、サーバーレステクノロジーとマネージドサービスに焦点を当てています。トレーニングに時間がかかる場合でも、ソリューションがスケーラブルで費用対効果が高いことが重要です。大規模なニューラルネットワークのトレーニングは、完了するまでに数日かかることもあります。

AWS Step Functions

AWS CloudFormation、AWS Step Functions、AWS CodePipeline、AWS Glue など、ワークフローのオーケストレーションのための AWS のサービスがいくつかあります。ここでのアプリケーションでは、AWS Step Functions がワークフローを実装するための適切なツールとなります。Step Functions はステートマシンのように機能します。初期状態から始まり、AWS Lambda 関数を使用して状態を変換します – 必要に応じて、状態を変更、分岐、ループします。この抽象化により、Step Functions は非常に柔軟になります。最長で 1 年間実行することができ、遷移によってのみ課金されるので、私たちのユースケースにとってスケーラブルで費用対効果の高いツールになります。

AWS CodeBuild

AWS CodeBuild は、オンデマンドのコード構築サービスです。これを使用して Docker イメージを構築し、Amazon Elastic Container Registry (Amazon ECR) リポジトリにプッシュします。詳細は、ドキュメントを参照してください。

AWS Lambda

Step Functions は、Lambda 関数を使用してビルドの作業を行います。トレーニングの開始、トレーニングの状況の確認、CodeBuild の開始、CodeBuild の確認などの関数があります。

1 つの課題は、静的なパラメータ、以前のビルド手順に依存するパラメータ、顧客のニーズに固有のパラメータを考慮して、ビルドのさまざまな段階に設定パラメータを提供する方法を把握することでした。たとえば、トレーニングと推論のイメージ ID をトレーニングとデプロイのステップに渡す必要があり、Amazon S3 バケット名はパイプラインに対して静的であり、トレーニングと推論に使用される ML インスタンスは個々のユーザーが選択する必要があります。その解決策も、Lambda 関数を使用することでした。ビルドの現在の状態を入力として、トレーニングジョブとエンドポイント設定を出力する 2 つの Lambda 関数があります。これらの関数のコードを編集または上書きして、ニーズに合わせることができます。たとえば、Lambda 関数はデータカタログを照会して、データセットの Amazon S3 での場所を取得することができます。

また、Lambda 関数は、CloudFormation スクリプトの設定と解除に必要なさまざまなカスタムリソースにも使用されます。Lambda 関数が含まれるカスタムリソース: スタック削除時の S3 バケットの消去、Jupyter ノートブックの Amazon SageMaker ノートブックインスタンスへのアップロード、SageMaker リソースの消去

AWS Systems Manager パラメータストア

AWS Systems Manager パラメータストアは、耐久性があり、一元化された、スケーラブルなデータストアです。トレーニングジョブやっデプロイのパラメータをここに保存し、Step Functions の Lambda 関数がこのストアからパラメータを照会します。パラメータを変更するには、ストア内の JSON 文字列を変更するだけです。aws-sagemaker-build に含まれているノートブックの例が、これを行う方法を示しています。

Amazon SNS

Amazon Simple Notification service (Amazon SNS) は、ビルドの開始と通知に使用されます。AWS CodeCommit、GitHub、Amazon S3 は、変更が行われると、ビルド開始 SNS トピックに公開することができます。また、ビルドが開始、終了、失敗したときにも通知 SNS トピックに公開することができます。これらのトピックを使って、aws-sagemaker-build を他のシステムに接続することができます。

デプロイメントの手順

Amazon Sagemaker を使用してモデルをデプロイするには、以下の手順を実行する必要があります。

  1. カスタムアルゴリズムを使用している場合は、Docker イメージを構築して Amazon ECR にアップロードします。
  2. Amazon SageMaker のトレーニングジョブを作成し、完了するのを待ちます。
  3. Amazon SageMaker モデルを作成します。
  4. Amazon SageMaker エンドポイント設定を作成します。
  5. SageMaker エンドポイントを作成/更新し、終了するのを待ちます。

これらが、aws-sagemaker-build が Step Functions を使って自動化する手順です。

アーキテクチャ

  • 次の図は、Step Functions ステートマシンのフローを示しています。ステートマシンがポーリングしてタスクが完了するのを待たなければならないポイントがいくつかあります。
  • 次の図は、サービスがどのように連携しているかを示しています。

起動

次の CloudFormation テンプレートは、アカウントにリソースを作成します。リソースには、Amazon SageMaker ノートブックインスタンスと Amazon SageMaker エンドポイントが含まれ、どちらも 1 時間単位で支払うリソースです。

注意: 不要な請求を防ぐため、完了したらこのスタックを破棄してください。

下の [Launch Stack] ボタンをクリックして、aws-sagemaker-build の CloudFormation テンプレートを起動します。CloudFormation スタックの名前を選択し、他のすべてのパラメータはデフォルトのままにします。

テンプレートの作成が完了したら、次の手順に従ってください。

  1. スタックの出力で NoteBookUrl の横のリンクを選択します。
  2. Jupyter ブラウザで SageBuild フォルダを選択します。aws-sagemaker-build の使用方法については、サンプルのノートブックを参照してください。

イベントと通知を設定する

CloudFormation スタックは、更新が発生したときにビルドを開始する CodeCommit リポジトリと S3 バケットを自動的に作成できます。これを行うには、BucketTriggerBuild または BucketTriggerBuild のスタックパラメータをデフォルト以外の値に設定します。CloudFormation テンプレートの出力の LaunchTopic SNS トピックに公開することで、他のイベントで再構築をトリガーすることができます。GitHub リポジトリを設定して変更時に再構築をトリガーするには、このブログ記事の手順に従ってください。また、サブスクライブすることによって、更新する E メールまたはテキストを TrainStatusTopic に送信させることもできます。

Alexa スキル

CloudFormation スタックには、AlexaLambdaArn という名前の出力があります。この Lambda 関数を使って、aws-sagemaker-build を管理する Alexa スキルを作成することができます。

  1. モデル definition:json をダウンロードします。
  2. Lambda 関数は、すでに適切な許可で Alexa によって呼び出されるように設定されています。
  3. まだ持っていない場合は、Amazon Developer アカウントを作成します。これは、AWS アカウントとは異なります。
  4. 以下の手順に従って、Alexa スキルを作成します。
    1. Amazon 開発者コンソールにログインし、[Alexa Skills Kit] タブを選択します。
    2. 次の画面でスキルタイプとして「custom」を選び、スキルに名前を付けます。
    3. 左側のメニューで「Invocation」を選択し、スキルに「sagebuild」などの呼び出し名を付けます。
    4. 左側のメニューで「Endpoint」を選択し、aws-sagemaker-build スタックから AlexaLambdaArn の出力をコピーして、[AWS Lambda Arn] の下の [default region] フィールドに貼り付けます。
    5. 左側のメニューで「JSON Editor」を選択し、ダウンロードしたモデル定義をコピーしてエディターに貼り付けます。
    6. [Save Model] を選択してから、[Build Model] を選択します。



これで、コードの変更をリポジトリにプッシュ (または新しいデータをアップロード) して、少し作業を行い、定期的に Alexa に「Alexa、「私のビルドは完了しましたか?」と SageBuild に聞いてください」と依頼するワークフローができます。 これを完了しましたが、非常に素晴らしいです!

検証

aws-sagemaker-build は、トレーニングの検証はしません。これは、トレーニングジョブが失敗しない場合、そのモデルが現在のモデルよりもパフォーマンスが良くない場合でも、モデルがエンドポイントにデプロイされることを意味します。トレーニングジョブには、モデルを検証し、必要に応じてトレーニングを失敗させるロジックを含める必要があります。

フレームワーク

aws-sagemaker-build は、Bring-Your-Own-Docker (BYOD)、Amazon SageMaker アルゴリズム、TensorFlow、MXNet の 4つの異なる構成をサポートしています。設定は、CloudFormation テンプレートのパラメータとして行いますが、デプロイ後に変更できます。TensorFlow および MXNet の設定の場合、古いバージョンのロールバックまたは再デプロイが正しく機能するように、ユーザスクリプトはコピーされてバージョン名と共に保存されます。aws-sagemaker-build スタックで起動されるノートブックには、それぞれの異なる設定の例があります。

高度

Dev/Prod デプロイメント

まず、CodeCommit リポジトリと Amazon S3 データバケットを作成します。次に、2 つの aws-sagemaker-build スタックを起動します。両方とも先ほど作成したリポジトリと S3 バケットを使います。一方のスタックを「master」ブランチを使用するように設定し、もう一方のスタックは「dev」ブランチを使用するように設定します。

これは、アーキテクチャがどのようになるかを示す図です。

Amazon CloudWatch Events

Amazon CloudWatch Events を使用すると、定期的にスタックの LaunchTopic トピックに公開できます (たとえば、毎日午後 5 時、週に一度金曜日の午後 9 時など)。これは、週の間に開発する小規模な開発データセットがあるワークフローで使用できます。テストした変更をコードブランチにプッシュし、週末にこのブランチを再デプロイするだけです。この方法では、非常に費用がかかる可能性がある、大規模なモデルを常にトレーニングして置き換える必要はありません。

結論、およびご意見募集

このブログ記事が問題解決の助けやヒントとなるなら、ぜひご意見をお聞かせください。 また、GitHub には、皆さんが使用し拡張するためのコードも用意されています。皆さんの貢献を歓迎いたします!

謝辞

Dua, D. and Karra Taniskidou, E.(2017).UCI Machine Learning Repository [http://archive.ics.uci.edu/ml].Irvine, CA: University of California, School of Information and Computer Science.


著者について

John Calhoun は、AWS パブリックセクターの機械学習スペシャリストです。彼は顧客やパートナーと協力して、機械学習の利用でリーダーシップを発揮し、AWS を使用する際の時間を短縮することを手伝っています。彼は顧客やパートナーと協力してさまざまなプロジェクトでリーダーシップを発揮し、AWS を使用する際の時間を短縮することを手伝っています。