Sagemakerのアップデートで機械学習を完全に理解…したかった

先日の[re:Invent](http://reinvent.awseventsjapan.com/)で多くのアップデートが発表された中、Sagemakerにかなり多くのアップデートが発表されました。

参考
https://dev.classmethod.jp/cloud/aws/reinvent2019-summary-sagemaker/
https://aws-seminar.smktg.jp/public/seminar/view/892

AWSとして機械学習に力を入れてるなあというのがはっきり見て取れますね。
また、おそらくAWS自身が機械学習を使って自分たちのサービスに組み込んでいるだろうと思われる機能追加も出てきています。

re:Inventの前ですけど、アノマリーディテクションとかは完全にそれですね。

さて、せっかく色々出たので「ここらで一つ触ってみよう」というエントリです。
既に知ってる人には特に得るものはないと思いますｗ

筆者の現在のレベルとしては

- 機械学習に触れたことがない（聞いたことはありますが）
- Sagemakerに触れたことがない

というわけで、ほぼ素人です。
色々参考にしながらやっていきます。

※なお、「完全に理解した」の定義についてはこちらを参考にしてください。
https://togetter.com/li/1268851


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

まずはコンソールに従ってノートブックインスタンスを作成します…と言いたいとこですが、どうやらその前にS3バケットが必要らしいので適当な名前で作っておきます。
ただし、[名前に「sagemaker」を含める必要がある](https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/gs-config-permissions.html)ようです。
※今回は設定はすべてデフォルトで作成しています。

<img width="712" alt="スクリーンショット 2019-12-14 16.17.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/632ca1cf-c826-9881-6c5f-6ce79c972dd9.png">

ここで作ったバケットは、IAMロールを作成するときに指定します。
今回は初めてノートブックインスタンスを作成するので、過去に作成したIAMロールはもちろんありません。
なのでインスタンス作成時に合わせて作成することとします。

<img width="855" alt="スクリーンショット 2019-12-14 16.18.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/1fece2ac-dc12-c62e-217b-ee77f1bb7019.png">

それ以外の設定はデフォルトのまま作ります。

<img width="836" alt="スクリーンショット 2019-12-14 16.20.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/4979b520-a4e0-35ed-7d8a-0c689d153872.png">

作成には少し時間がかかりますが、ボタンを押してしばらく待っているとインスタンスが利用可能になります。

<img width="1112" alt="スクリーンショット 2019-12-14 16.34.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/56380782-724f-7508-b4f2-d16c5bf8be61.png">

Jupyter Notebookについての説明は（あまり詳しくできないというのもありますが）このへんの記事を参照
https://deepage.net/machine_learning/2016/12/13/jupyter_notebook.html

Pythonを実行するための環境と思い込んでたんですが、いろんな言語に対応してるんですね。

## トレーニングしてみる

[AWSの公式ドキュメント](https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/gs.html)に[Getting Started的なもの](https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/ex1-preprocess-data.html)があるのでそれに従います。

今回は`Conda_Python3`の環境を利用します。
やることはぶっちゃけると**ドキュメントに従ってコードを貼り付けて実行するだけ**です。
それぞれのコードで何やってるかはドキュメント内で解説されてるのでここでは割愛します。

最初に下記を貼り付けてRunを押します。
元のコードは[こちら](https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/ex1-prepare.html)
バケット名は今回作成したものにしています。
※実はこれを最初にしていなかったがために後でエラーになったのでやり直しています。
なのでスクショの順番が少し変わっているところがあります。

```python
import os
import boto3
import re
import copy
import time
from time import gmtime, strftime
from sagemaker import get_execution_role

role = get_execution_role()

region = boto3.Session().region_name

bucket='sagemaker-completely-understood' # Replace with your s3 bucket name
prefix = 'sagemaker/xgboost-mnist' # Used as part of the path in the bucket where you store data
bucket_path = 'https://s3-{}.amazonaws.com/{}'.format(region,bucket) # The URL to access the bucket

```

まずはデータセットをダウンロードします。
上記のドキュメントのコードを貼り付け、「Run」を押します。

<img width="1163" alt="スクリーンショット 2019-12-14 16.46.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/0cafb400-a955-efbe-7e0e-2fe0f5f12f3f.png">

すると、データセットがダウンロードされます。
<img width="1197" alt="スクリーンショット 2019-12-14 16.46.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/4d56b71e-65a1-85ee-c600-c1aeab452f83.png">

次にデータセットを変換しS3にアップロードします。
うまくいくとこんな感じになるはずです。

<img width="943" alt="スクリーンショット 2019-12-14 17.10.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/d2a5f6ea-bea4-8e2e-9676-b16bf5b0b860.png">


<img width="739" alt="スクリーンショット 2019-12-14 17.09.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/5612bc35-d091-7e8e-d0a4-84617ab27acf.png">

次はステップ5、モデルのトレーニングをします。

今回は流れに従ってXGBoostアルゴリズムを使うことにします。

そのまま実行しようとしたら下記のようなWARNINGが出てしまったので、少し貼り付けるコードを改変しました。

<img width="1033" alt="スクリーンショット 2019-12-14 17.12.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/bf3aed4d-4447-5b2f-fa26-59199065cdcb.png">


```python
import sagemaker

from sagemaker.amazon.amazon_estimator import get_image_uri

container = get_image_uri(boto3.Session().region_name, 'xgboost', '0.90-1')
```

このステップはこんな感じ

<img width="1085" alt="スクリーンショット 2019-12-14 17.16.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/6aa010e8-1199-525f-66cc-240526603049.png">

コンソールに戻ってトレーニングジョブを見ると動いているのがわかりますね。

<img width="1091" alt="スクリーンショット 2019-12-14 17.17.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/136ba846-bcca-9a05-7806-07aa0040a04f.png">

最大15分ほどかかるそうなので待ちます。（自分は4分で終わりました。）
さすがに貼ったコードの意味を何も理解していないのはまずいので待っている間にコードを見返すのもいいでしょう。

次にステップ6のモデルのデプロイですが、今回は[ステップ 6.1: Amazon SageMaker ホスティングサービスにモデルをデプロイする](https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/ex1-deploy-model.html)に従います。
どうやらdeployメソッド一発で行えるようです。
６．１を選んだのでそのまま[ステップ7.1: Amazon SageMaker ホスティングサービスにデプロイされるモデルの検証](https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/ex1-test-model-endpoint.html)に進みます。

そのまま検証に進んだんですが、**最後の検証でエラー**になってしまいました。
ちょっと解消できそうにないのでここで断念。
うーん、でも大まかなここまでの流れはつかめたので今度やり直します。

完全に理解…できなかったよ…

## AutoPilot

これだけだとあんまりなので、先日のre:Inventで発表されたAutoPilotを試してみます。
書こうと思った内容がほぼ[こちらの記事](https://dev.classmethod.jp/cloud/aws/try-amazon-sagemaker-autopilot/)に書いてあったので、詳細はこちらを見てください（手抜き）
AutoPilotのサンプルはここにあります。

<img width="568" alt="スクリーンショット 2019-12-14 18.27.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/1a840822-ec4b-c77e-d493-75622aa848f1.png">
<img width="1195" alt="スクリーンショット 2019-12-14 18.27.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/cbe3f7e4-cea1-5a34-cfc4-7adc69c8fb86.png">

useを選択して保存するとここに保存されます。
<img width="1218" alt="スクリーンショット 2019-12-14 18.28.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/b2e27714-6ddc-9850-ee47-b5159ad2d9ce.png">

[こちら](https://github.com/awslabs/amazon-sagemaker-examples/blob/master/autopilot/sagemaker_autopilot_direct_marketing.ipynb)
に従ってやっていきます。
サンプルに文章も細かく書いてあるので、そのまま実行していきます。

途中でMLを実行してステータスを表示します。
ここでかなり待ちます。

<img width="1098" alt="スクリーンショット 2019-12-14 19.39.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/12ca270e-7ef1-e216-9e32-d2dd4cc0fdf8.png">

終わるとこんな感じになります。

<img width="443" alt="スクリーンショット 2019-12-14 20.58.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/cf3adb93-3374-e07b-829a-bc4d16c0c76c.png">

ここまで数時間ぐらいかかりました。

こんな感じでモデルががっつりできています。

<img width="998" alt="スクリーンショット 2019-12-14 21.01.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/bef925db-e5f8-4c84-98b3-cb7efc49ec24.png">

最終的にバッチ変換ジョブを実行して結果を見るとこんな感じになりました。
なんとなくそれっぽい？

<img width="1038" alt="スクリーンショット 2019-12-14 21.13.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53386/e40e0114-40ab-3ac8-4013-6df39897848d.png">



## あとがき

ネタに走ったタイトルですが、いい加減機械学習のほうも少し触らなきゃと思って、その第一歩として手を付けました。
何もしてないと中々仕事で触ることもなくなってしまうので自分でやってみないといけませんね。
というわけで、理解はともかくとして「まず触ってみた」というものでした。
何をやってるか理解していくのはこれからですね、とかいうとタイトルに反してしまうｗ
環境を自分で用意するのは大変だなと思うので、サクッと実行環境つくれるのはいいかもしれませんね。

こんなことやってますが、明日DevOpsの試験を受けるために今日はがっつり対策しようと思ったのにだいぶ時間を取られちゃいました。
頑張ってきます。

## 参考にさせていただいた記事

全然前提知識がなかったので既に触っている記事を参考にさせていただきました。
いつも本当に助かっています。
https://dev.classmethod.jp/machine-learning/getting-started-with-amazon-sagemaker/
https://dev.classmethod.jp/cloud/aws/try-amazon-sagemaker-autopilot/

あとはもちろん公式ドキュメントも
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/gs.html


※追記

あとから見たら、ここに書いたことをやっただけで8ドルくらいかかってました。
ご利用は計画的に。