Amazon Web Services ブログ

AWS 内部ユースケース : AWS マーケティングにおける Amazon SageMaker の評価と採用

こんにちは。AWS マーケティングデータサイエンスチームです。 高度な分析および機械学習 (ML) 技術を使用して、セールスリードのML 主導スコアリング、ML によるセグメントをターゲティング化、およびダウンストリームへのインパクト測定の計量モデルといった、AWS のお客様のライフサイクル全体にわたるビジネス上の問題解決に向けて、お客様とともに取り組みます。

アマゾン内では、各チームが独立して運営されており、独自のテクノロジースタックの選択方法や、お客様が利用する AWS サービスの採用方法に関して意思決定を行います。 これにより、各チームは各自のロードマップを管理できます。 結果、サービス評価と採用が類似したものとなって、ML の経験がまだこれからというお客様にお役に立てることでしょう。 このブログでは、Amazon SageMaker サービスの評価に関して、初めの一歩を踏み出す情報をお届けしますので、皆さまのお役に立てれば何よりです。 AWS サービスをどう利用して、ビジネス目標を達成し ML モデルを拡張するか、といった最新情報をお届けしていきます。

このブログ記事では、Amazon SageMaker を使用して、独自の ML トレーニングおよびホスティングインフラストラクチャを置き換えるための実証支援 (POC) をどう実施するか、当社の経験をシェアしたいと思います 。 当社の既存の ML インフラストラクチャは、データ処理パイプラインを管理する Amazon の内部ワークフローツールと、モデルの構築、トレーニング、およびホストのための Amazon EC2 インスタンスで構成されています。 こうしたインフラストラクチャ管理に多大な時間を費やしており、それが Amazon SageMaker サービスをより高めていく動機となりました。

POC は、Amazon SageMaker の機能と性能を調べ、インフラストラクチャの作業と運用の複雑さを最小限に抑えます。 鍵となるワークストリームは次の 3 つです。

  1. AWS IT セキュリティチームと協力して、データセキュリティとコントロールを特定し、実装。
  2. Amazon SageMaker の既存のMLモデルの 1 つを、「 Bring your own algorithm (BYOA) 」 ( 独自のアルゴリズムを活用する ) ( ユースケース 1) を使用しての、移行およびホスティング。
  3. ビルトイン Amazon SageMaker アルゴリズム ( ユースケース 2) を使用しての、同じ ML モデルをトレーニングおよびホスティング。

このブログ記事では、3 つのワークストリームについて詳しく説明します。

AWS IT セキュリティチームと協力して、データのセキュリティとコントロールの特定および実装。

AWS IT Security と協力して、さまざまな脅威を特定し、実際のデータを使ってモデルを構築およびトレーニングする前に、開発環境に必要なセキュリティコントロールを実装しました。 AWS IT セキュリティチームの承認を得るのに実装した主なセキュリティコントロールは次のとおりです。

ユーザー、ロール、および暗号化キーの設定 : モデルをトレーニングするのに、Amazon S3 にデータを保存する必要がありました。 Amazon S3 バケットのデータ暗号化には、AWS KMS 管理キー (SSE-KMS) を使用して、サーバー側の暗号化を実装しました。

以下、セットアップの手順です。

  1. AmazonSageMakerFullAccess のポリシーも含む、IAM ユーザー (poc-sagemaker-iam-user2) の作成。
  2. AmazonSageMakerFullAccess に基づき、IAM ロール (poc-sagemaker-iam-role) を作成。
  3. IAM ユーザーと IAM ロールの両方がキーを使用できるよう s3-smcmk の名前がついた暗号化キーを作成。 これで、poc-sagemaker-iam-role という Amazon SageMaker のトレーニングジョブが、キーを使ってトレーニングデータを読み取ることができるようになります。
  4. Amazon SageMaker ノートブックインスタンスがデータへの読み取りアクセス権を持ち、ローカルストレージの暗号化もするよう、同じ IAM ロールと暗号化キーを持つノートブックインスタンスを作成。

IAM ユーザー、ロールおよび暗号化キーを設定すると、Amazon S3 バケットアクセスポリシー設定に関係なく、暗号化キーを使用して、ユーザーまたはロールのみがトレーニングデータを読み取ることができるようになります。

認証情報の保護 : secrets vault に AWS アカウントのアクセス ID 、シークレット ID 、パスワードなどのすべてのセキュリティ認証情報を保存しました。 認証情報は、構成ファイルまたはソースコードに保存しないでください。 最近発表した AWS Secrets Manager サービスは、認証情報とキーの保存に利用できます。

データの準備

