機械学習未経験者がSageMakerの初心者向けワークショップをやってみた

2023.07.05

はじめに

私は業務で機械学習に触れたこともなければ、大学などでAIや機械学習について学んだこともありません。そんな機械学習ド素人ですが、素人なりに勉強をする中で、機械学習を使うと色々面白そうなことができそうだということがわかりました。

そこで、まずはAWSの初心者向けチュートリアルをやってみて、機械学習の世界がどのようなものか覗いてみたいと思いました。

実施する内容

この記事ではSageMaker Workshop - Linear Learner MNISTというワークショップを行ってみます。このワークショップの内容は下記のように案内されています。

SageMaker のNotebook環境を立ち上げて使ってみる内容です。0 から 9 までの手書きで書かれた数字を学習し、0 かそれ以外を判定する機械学習モデルを作成する内容を体験いただけます。

やってみる

IAMロールの作成

SageMaker用のIAMロールを作ります。

IAMのページに遷移し、「ロール」⇒「ロールの作成」をクリックします。

信頼されたエンティティタイプで「AWSのサービス」、ユースケースではプルダウンから「SageMaker」を選択し、「SageMaker - Execution」にチェックを入れます。

「許可を追加」画面でAmazonSageMakerFullAccessポリシーが設定されていることを確認します。

ロール名は任意の値を入力し、「ロールの作成」をクリックします。

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

SageMakerのページに遷移し、「ノートブックインスタンス」⇒「ノートブックインスタンスの作成」をクリックします。

ノートブックインスタンス名に任意の名前を入力します。注意書きにある通り、アカウント、リージョン内で一意である必要があります。

ノートブックインスタンスのタイプはml.c5.xlargeを選択します。

IAMロールでは先ほど作成したIAMロールを選択します。

また、プラットフォーム識別子は2023年7月時点ではデフォルトで「Amazon Linux 2, Jupyter Lab 3」となっていますが、この先のワークショップの手順に従うために、「Amazon Linux 2, Jupyter Lab 1」に変更しておきます。

その他はデフォルトのままで「ノートブックインスタンスの作成」をクリックします。

画面が切り替わり、ノートブックインスタンスの一覧が表示されます。ステータスが「InService」になるまで待ちます。私の場合は約5分ほどかかりました。

JupyterLabを開く

JupyterLabとは、Webブラウザ上でPythonやRなどのコードを書き、対話形式で実行できる統合開発環境です。元々Jupyter Notebookという製品があったのですが、そこにカスタマイズ可能なインターフェイスレイアウトやコンソールなどの機能を備えて進化させたものです。

ではさっそくJupyterLabを起動します。

作成したノートブックインスタンスの「JupyterLabを開く」をクリックします。

このような画面が表示されます!(なんかテンションが上がりますね)

左端にある下記画像のアイコンをクリックし、「Amazon SageMaker sample notebooks」を開きます。

「INTRODUCTION TO AMAZON ALGORITHMS」というセクションにある「linear_learner_mnist.ipynb」を探し、クリックします。

右側に下記画像のような画面が表示されるので、「Create a Copy」をクリックします。

ポップアップで「Create a Copy」をクリックします。

Select Kernelのポップアップでは「conda_amazonei_mxnet_p36」が選択されていることを確認し、「Select」をクリックします。

※ノートブックインスタンスの設定でプラットフォーム識別子を「Amazon Linux 2, Jupyter Lab 3」にするとこの選択肢が出てきませんでした。

作成したノートブックが新しいタブで開いており、右上が「conda_amazonei_mxnet_p36」になっていることを確認します。

JupyterLabの実行

JupyterLabはブラウザ上でコードを書き、対話形式で実行できると上で説明しましたが、ノートブックという名前の通り、この画面全体がブラウザ上で開くノートブックのようになっています。

どういうことかというと、画面に表示されているこれらの説明文は固定されたものではなく、自分で自由に編集できます。

例えば、タイトルをダブルクリックすると、このように編集できそうなテキストボックスに変化します。

テキストボックスを編集してタイトルを変更したり、実行しようとしているコードの説明をマークダウン形式で書き加えたりすることができます。まさにノートブックですね。

