Amazon SageMaker Studioを使って機械学習をやってみる

2020.05.18

Introduction

この記事は、初めてAmazon SageMakerにさわった自分が、Amazon SageMaker Studioを使って
↓の情報を参考に機械学習モデルの構築・トレーニング・デプロイして推論を実行したログです。

これらの情報をみて、実際にAutopilotで機械学習モデル構築から推論まで動かしたことがあるなら、たぶん目新しい情報はないので注意。

What is Amazon SageMaker?

Amazon SageMaker は、機械学習モデルの構築から
トレーニング〜デプロイまで可能にするマネージド型サービスです。
機械学習を実際におこなっていく上で問題となるインフラ問題やトレーニング、
パラメータの設定やモデルの評価など多くの部分についてやってくれます。
※100%全部やってくれるわけではないし、機械学習に関する知識は必要です

SageMakerの作業は、Jupyter Notebookで行います。
データクレンジング〜モデルのトレーニング〜デプロイ〜推論まで
実行結果を記録しながら、データの分析作業を進めることができます。

What is Jupyter Notebook?

ここらへんでも紹介されているとおり、
Jupyter Notebookは、ブラウザで動作する対話型データ分析ツールです。
ノートブックと呼ばれるファイルにプログラムを記述して実行したり、
文章(Markdownが使える)やプログラムの実行結果なども含めてまとめて管理できるのでとても便利です。

What is Amazon SageMaker Studio?

Amazon SageMaker Studioとは、「機械学習のための統合開発環境」です。

従来のAmazon SageMakerだと、Jupyter Notebookでpythonのコードを逐次実行していたようです。
たとえば、機械学習でパラメータをチューニングする際、Amazon SageMakerで
さまざまなテストや確認を行いますが、
結果をすべて手動で管理する必要がありますが、これは非常に手間がかかりそうです。
そういった作業を一箇所で行えるようにしたのがAmazon SageMaker Studioらしいです。

Amazon SageMaker Studio はウェブベースのUIを持ち、
機械学習に関連するすべての手順を実行可能です。
モデルの構築、モデルのトレーニング、パラメータの調整やデプロイ、
さらにエンドポイントに作成や推論実行もできます。
これらの作業はすべてAmazon SageMaker StudioのUI上で実行可能です。

What is Amazon SageMaker Autopilot?

Amazon SageMaker Autopilotとは、データに基づいて
分類/回帰用の最適な機械学習モデルを「自動的に」トレーニング&調整してくれる便利なサービスです。
Amazon SageMaker Studioから数クリックすれば、Autopilotは下記のようなタスクを行います。

  • データセットを検査やデータの前処理
  • 機械学習アルゴリズム、ハイパーパラメータの最適な組み合わせを見つけるための試行

これらはフルマネージドなインフラ上で実行されます。

また、Autopilotは、どのようにデータが前処理されたかを示すPythonコードを生成します。
そのためAutopilotがどんな処理をしたか把握することもできますし、
自分でそのコードを利用してカスタマイズすることが可能です。

参考 : devio : Amazon SageMaker Autopilotを使ってみた

Machine Learning work with Amazon SageMaker Studio

Setup Amazon SageMaker Studio

まずはAmazon SageMaker Studio を動かせる状態にします。

ここを参考にSageMaker Studioをセットアップします。
AWSマネジメントコーンソールからSageMakerを開き、
「SageMaker Studio を起動する」みたいなボタンがあるはずなので、それをクリックします。

usernameとIAM Roleを設定します。
* RoleはAmazonSageMakerFullAccess policyがアタッチされたRole

しばらくするとSageMaker Studioが起動できるようになるので、
Oepn Studioボタンを押して起動します。
※最初の起動はそこそこ時間がかかる

動作確認もかねて、SageMakerのサンプルファイルをgithubから取得しましょう。
Launcherページで、System Terminalを選択し、ターミナルを起動します。

ターミナルが起動したら↓のコマンドでファイルを取得します。

% git clone https://github.com/awslabs/amazon-sagemaker-examples.git

画面左上にある、ファイルブラウザアイコンを選択してください。
amazon-sagemaker-exampleディレクトリが取得できています。
amazon-sagemaker-examples/aws_sagemaker_studio/getting_startedに移動して、
xgboost_customer_churn_studio.ipynbをダブルクリックしてください。

Jupyter Notebookが開きました。
pythonコードにフォーカスをあわせて画面上部の▶ボタンをクリックすると、コードを実行できます。

これでAmazon SageMaker Studioの動作確認ができました。

Amazon SageMaker Autopilotを使う

では、Amazon SageMaker Autopilotでexperimentを作成して機械学習を行ってみましょう。
Autopilotでexperimentを作成すると、SageMaker はデータ分析を行い、
いくつかのモデル定義を含むJupyter Notebookを作成します。
そして、SageMakerがモデルのトレーニングやパラメータ調整を試行してくれます。

