Amazon SageMaker を使って機械学習をはじめる（サンプルコードでハンズオン）

## はじめに
機械学習を使ってみたいなと思ったとき、何から試せば良いか迷うことありますよね。そんなあなたに Amazon SageMaker の使い方と様々な機械学習の使い方をいっぺんに習得できてしまうハンズオンをお届けします。

本記事で紹介されているリポジトリのサンプルを実行すると、数十〜数百円ほど AWS 利用料がかかることがあります。

## 現在用意されているサンプルコード
[GitHub リポジトリ](https://github.com/ohbuchim/sample-codes-for-aiml)

- amazon-rekognition-image-analysis
  - AWS SDK for Python を使って Amazon Rekognition で画像分析します
- amazon-sagemaker-jumpstart
  - Amazon SageMaker JumpStart に関するノートブックです
  - sagemaker-jumpstart-inference-local.ipynb: Amazon SageMaker JumpStart で学習させた PyTorch の VGG モデルを使ってローカルで推論するノートブック
- autogluon-tabular-customer-churn
  - [AutoGluon-Tabular](https://auto.gluon.ai/stable/tutorials/tabular_prediction/index.html) を使って顧客離反予測します
- deoldify-sagemaker
  - モノクロ画像をカラー化する [DeOldify](https://github.com/jantic/DeOldify) を Amazon SageMaker で使うノートブックです
- gnn-node-classification
  - GNN を使ってノード分類を行うサンプルです。
- lightgbm-byoc
  - Amazon SageMaker でカスタムコンテナで LightGBM を使うサンプルです。
    - lightGBM-byoc.ipynb: カスタムコンテナを使って学習とリアルタイム推論を行う方法を [公式のサンプルノートブック](https://github.com/aws-samples/amazon-sagemaker-script-mode/blob/master/lightgbm-byo/lightgbm-byo.ipynb) をベースに必要最小限な部分を抜き出して簡素化したノートブック
    - lightGBM-batch-inference.ipynb: Transform API と Amazon SageMaker Processing それぞれを使ってバッチ推論を行うノートブック
- mlops
  - step-functions-model-train-evaluate-pipeline: AWS Step Functions Data Science SDK, Amazon SageMaker, Amazon SageMaker Experiments を使ってデータの前処理、モデルの学習、モデルの評価を行うパイプラインを作成するノートブック
- multi-model-endpoint
  - SageMaker のマルチモデルエンドポイント（1つのエンドポイントに複数のモデルをデプロイする機能）でモデルをホスティングします
- similar-image-search
  - MXNet の学習済みモデルと Amazon Elasticsearch Service を使って類似画像検索します
- tensorflow2-mnist-byom
  - Amazon SageMaker の機能を使って Tensorflow2 のモデルを学習、デプロイします

## Amazon SageMaker のセットアップ
本記事では、Amazon SageMaker ノートブックインスタンスを使う方法をご紹介します。Amazon SageMaker Studio を使いたい方は [こちらの記事](https://qiita.com/mariohcat/items/d8688d2a73517a0d8e1c) でセットアップ方法が解説されていますのでご参照ください。

### ノートブックインスタンスの作成
AWS コンソールから Amazon SageMaker コンソールにアクセスし、左側のメニューの「ノートブックインスタンス」をクリックします。

![ノートブックインスタンスの作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/794c9ce3-b782-5aba-cef5-92c636427e27.png)

すると「ノートブックインスタンスの作成」というオレンジ色のボタンが表示されるので、クリックします。

![ノートブックインスタンスの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/19aa80fc-0ccd-b823-3f16-eac8bf73eeb7.png)

上図のようなノートブックインスタンスの設定画面が表示されたら、まずノートブックインスタンス名を入力します。スペースは使えますがアンダースコアは使えないことにご注意ください。

ノートブックインスタンスのタイプは、基本的にはデフォルトの ml.t2.medium で良いですが、ノートブックインスタンスで重めの処理をしたい場合はスペックが高いインスタンスを選択することも可能です。ここは処理時間やお財布とご相談ください。

プラットフォーム識別子では、インスタンスで使用する OK を Amazon Linux 1 と Amazon Linux 2 から選択することができます。2022年04月18日から Amazon Linux 1 のセキュリティパッチとアップデートがサポートされなくなるため、Amazon Linux 2 の方を選択するのがおすすめです。

本記事では、以下のように設定しました。

- ノートブックインスタンス名：hands-on
- ノートブックインスタンスのタイプ：ml.t2.medium (デフォルト)<br>**コンテナイメージをビルドするノートブックを動かす場合は、c5.xlarge などのインスタンスを選択してください。**

少し下にスクロールすると、アクセス許可と暗号化の設定エリアになります。下図の丸で囲んだ部分をクリックするとメニューが出てきます。

![アクセス許可と暗号化](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/a6fdaf3c-67d2-b618-389b-341965269d45.png)

「新しいロールの作成」をクリックします。

![IAM ロール](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/39d2c576-5ec6-870e-4202-bb9be173c992.png)

「指定する S3 バケット」の設定が「任意の S3 バケット」になっていることを確認して、オレンジ色の「ロールの作成」をクリックします。少ししてロールの作成が成功しました、と表示されれば OK です。エラーが出た場合はがんばって対応します。使用している IAM ロールによっては、新しいロールを作成する権限がない場合があるので、その場合はアカウントの管理者にロールを作ってもらうなどが必要です。

![IAM ロールを作成する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/51287c4b-6430-0858-6258-fdaa52121220.png)

さらに下にスクロールしていくと、「Git リポジトリ」と書かれた部分がありますので、▼をクリックして中身を展開します。すると「リポジトリ」と書かれた部分があるので▲をクリックし「このノートブックインスタンスのみにパブリック Git リポジトリのクローンを作成する」を選択します。

![Git リポジトリ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/7a7e6ee7-599a-010a-bc5d-a859d2a10b0a.png)

すると「Git リポジトリの URL」と書かれたテキストボックスが表示されるので、そこに `https://github.com/ohbuchim/sample-codes-for-aiml.git` を入力します。

最後に、右下にあるオレンジ色の「ノートブックインスタンスの作成」をクリックします。

ノートブックインスタンス一覧画面で、作成したノートブックインスタンスのステータスが Pending と表示されているはずです。この状態で数分待ちます。

## Jupyter でノートブックを開く
ノートブックインスタンスのステータスが InService に変わると、アクション列にリンクが表示されます。Jupyter と JupyterLab どちらを選んでも OK ですが、本記事では 「Jupyter を開く」のリンクをクリックして進めます。

![Jupyter を開く](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/6df225bd-8497-de8c-ca12-fd2bc31c3479.png)

「Jupyter を開く」のリンクをクリックすると、以下のような画面が表示されます。ノートブックインスタンスの設定の際に Git リポジトリを関連づけているため、初めからリポジトリが Clone された状態になります。

![Jupyter](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/ef67ed91-bb9f-12f7-4538-011905016fe2.png)

各フォルダには拡張子が ipynb のサンプルノートブックが格納されているので、サンプルノートブックを開き、ノートブックの解説を見ながら実行していきます。

ノートブックは解説パートとソースコードパートで構成されており、ソースコードパート（セルと呼びます）をクリックしてアクティブにしてから、上にある Run ボタンをクリックするか、Shift+Enter で実行します。

セルの実行中はセルの左側にある表示が In [*] となりますが、実行が完了すると In [1] のように、 * の代わりに実行された順番を示す数字が表示されます。

![ノートブック](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315319/665a0382-ba13-da7e-eb3d-6ec513cac3da.png)


## リソース削除
本記事の手順でハンズオンを実施すると、基本的に以下のリソースが使用されます。これらは削除されるまで課金が発生しますので、不要になったら忘れずに削除してください。ハンズオン教材によっては他のサービスを利用するものもありますので、サンプルノートブックに記載の方法ですべてのリソースを削除してください。

- Amazon SageMaker ノートブックインスタンス
- Amazon SageMaker 推論用エンドポイント
- Amazon S3

### Amazon SageMaker ノートブックインスタンスの削除
ノートブックインスタンスを削除すると、保存されているファイルもすべて削除されますのでご注意ください。

Amazon SageMaker コンソールの左側のメニューの「ノートブックインスタンス」をクリックしてノートブック一覧を表示し、削除したいノートブックインスタンスの左側にあるラジオボタンを選択します。次に、上部にある「アクション」をクリックして「停止」をクリックします。するとノートブックインスタンスのステータスが Stopping になるので、ここが Stopped になるまで少し待ちます。Stopped になったら再度ノートブックインスタンスのラジオボタンを選択して「アクション」から「削除」を選択します。

ノートブックインスタンスを停止すると、コンピュートリソースへの課金は停止しますが、インスタンスにアタッチされているストレージへの課金は継続します。完全に課金を止めるには、インスタンスを停止してから、さらに削除する必要がありますので忘れずに実施してください。

### Amazon SageMaker 推論用エンドポイントの削除
サンプルノートブックにも推論用エンドポイントの削除方法が記載されていますが、忘れてしまった場合や、本当に削除できたか確認したい場合にこの手順を実施ください。

まず。Amazon SageMaker コンソールの左側のメニューの「エンドポイント」をクリックしてエンドポイント一覧を表示し、削除したいエンドポイントの左側にあるラジオボタンを選択します。次に、上部にある「アクション」をクリックして「削除」をクリックします。

### Amazon S3 のバケットの削除
本記事でご紹介したリポジトリのサンプルノートブックによって、。S3 にデータを保存する場合としない場合がありますので、使用した S3 フォルダやバケットを S3 のコンソールから削除してください。バケットの削除方法は [こちら](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/user-guide/delete-bucket.html) をご参照ください。

## おわりに
このハンズオンをきっかけに機械学習を楽しんでいただければ幸いです。サンプルは徐々に増やしていく予定です。動かないなど不具合がありましたら GitHub で issue を作成いただければベストエフォートで対応します。

なお、日本の公式 Amazon SageMaker サンプル GitHub リポジトリが [こちら](https://github.com/aws-samples/aws-ml-jp) にあります。Tensorflow や PyTorch などのフレームワークを使って自前のモデルを学習させる方法などが紹介されています。また、[こちら](https://github.com/aws/amazon-sagemaker-examples) はグローバルの Amazon SageMaker サンプル GitHub リポジトリです。より多くのサンプルが公開されています。