Amazon SageMaker のモデルトレーニングでは、事前処理したデータを Amazon S3 で使用できるようになりました。 poc-sagemaker-iam-user2 ユーザーを使ってSSE-KMS 暗号化オプションとともに Amazon S3 バケットを作成し、セキュリティコントロールのセットアップ中に作成した s3-smcmk 暗号化キーを使用しました。 s3-smcmkpoc-sagemaker-iam-user2 および poc-sagemaker-iam-role の両方が利用できるよう設定し、誰がデータへのアクセス権を持っているかをチェックおよびコントロールできるセンターとなるようにしました。

Amazon RedShift データウェアハウス (DW) クラスタでモデルトレーニングデータを前処理し、トレーニング、検証、およびテストデータセットを含む 3 つの DW テーブルを作成しました。 Amazon RedShift には、SQL ステートメントを実行してデータ結果を Amazon S3 バケットに保存する機能があります。 これを達成するために、「 Unload 」コマンドを使用して、事前設定した Amazon S3 バケットにデータをロードすることができます。 「 Unload 」コマンドの詳細は こちらに、データにアクセスするための認証パラメータに関する詳細はこちらにあります。 前処理したデータセットを Amazon S3 へアンロードするのに使用した SQL ステートメントは次のとおりです。

UNLOAD('<put your select statement here>') 
to '<put the full location path of Amazon S3 bucket for the output file>'
ACCESS_KEY_ID '<we used poc-sagemaker-iam-user2 Access Key here>'
SECRET_ACCESS_KEY '<we used poc-sagemaker-iam-user2 Secret Key here>'
KMS_KEY_ID '<we used keyid of s3-smcmk here>'
DELIMITER AS ',' NULL AS '' ENCRYPTED ALLOWOVERWRITE PARALLEL OFF

データボリュームが少ない場合は、Amazon SageMaker ノートブックインスタンスを使用して、データをデータソースから直接メモリにロードし、トレーニング、検証、およびテストデータセットにデータを分割し、3 つのデータセットを全て Amazon S3 バケットに保存してください。 この場合、データボリュームを処理するのに必要なリソース (CPU 、ディスク、メモリ) を持つノートブックインスタンスのタイプを選択する必要があります。この SQL コマンドは例示です。 poc-sagemaker-iam-user2 は、データおよび Amazon S3 でアンロードしたデータを暗号化するためのキーである s3-smcmk をアンロードする際の権限です。 明らかなセキュリティ上の理由から、コード上のアクセスキーとシークレットキーをハードコード化したり、プレーンテキストの設定ファイルから読み込んだりしていませんでした。 そのかわり、それらのキーを secrets vault に保存しました。 AWS Secrets Manager を使えば、こうしたことが可能です。 これらのシークレットにプログラムでアクセスし、実行時に SQL コマンドを生成しました。 SQL コマンドを生成する際に、データセット結果の最初の列が従属変数で、残りの列は独立変数です。 これは、評価に使用されるビルトイン SageMaker XGBoost アルゴリズムが必要とする特定のフォーマットです。

Amazon SageMaker ノートブックインスタンスの起動

「 Bring your own algorithm 」 ( ユースケース 1) か、ビルトインアルゴリズム ( ユースケース 2 ) 使用のいずれかを学ぶには、まず、モデル構築、トレーニング、ホスティング用のこれらの手順を利用して、Amazon SageMaker ノートブックインスタンスを作成するのがよいでしょう。 IAM ロールの poc-sagemaker-iam-role 、およびノートブックインスタンスを作成した時の s3-smcmk 暗号化キーを使用しました。

その後、Amazon SageMaker が管理するインフラストラクチャで、ML モデルのトレーニングとホスティングの両方の POC ユースケースのコードを記述し、実行しました。 トレーニング手順の詳細はこちらにあります。

POC ユースケース 1: Amazon SageMaker 「 Bring-Your-Own-Algorithm 」機能の使用

