Amazon Web Services ブログ

Amazon Sagemaker 推論モデルを構築、テストし、AWS Lambda にデプロイする

Amazon SageMaker は、開発者やデータサイエンティストがあらゆる規模の機械学習 (ML) モデルを迅速かつ簡単に構築、トレーニング、デプロイできるようにする完全マネージド型プラットフォームです。ML モデルをデプロイすると、Amazon SageMaker は ML ホスティングインスタンスを活用してモデルをホストし、推論を提供する API エンドポイントを提供します。AWS IoT Greengrass も使用できます。

ただし、異なるターゲットへのデプロイを可能にする Amazon SageMaker の柔軟性のおかげで、AWS Lambda でモデルをホストするといくつかの利点が得られる場合があります。たとえば、GPU が必要な場合、すべてのモデルを AWS Lambda でホストできるわけではありません。また、AWS Lambda のデプロイパッケージのサイズなどのその他の制限があり、この方法を使用できない場合があります。AWS Lambda を使用できる場合、このアーキテクチャには、低コスト、イベントトリガー、シームレスなスケーラビリティ、スパイクリクエストなどの利点があります。たとえば、モデルが小さく、頻繁に呼び出されない場合、AWS Lambda を使用する方が安価な可能性があります。

この記事では、推論を提供する Lambda 関数を構築、テスト、デプロイするためのパイプラインを作成します。

前提条件

読者は Amazon SageMaker、AWS CloudFormation、AWS Lambda、および AWS Code* スイートの使用経験があると想定しています。

アーキテクチャの説明

CI/CD のパイプラインを作成するには、AWS 開発者用ツールを使用します。このスイートは、AWS CodeDeploy、AWS CodeBuild、および AWS CodePipeline を使用します。以下にアーキテクチャの図を示します。

Amazon SageMaker を使用してモデルをトレーニングすると、出力モデルが Amazon S3 バケットに保存されます。ファイルがバケットに入れられるたびに、AWS CloudTrail は Amazon CloudWatch イベントをトリガーします。このイベントは Lambda 関数を呼び出して、アップロードされたファイルが新しいモデルファイルかどうかを確認します。次に、このファイルを別の S3 バケットに移動させます。Amazon SageMaker は、モデルファイルとともに、チェックポイントなどの他のファイルを異なるフォルダに保存するため、これが必要です。ただし、AWS CodePipeline をトリガーするには、S3 バケットの特定のフォルダに特定のファイルが必要です。

そのため、モデルファイルが Amazon SageMaker バケットから宛先バケットに移動した後、AWS CodePipeline がトリガーされます。最初に、AWS CodePipeline は AWS CodeBuild を呼び出して以下の 3 つのアイテムを作成します。

  • Lambda 関数のデプロイパッケージ。
  • API を作成するための AWS サーバーレスアプリケーションモデル (AWS SAM) テンプレート。
  • 推論に役立つ Lambda 関数。

これが完了すると、AWS CodePipeline は変更セットを実行して、AWS SAM テンプレートを AWS CloudFormation テンプレートに変換します。テンプレートが実行されると、AWS CodeDeploy がトリガーされます。AWS CodeDeploy は Lambda 関数を呼び出して、最新バージョンのモデルで新しく作成された Lambda 関数が期待どおりに動作しているかどうかをテストします。その場合、AWS CodeDeploy はトラフィックを古いバージョンから最新バージョンの Lambda 関数のモデルに移行します。次に、デプロイが完了します。

Lambda 関数のデプロイパッケージの作成方法

パイプラインを生成するために作成した AWS CloudFormation テンプレートには、AWS CodeBuild がこのパッケージを作成する方法を示すセクションを含めました。また、API と Lambda 関数自体を生成するための AWS SAM テンプレートの作成方法についても概説しました。

コード例は次のとおりです。

- "git clone ${GitRepository}"
- "cd ${GitRepositoryName}"
- "rm -rf .git "
- "ls -al "
- "aws s3 cp s3://${SourceBucket}/${SourceS3ObjectKey} ."
- "tar zxf ${SourceS3ObjectKey}"
- "ls -al"
- "pwd"
- "rm -f ${SourceS3ObjectKey}"
- "aws cloudformation package --template-file samTemplateLambdaChecker.yaml --s3-bucket ${SourceBucket} --output-template-file ../outputSamTemplate.yaml"
- "cp samTemplateLambdaChecker.yaml ../"

BuildSpec では、GitHub リポジトリを使用して必要なファイルをダウンロードします。ファイルは、Lambda 関数コード、Lambda 関数チェッカー (AWS CodeDeploy が新しいモデルが期待どおりに動作するかどうかを確認するために使用します)、および AWS SAM テンプレートです。さらに、AWS CodeBuild は S3 から最新の model.tar.gz ファイルをコピーします。

動作するには、Lambda 関数にも Apache MXNet 依存関係が必要です。使用する AWS CloudFormation テンプレートは、Lambda で推論を実行するために必要な MXNet ライブラリを含む Lambda レイヤーを作成します。この記事の焦点ではないので、レイヤーを構築するためのパイプラインを作成していません。次のセクションで、Lambda から MXNet をコンパイルするために使用した手順を見つけることができます。

パイプラインのテスト