さて、ワークショップの手順に戻ります。

pip install...と書かれた部分をクリックします。この状態で上部にある実行ボタンをクリックします。

すると左側の[ ]が[*](実行中)という表示に変わり、コードの実行ログがブラウザに表示されます。

実行が終わると、[ ]内には実行順の数字が入ります。最初に実行したコードなので、[ 1 ]と表示されます。

実行が終わると次のブロックにカーソルが移動しているので、次々と実行ボタンを押していき、ノートブックに書かれた処理を実行します。

「(Optional) Delete the Endpoint」と書かれたブロックの前まで実行すると、以下のような混同行列が取得できます。

混同行列は対角線上にあるセルが正しく予測できたデータを示しています。以下のデータでは、

  • 0以外の数字を正しく予測できた数が8970
  • 0を正しく予測できた数が950
  • 実際は0ではないが、0だと予測した数が50
  • 実際は0だが、0以外だと予測した数が30

という結果になっています。

ちなみに、各コードで何をしているのかというのを説明文からなんとなく読み取ってみました。(上で述べたように機械学習の知見に乏しいので、正確ではない可能性があります)

1: SageMakerの最新バージョンをインストール

2: トレーニングデータとモデルデータの格納に使用するS3バケットと、IAMロールの設定

3: MNISTデータセットをダウンロードし、S3に転送

4: データにどのような前処理をするのが適切か判断するために、データセットのうち一つを例として表示

5: データをアルゴリズムの入力形式として適したものに変換

6: 変換したデータをトレーニングデータとしてS3にアップロード

7: 学習モデルを出力するS3バケットの場所を設定

8: トレーニングに使用するコンテナの設定

9: ハイパーパラメータを設定し、トレーニングを実施

10: HPOというアルゴリズムを使用し、ハイパーパラメータを最適化

11: トレーニング済みモデルをエンドポイントにデプロイ

12: リクエストをシリアル化する方法とレスポンスを逆シリアル化する方法を指定

13: あるレコードの予測を取得。predicted_labelが0なので、画像は「0ではない」という判定(0であるかどうかを予測するので、結果が0なら「0ではない」、結果が1なら「0である」ということ)

14,15: 画像全体をバッチで予測して混同行列を生成

また、ワークショップの手順に、

【余裕があれば】「Validate the model for use」のところにある下記のセルを書き換え、そのセルを実行してみましょう。

とあるので、書き換えて実行してみました。

先ほどはpredicted_labelが0でしたが、別のデータを入力したらpredicted_labelが1になったことがわかります。

リソースの削除

「(Optional) Delete the Endpoint」と書かれたセクションのコードも実行し、エンドポイントを削除します。

削除されたかどうかは、SageMakerの「エンドポイント」から確認できます。空であれば削除されています。

「エンドポイント設定」を開き、エンドポイント設定が存在している場合は、選択して「アクション」⇒「削除」で削除します。

「ノートブックインスタンス」を開き、ノートブックインスタンスを選択して「アクション」⇒「停止」で停止します。

ステータスが「Stopped」になれば削除できるので、「アクション」⇒「削除」で削除します。

続いてS3バケットを削除します。「sagemaker-」から始まるバケットがあるので、選択して「空にする」をクリックします。

バケットが空になったら、選択して「削除」でバケットを削除します。

最後にIAMロールを削除します。

IAMの「ロール」を開き、先ほど作成したSageMaker用のロールにチェックを入れます。「削除」をクリックします。

これでワークショップはすべて完了です。

おわりに

初めてSageMakerやJupyterLabを触りましたが、わからないことだらけなりになかなか楽しかったです。存在だけは知っていたJupyterを実際に触ってみて、どんなものなのか感触をつかむことができました。また、あらかじめ書かれたサンプルコードを実行していくだけでしたが、説明書きもあったのでなんとなく処理の流れがわかりました。

Pythonのコードやライブラリについて理解を深めればもっと色々なことができそうでワクワクしています。まだ機械学習の世界の入り口に立ったぐらいですが、さらに勉強して徐々に深いところまで進んでいけるように頑張りたいです。