このユースケースでは、ML モデルトレーニングおよび ML 推論に、Rコードを再利用しました。  「 Bring-Your-Own-Algorithm 」機能を使用して、そのコードを Amazon SageMaker に移行しました。 移行を完了するのに、次の手順を行いました。

  • R の環境で Docker イメージを作成し、モデルに必要な R のライブラリをインストールしました。 R の環境で Docker イメージを構築するサンプルの Dockerfile がここから利用可能です。 デフォルトの Ubuntu リポジトリを使用する代わりに、最新バージョンの R 、関連する依存パッケージ、および XGBoost ライブラリを CRAN リポジトリからインストールするよう、Dockerfile をカスタマイズしました。 こうした手順が必要なのは、このモデルが Ubuntu リポジトリで利用可能なものよりも新しいバージョンの R を必要とする XGBoost ライブラリを使用しているためです。 上記を実行するのに、Dockerfile に次の 2 行のコードを追加しました :
    RUN echo "deb http://cloud.r-project.org/bin/linux/ubuntu xenial/" >> /etc/apt/sources.list
    RUN R -e "install.packages(c('xgboost','caret','e1071','plumber'),repos='https://cloud.r-project.org')"

    コードの最初の行は、Dockerfile の最初の RUN コマンドである必要があります。  これで、後続の RUN コマンドによって、Ubuntu リポジトリではなく CRAN リポジトリから R の環境がインストールされます。

  • さらに、R のコードを Docker イメージに統合しました。 こちらので必要な手順を示していますので、参照してください。 まとめると、mars.R の train 機能をトレーニングコードで、Plumber.R の呼び出し機能を推論コードで更新したことになります。
  • Docker イメージをローカルマシンでテストしました。 まず、Amazon SageMaker がトレーニング中に Docker コンテナに利用できるフォルダ構造 ( 図1 ) を作成しました。 これらのフォルダには、トレーニングおよび検証データセットとハイパーパラメータ設定ファイルが格納されていました。

    図1 : ローカル Docker イメージテスト用のフォルダ構造 詳細については、こちらをクリックしてください。

    その後、Docker コンテナを起動し、このフォルダ構造を Docker ファイルシステムにマウントしました。 Docker コンテナをローカルテストのトレーニングモードで起動するのに、次のコマンドを使用しました。

    docker run -v $(pwd)/ml:/opt/ml -t {image name} train

    さらに、R のコードを変更して、マウントしたフォルダ構造からトレーニングおよび検証データセットとハイパーパラメータ設定を読み込みました。 これにより、Docker コンテナが Amazon SageMaker 内で起動したときに Docker コンテナが持つファイルシステムをシミュレートすることが可能となりました。

  • Docker イメージが意図した通りに機能したのを確認してから、Docker イメージを Amazon Elastic Container Registry (Amazon ECR) に構築、プッシュしました。 詳細なコマンドについての利用可能なサンプルスクリプトは、こちらを参照してください。
  • 次に、Amazon SageMaker ノートブックインスタンスを使用して、公開した Docker イメージと Amazon S3 バケットのトレーニングおよび検証データセットの利用を設定したトレーニングジョブを開始しました。 トレーニング完了後、モデル、エンドポイント構成、最後にモデルをホストするエンドポイントを作成しました。 テストデータセットの推論を生成するために、エンドポイントを使用しました。 詳細な手順について、利用可能な例をこちらから参照できます。

次の表は、SageMaker を最初のユースケースとして利用した場合のメリットとデメリットを示しています。

メリット
  • モデルトレーニングと推論用の既存のコードが再利用可能。
  • 移行プロセスを簡単にする、優れたドキュメントとサンプルコードが利用可能。
デメリット
  • Amazon ECR で独自の Docker イメージを作成および管理するため、操作が複雑。
  • Amazon SageMaker をホストしたモデルエンドポイントは、リアルタイムでの推論の呼び出しごとに最大 5 MB を受け入れることができます。 バッチ推論のための追加コードが必要です ( 後のセクションで説明します ) 。
  • Docker イメージを構築し、ECR 、ローカルテストなどに保存するというような、いくつかのプラットフォームスキルをチームが習得する必要があります。

POC ユースケース 2: ビルトイン Amazon SageMaker アルゴリズムの使用

このユースケースでは、独自の Docker イメージの構築と管理の負担を減らすことが目標でした。 なので、独自の Docker イメージ ( 最初の POC ユースケースにて概説 ) の代わりに、Amazon SageMaker が管理する Docker イメージを XGBoost アルゴリズムに使用し、ML モデルをトレーニングしホストしました。

ビルトイン SageMaker アルゴリズムを使うには、トレーニングと推論プロセス中に SageMaker が管理する Docker イメージを XGBoost に使用するだけでした。 必要な手順を示すこちらの例を参照できます。 ビルトイン SageMaker XGBoost アルゴリズムは、単一または複数のインスタンスでトレーニングすることができます。 トレーニングパラメータの “ResourceConfig: InstanceCount” 値を変更し、分散トレーニングが可能となりました。 以下は、分散トレーニング用の構成スニペットです。

次の表は、SageMaker を 2 つ目のユースケースとして使用する場合のメリットとデメリットを示しています。

メリット
  • トレーニングと推論 Docker イメージを維持するために使う多大な労力を軽減。 モデルのデプロイおよびメンテナンスの際の、運用上の複雑さが軽減。
  • ビルトイン Amazon SageMaker XGBoost アルゴリズムにより、分散環境でのトレーニングが可能。