先に進む前に、次のように、モデルファイルの移動先の新しい S3 バケットを作成します。

  1. S3 コンソールで、[バケットの作成] を選択します。
  2. [バケット名] には、[カスタム名] を入力します。
  3. リージョンには、パイプラインを作成するリージョンを選択し、[次へ] をクリックします。
  4. [同じバケットにオブジェクトのすべてのバージョンを保持する] を選択してバージョン管理を有効にし、[] をクリックします。
  5. [バケットの作成] を選択します。

このバケットに、次の 3 つのファイルを追加します。

  • empty.zip と呼ばれる zip ファイル中の空のファイル。これは、AWS CodeBuild が機能するために呼び出されたときにファイルを受信する必要があるためです。ただし、この場合、このファイルは使用しません。
  • mxnet-layer.zip ファイル。
  • Amazon SageMaker バケットから バケットをトリガーする AWS CodePipeline にファイルをコピーする zip 関数。

これらのファイルをアップロードするには、次の手順に従います。

  1. S3 を開く
  2. [バケット] を選択します。
  3. [アップロード] ページで、[ファイルを追加] をクリックして、zip ファイルを選択します。
  4. [アップロード] を選択できるまで、[次へ] をクリックします。

この新しいバケットを作成したので、テンプレートのダウンロード後に AWS CloudFormation テンプレートを起動できます。

  1. AWS CloudFormation を開く
  2. [スタックを作成] を選択します。
  3. [テンプレートを選択] では、[テンプレートを Amazon S3 にアップロード] をクリックし、ファイルを選択します。
  4. [次へ] を選択します。
  5. スタック名を追加します。
  6. SourceS3Bucket を以前に作成したバケット名に変更します。
  7. [次へ] を選択してから、[次へ] をクリックします。
  8. [AWS CloudFormation がカスタム名で IAM リソースを作成する場合があることを認識しています] を選択します。
  9. [作成] を選択します。

 

これにより、ユーザーに代わってパイプラインが作成され、必要なものすべてがデプロイされます。Amazon SageMaker でモデルをトレーニングする場合、AWS CloudFormation テンプレートによって作成された S3 バケットが、出力モデルをホストする必要があるバケットであることを示す必要があります。S3 バケットの名前を見つけるには、次の手順に従います。

  1. AWS CloudFormation を開く
  2. [スタック名] を選択します。
  3. [リソース] を選択し、ModelS3Location を見つけます。

新しいモデルが Amazon SageMaker によってトレーニングされ、S3 にアップロードされたことをシミュレートするには、以前にトレーニングして GitHub のここにアップロードしたモデルをダウンロードします。

ダウンロードが完了したら、作成した S3 バケットにファイルをアップロードできます。このモデルは、カリフォルニア大学が提供する SMS Spam Collection データセットからトレーニングされています。また、このモデルのトレーニング方法をカバーする re:Invent 2018 のワークショップを見ることもできます。この単純なデータセットは、Apache MXNet に基づき、Gluon を使用したニューラルネットワークでトレーニングされました。

  1. S3 を開く
  2. ModelS3Location バケットを選択します。
  3. [アップロード]、[ファイルを追加] をクリックし、zip ファイルを選択します。
  4. [次へ] を選択し、[アップロード] をクリックします。

次の画像に示すように、AWS CodeDeploy コンソールから、プロセスが開始されたことを確認できるはずです。

プロセスが完了すると、AntiSpamAPI と呼ばれる新しい AWS CloudFormation スタックが作成されたことがわかります。前に説明したように、この新しいスタックは Lambda 関数と、推論を提供する API を作成しました。エンドポイントを直接呼び出すことができます。最初に、エンドポイント URL を見つけます。

  1. AWS CloudFormation コンソールで、[AntiSpamAPI] を選択します。
  2. [リソース] を選択し、ServerlessRestApi を見つけます。
  3. ServerlessRestApi リソースを選択します。これにより、API Gateway コンソールが開きます。
  4. API Gateway コンソールから、[AntiSpamAPI] を選択します。
  5. [ステージ]、[製品] を選択します。
  6. [URL を呼び出す] をコピーします。

エンドポイント URL を取得したら、次のように、筆者が作成したこのサンプルページを使用してテストできます。

たとえば、生の出力からわかるように、前の文がスパムである確率が 99%であると判断できます。

まとめ

この記事が、AWS 開発者ツールを使用してモデルを Lambda 関数に自動的にデプロイする方法を理解するのに役立つことを願っています。パイプラインを使用すると、サーバーレスアーキテクチャでモデルを使用することに伴うオーバーヘッドを削減できます。小さな変更を加えると、このパイプラインを使用して、Amazon Deep Learning AMIAWS Deep Learning Containers やオンプレミスなど、どこでもトレーニングできるモデルをデプロイできます。

ご質問やご提案などについては、GitHub で共有するか、コメントを残してください。


著者について

Diego Natali は、イタリアのアマゾン ウェブ サービスに勤務するソリューションアーキテクトです。 エンジニアリングとして長年のバックグラウンドを持ち、ISV やスタートアップの顧客とともに、AWS を利用した柔軟性と復元力の高いアーキテクチャの設計に携わっています。余暇の楽しみは、映画鑑賞とオフロードバイクに乗ることです。