Amazon Web Services ブログ
Amazon SageMaker と Amazon Redshift を利用した、高速・柔軟・セキュアな機械学習基盤の構築
データウェアハウス環境として、 Amazon Redshift に販売データ・ログデータ・センシングデータ等を蓄積し、これらのデータを用いて機械学習の活用を検討されるケースは多いと思います。高速にクエリを実行できる Redshift と、Amazon SageMaker による Jupyter Notebook を用いた対話的なデータ分析と機械学習を活用し、需要予測・レコメンド・異常検知などを行うことが可能です。
本稿では、 Redshift から Amazon VPC 内でセキュアにデータを取得し、SageMaker を利用した分析・機械学習パイプラインを構築する方法をご紹介します。前半では、アーキテクチャの概要を説明します。後半では、そのアーキテクチャのサンプルを構築し 、SageMaker から SQL クエリを実行して、データを分析する方法について説明します。環境を簡単に構築できるよう、 AWS CloudFormation のテンプレートを用意しているので、実際に試しながら読み進めることができます。SageMaker や Redshift の概要については末尾に記載した参考記事をご覧下さい。
アーキテクチャ概要
大規模データに対し、高速・柔軟・セキュアにデータ分析を行うための、Redshift と SageMaker を組み合わせたアーキテクチャを以下に示します。
AWS を利用した分析・機械学習パイプラインとしては様々なアーキテクチャが考えられますが、ここでは Redshift に対して SageMaker の Jupyter Notebook 上から SQL クエリを実行し、必要なデータのみを取得して分析・可視化・機械学習を行うことを想定します。Redshift のサンプルデータが Amazon S3 にあるため事前にそれを読み込んでいます。
それでは、具体的にアーキテクチャの詳細を確認していきましょう。
速度と分析の柔軟さの両立
データの分析・可視化・機械学習を行う場合、ブラウザ上で動作する対話型データ分析ツールである Jupyter Notebook の利用は有力な選択肢の一つです。データサイエンティストは、Python や R などの言語と多数のデータ分析ライブラリを利用して様々な観点からデータ分析を行います。ここでは Jupyter Notebook の基盤として SageMaker を利用します。SageMaker を利用するとわずか数クリックで Jupyter Notebook 環境を立ち上げることができるため、お客様はデータ分析と機械学習モデルの開発に時間を掛けることができます。
ただし、一般的に大規模なデータを Jupyter Notebook 上で取り扱う場合、処理速度やメモリ上への展開が課題となります。そこで、ギガバイトからエクサバイトスケールのデータにわたって並列分散処理が可能なデータウェアハウスである Redshift を利用して、集計や平均などの統計量を高速に計算します。 SageMaker の Jupyter Notebook からこれらの統計量を取得するためには、psycopg2 などの PostgreSQL ドライバを介して SQL クエリを実行すればよく、必要な情報のみを pandas にロードできます。
セキュリティ上の考慮点
このようなデータ分析において、セキュリティ面ではデータの通信経路や権限の管理が非常に重要となります。
SageMaker ノートブックインスタンスでは 、VPC オプションを有効にすることで Redshift へ VPC 経由で接続を行うことが可能であり、インターネットから Redshift へのアクセスを許可する必要がありません。ユーザー・SageMaker・Redshift 間の通信は全て SSL で暗号化されています。また、AWS Identity and Access Management (IAM) 認証を使用した一時的なデータベースユーザー認証情報 (ユーザー・パスワード)を用いて Redshift へアクセスすることができます。
アーキテクチャの構築と分析
このセクションでは、上記のアーキテクチャ構築による、簡単な分析方法について説明します。全体の流れは次の通りです。
【注意】Redshift と SageMaker のご利用には使用料金がかかります。
- CloudFormation のテンプレートからスタックを作成し、アーキテクチャを構築します。このスタックには、SageMaker のノートブックインスタンスや Redshift クラスタ等が含まれます。
- SageMaker のノートブックインスタンスを開き、サンプルノートブックをダウンロードします。
- サンプルノートブックに従い、Redshift へのアクセスから、実行したクエリの結果を pandas に格納する部分までを行います。
- スタックを終了します。
1. スタックの作成
本アーキテクチャを自動で構築することができる CloudFormation テンプレートを用意しました。以下の Launch Stack ボタンをクリックし、スタックを作成します。
- 「テンプレートの選択」画面ではそのまま「次へ」をクリックして下さい。
- 「詳細の指定」画面では、MasterUserPassword に以下の制約を満たすパスワードを入力し、「次へ」をクリックして下さい。
- マスターパスワードの長さは 8~64 文字にする必要があります。
- 最低 1 個の大文字を含める必要があります。
- 最低 1 個の小文字を含める必要があります。
- 数字を 1 個含める必要があります。
- 表示可能な ASCII 文字 (ASCII コード 33~126) のうち、’ (一重引用符)、” (二重引用符)、\、/、@ または空白を除く任意の文字を使用できます。
- 「オプション」画面では、そのまま「次へ」をクリックして下さい。
- 「確認」画面では、CAPABILITY の「AWS CloudFormation によって IAM リソースが作成される場合があることを承認します」にチェックを入れ、「次へ」をクリックして下さい。
スタックの作成には数分かかります。状況が「CREATE_IN_PROGRESS」から「CREATE_COMPLETE」へ変化するまでお待ち下さい。
なお、CloudFormation を利用せずマネージメントコンソールから環境を構築する場合は、「Amazon Redshiftの使用開始」や「Amazon SageMakerノートブックインスタンスの作成」をご参照下さい。
2. サンプルノートブックのダウンロード
次に、SageMaker のノートブックインスタンスを起動します。マネージメントコンソールで SageMaker を開き、画面左の「ノートブックインスタンス」タブを選択して下さい。先程作成したノートブックインスタンスが起動していることを確認できます。
「開く」をクリックすると、一時的な署名付き URL が発行されて Jupyter Notebook にアクセスできます。
Jupyter Notebookの画面で、「New」 > 「Terminal」をクリックし、黒い端末の画面を開きます。
端末の画面で以下のコマンドを入力し、サンプルのノートブック sagemaker_redshift.ipynb
をダウンロードします。
cd SageMaker/
wget https://s3-ap-northeast-1.amazonaws.com/machine-learning-contents-aws-jp/sagemaker_redshift.ipynb
Jupyter Notebookの画面に戻り、ダウンロードしたノートブック sagemaker_redshift.ipynb
をクリックし、ノートブックを開いて下さい。
3. SageMakerを用いたRedshiftへのアクセス
ここからは、先程ダウンロードしたノートブック sagemaker_redshift.ipynb
に従い進めていきます。以降はノートブック内のコマンドを順次実行するだけで進めていくことができます。
ノートブックの内容は大きく4つの処理で構成されます。
- Redshift への接続
- S3 から Redshift へデータセットの COPY
- Redshift で SQL クエリを実行し、処理結果を pandas の DataFrame へ格納
- データの分析・可視化
以下では特に重要な部分にフォーカスして解説します。
まず、Redshift へ接続するための、一時的データベースユーザー認証情報を取得します。一時的データベースユーザー認証情報には、データベースのユーザー名と、一時的に Redshift にアクセス可能なパスワードが含まれます。ノートブックインスタンスの IAM ロールに適切な権限を付与した上で GetClusterCredentials API を呼び出すことで、一時的なデータベースユーザー認証情報を取得することができます。IAM ロールに必要な権限についてはこちらをご参照下さい。
redshift = boto3.client('redshift')
credentials = redshift.get_cluster_credentials(
DbUser=db_user,
DbName=db_name,
ClusterIdentifier=cluster_name,
DurationSeconds=3600,
AutoCreate=False
)
tmp_db_user = credentials['DbUser']
tmp_db_password = credentials['DbPassword']
次に、Python 用の PostgreSQL ドライバである「psycopg2」を利用して Redshift に接続します。
conn = psycopg2.connect(
host=cluster_endpoint,
port=db_port,
dbname=db_name,
user=tmp_db_user,
password=tmp_db_password
)
本稿ではサンプルとして、公式ドキュメントで利用されているデータセットを使用します。
データを格納する前に、テーブルを作成します。以降は必要なコードの内一部のみを示します。
sql = """
create table event(
eventid integer not null distkey,
venueid smallint not null,
catid smallint not null,
dateid smallint not null sortkey,
eventname varchar(200),
starttime timestamp);
"""
with conn.cursor() as cur:
cur.execute(sql)
COPY コマンドを使用して S3 にあるデータを Redshift にロードします。COPY コマンドを実行する場合は、クラスターが S3 のオブジェクトにアクセスするために必要な認証情報を提供する必要があります。ここでは推奨の認証方法である IAM ロール での認証を行っているため、以下の <iam-role-arn> に必要なRoleのARNを入力します。詳細については 「IAM ロールを使用して COPY、UNLOAD、および CREATE EXTERNAL SCHEMA オペレーションを承認する」をご参照下さい。
sql = """
copy event from 's3://awssampledbuswest2/tickit/allevents_pipe.txt'
credentials 'aws_iam_role=<iam-role-arn>'
delimiter '|' timeformat 'YYYY-MM-DD HH:MI:SS' region 'us-west-2';
"""
with conn.cursor() as cur:
cur.execute(sql)
SQL クエリを実行し、必要なデータのみを pandas の DataFrame に格納する例を示します。
sql="""
SELECT eventname, total_price
FROM (SELECT eventid, total_price, ntile(1000) over(order by total_price desc) as percentile
FROM (SELECT eventid, sum(pricepaid) total_price
FROM sales
GROUP BY eventid)) Q, event E
WHERE Q.eventid = E.eventid
AND percentile = 1
ORDER BY total_price desc;
"""
df = pd.read_sql(sql=sql, con=conn)
ヒストグラムを利用してDataFrame を可視化します。
df.total_price.hist()
plt.xlabel('Total price')
plt.ylabel('Histogram')
このように SQL と pandas を用いてデータの前処理を行うことができます。処理済みのデータをS3へと出力することで、トレーニングインスタンス上で機械学習のモデルをトレーニングすることもできます。例えば、SageMaker 上で XGBoost を利用する方法に関してはこちらの記事をご参照下さい。
4. スタックの終了
最後に、スタックを削除します。削除を行わない場合は課金が発生し続けますので十分ご注意下さい。
マネージメントコンソールで CloudFormation を開きます。今回作成したスタックを選択し、「アクション」>「スタックの削除」をクリックすると削除が開始されます。削除は数分で完了します。
まとめ
本稿では、Amazon SageMaker と Amazon Redshift を利用し、大規模データセットに対して高速かつ柔軟にデータ分析を行う方法を説明しました。また、実ユースケースでも利用できるように、セキュリティ面でも安全なアーキテクチャの構成方法を紹介しました。
Appendix
さらなるセキュリティ検討項目
本アーキテクチャでは、IAM で適切な権限付与をしつつ SageMaker ノートブックインスタンスをインターネットから使用することを想定しておりますが、ノートブックインスタンスの Private Link 機能をご利用いただくことで、インターネットを経由せずVPC 内に閉じた環境下で SageMaker を使用することが可能です。
また、Redshift にデータを COPY/UNLOAD する際には S3 と連携するケースが多いですが、Redshift に付与した IAM Role による S3 のアクセス制御以外にも、Redshift の VPC 拡張ルーティングオプションを有効にし、S3 の VPC エンドポイント を設定することで、Redshift から S3 へのアクセスを VPC Flow Logs で記録したり、インターネットを経由せずアクセスさせることが可能となります。
参考記事
- Amazon SageMaker について
- AWS ドキュメント
- Black Belt (2018年3月8日)
- Amazon Redshift について
- AWS ドキュメント
- Black Belt (2016年7月20日)
SageMaker と他サービスの連携によるデータ加工方法
本稿では Redshift を活用したデータ加工方法を紹介しましたが、 SageMakerと他のサービスを連携し、ニーズにあった加工方法を選択することができます。
- SageMaker と EMR を組み合わせる方法
- SageMaker から Athena で S3 にあるデータに対して SQL クエリを実行する方法
- SageMaker から Glue の開発エンドポイントへ接続してコードを開発し、Glue で ETLを行う方法
著者について
石見 和也 (Kazuya Iwami) は AWS のソリューションアーキテクトです。Computer Vision に興味があり、休日はテニスなどをして楽しんでいます。
針原 佳貴 (Yoshitaka Haribara, Ph.D.) は AWS のソリューションアーキテクトです。好きなサービスは Amazon SageMaker と Amazon Rekognition です。
宮本 大輔 (Daisuke Miyamoto, Ph.D.) は AWS のソリューションアーキテクトです。HPC分野へのクラウド活用に興味があります。