デメリット
  • SageMaker がホストするモデルエンドポイントは、リアルタイムでの推論の呼び出しごとに最大 5 MB を受け入れることができます。 バッチ推論のための追加コードが必要です ( 後のセクションで説明します ) 。

バッチ推論のための Amazon SageMaker エンドポイントの使用

Amazon SageMaker には、SageMaker でホストしているモデルから推論を取得するために使用する「 InvokeEndpoint 」という API アクションがあります。 この API は HTTP POST 呼び出しによって起動し、HTTP 本体で推論が予想されるデータを提供していました。 呼び出しごとに最大 5 MB のデータを推論用に送信でき、呼び出し自体をブロックします。 このユースケースはデータ量が 5 MB を超えるバッチ推論の場合です。 そのため、InvokeEndpoint API アクションを通して全てのデータを送信することは不可能でした。 バッチ推論の取得には、推論のためのデータを Amazon S3 からメモリに読み込み、それを 5 MB 未満のチャンクに分割し、InvokeEndpoint を繰り返し呼び出します。 チャンク化した推論を得るのに、以下のコードを使用しました。 :

#Read complete file from S3
body_raw=s3.get_object(Bucket=bucket,Key=data_fn)['Body'].read()

#Alternatively, if your data file is large, read by chunks
# body_raw=s3.get_object(Bucket=bucket,Key=data_fn,Range="bytes=0-500")['Body'].read()

#Convert data to bytes
data=io.BytesIO(body_raw)

#Split the data read into chunksize. For our dataset chunksize=3000 ensured that HTTP #POST body size will be less than 5MB. Correct chunksize depends on the dataset.
for chunk_df in pd.read_csv(data, chunksize=chunksize,header=None):
	#chunk_df contains a chunk of data
	#convert the chunk into CSV format
csv_str=chunk_df.to_csv(None,header=False,index=False)

#Send the csv chunk to SageMaker hosted model Endpoint (endpoint_name) 
#content_type is ‘text/csv’
response = runtime.invoke_endpoint(EndpointName=endpoint_name,
                                         ContentType=content_type,
                                         Body=csv_str)

#response is available in json format. Read and decode it.
result = response['Body'].read().decode(‘ascii’)

まとめ

このブログポストでは、Amazon SageMaker の機能と性能を 3 つのワークストリームを通して、ML プラットフォームのニーズに合わせてご紹介しました。 このブログで学んだことのまとめです。 :

  • Amazon SageMaker は、ML プラットフォーム管理にかかる労力を大幅に軽減するため、チームはプラットフォーム管理にかかる労力ではなく、モデルの構築とテストにより多くの時間を費やすことができます。
  • Amazon SageMaker の分散トレーニング機能は、チームが ML モデルを大きい規模でトレーニングすることが可能となる重要な機能です。
  • Amazon SageMaker ではモデルが HTTP エンドポイントでホストしているため、サービス指向アーキテクチャでのモデルの統合を容易にします。

こうした当社の経験に基づき、近い将来には最終的に現在および将来の ML プラットフォームの全ニーズに対し、Amazon SageMaker へ移行することにしました。

リソース

AWS Secrets Manager を始めよう

Amazon Redshift 「 UNLOAD 」コマンドのドキュメント

Amazon Redshift 認証パラメータでデータにアクセス

Amazon SageMaker ノートブックインスタンスの作成

Amazon SageMaker でのトレーニングジョブの作成

独自のアルゴリズムコンテナの構築とテスト

R の環境で Docker イメージを構築するための DockerFile サンプル

Docker イメージを構築し Amazon ECR にプッシュするためのサンプルスクリプト

Amazon SageMaker で「 Bring Your Own R Algorithm 」を実装

Amazon SageMaker XGBoost アルゴリズムの使用


今回のブログ投稿者について

Azman Sami は、AWS マーケティング組織所属のデータサイエンティストで、リアルタイム分析と機械学習のための拡張性のあるプラットフォームの構築を専門としています。 その前は、IT エンタープライズアーキテクトおよびソフトウェア開発者として10年働いていました。

Alam Khan は、AWS マーケティング組織に所属するシニアアナリティックスマネジャーで、データサイエンスチームのデータおよび ML プラットフォーム戦略を管理しています。 データプラットフォームとオートメーションの構築の分野で、9 年を超える経験があります。

Neelesh Gattani は AWS マーケティング組織に所属するデータサイエンスのシニアマネージャーで、プログラム測定戦略、ターゲティングおよびセールスリードスコアリングのための機械学習イニシアチブ、内部 ML プラットフォームを管理しています。