SageMaker Studioで、
amazon-sagemaker-examples/autopilot/sagemaker_autopilot_direct_marketing.ipynb
を開きましょう。
ここにのっている「direct marketing dataset」をつかって
機械学習モデルを作成して推論を実行してみます。
このデータは銀行のダイレクトマーケティングキャンペーンに関連するcsvデータで、
年齢や仕事など、いろいろな情報がはいっています。
最後の「y」というフィールドが「顧客が定期預金を申し込みしたかどうか」の結果で、
これを予測することを目的としてモデルを作成します。

Downloading the datasetのところにある↓のコードを実行すると、
ルートディレクトリにbank-additionalディレクトリが作成されます。

!wget -N https://sagemaker-sample-data-us-west-2.s3-us-west-2.amazonaws.com/autopilot/direct_marketing/bank-additional.zip
!unzip -o bank-additional.zip

local_data_path = './bank-additional/bank-additional-full.csv'

私の場合、なぜかunzipが動作しなかったので、
https://archive.ics.uci.edu/ml/datasets/bank+marketing
からbank.zipをダウンロードしてローカルで解凍し、bank-additional-full.csvをアップロードしました。

ファイルがアップロードされていれば、↓のコードを実行するとcsvデータが表示されます。

import pandas as pd

data = pd.read_csv('./path/your/bank-additional-full.csv', sep=';')
pd.set_option('display.max_columns', 500)     # Make sure we can see all of the columns
pd.set_option('display.max_rows', 50)         # Keep the output on one page
data[:10] # Show the first 10 lines

次に、データセットを学習データとテストデータに分けて保存します。

import numpy as np

train_data, test_data, _ = np.split(data.sample(frac=1, random_state=123), 
                                                  [int(0.95 * len(data)), int(len(data))])  

# Save to CSV files
train_data.to_csv('training-set.csv', index=False, header=True, sep=',')
test_data.to_csv('test-set.csv', index=False, header=True, sep=',')

学習データ(training-set.csv)とテストデータ(test-set.csv)のcsvができたら、
S3にデータ保持用のバケットを作成します。
SageMaker上からS3バケット作成ができると思ったのですが、よくわからなかったので
普通にS3のAWSコンソールからバケットを作成して学習用データCSVをアップロードしました。
アップロードしたデータセットのS3のパスをコピーしておき、
SageMaker StudioのExperiment Listタブへ移動します。
そして、「Create Experiment」をクリックし、各項目を入力します。

今回、入力する項目は↓のようにしました

  • Experiment Name -> experiment名
  • input data location -> 学習データの場所。先ほど作成したS3バケットと学習データを指定
  • Target Attribute Name -> 推論したい項目。yフィールドを推論したいのでyを指定
  • output data location -> 結果出力場所。先ほど作成したS3バケットとprefixを指定

必要データを入力してCreate Experimentボタンをクリックすると、
データ分析や学習、モデル作成が自動で実行されます。
※けっこう時間がかかる

Experiment Listで先ほど実行したexperimentを右クリックして
Describe AutoML jobを指定すると、学習結果のサマリが表示されます。
★マークがついているtrialが、もっとも結果が優秀だったtrialになります。
もし手動でやっていたら、バイアスやパラメータの調整をしつつ
学習曲線をみながら試行錯誤して最適なモデルを割り出すところです。
こういった面倒な作業をすべて勝手にやってくれるので、
SageMaler / AutoMLはとても便利ですね。

※なお、Experiment結果の説明はこのあたりを参照

Deploy Model & inference

最適なモデルが判明したので、対象モデルをデプロイして推論してみます。
Endpoint nameやデプロイ先のインスタンスタイプ、出力先S3バケットの指定などを設定します。

デプロイが完了したら、このへんを参考に
Jupyter Notebookでテストデータの推論を実行してみます。
↓のコードを入力して、先ほどデプロイしたモデルのエンドポイントに対して推論実行してみましょう。

import boto3

runtime_client = boto3.client('runtime.sagemaker')
endpoint_name = 'your Experiment Endpoint name'

#1番目のテストデータを取得
s = test_data.to_csv(index=False).split()[1]
l = s.split(',')
l.pop() # yフィールドのデータ削除
single_data = ','.join(l)

#推論実行
response = runtime_client.invoke_endpoint(EndpointName = endpoint_name,
                                         ContentType = 'text/csv',
                                         Body = single_data.encode())
result = response['Body'].read().decode('ascii')
print('Predicted result is {}'.format(result))

実行すると↓のような結果が表示されました。
設定したエンドポイントに対して、推論できてます。

#結果
Predicted result is no

まとめ

本稿ではSagemer Studioのセットアップからモデル作成、
二項分類の推論までを一通り試してみました。
データさえあれば比較的かんたんに試すことができたと思います。
とりあえず基本的な使い方について試したので、
ほかにどんなことができるか、いろいろ確認してみたいと思います。

その他参考情報