先日のre:Inventで多くのアップデートが発表された中、Sagemakerにかなり多くのアップデートが発表されました。
参考
https://dev.classmethod.jp/cloud/aws/reinvent2019-summary-sagemaker/
https://aws-seminar.smktg.jp/public/seminar/view/892
AWSとして機械学習に力を入れてるなあというのがはっきり見て取れますね。
また、おそらくAWS自身が機械学習を使って自分たちのサービスに組み込んでいるだろうと思われる機能追加も出てきています。
re:Inventの前ですけど、アノマリーディテクションとかは完全にそれですね。
さて、せっかく色々出たので「ここらで一つ触ってみよう」というエントリです。
既に知ってる人には特に得るものはないと思いますw
筆者の現在のレベルとしては
- 機械学習に触れたことがない(聞いたことはありますが)
- Sagemakerに触れたことがない
というわけで、ほぼ素人です。
色々参考にしながらやっていきます。
※なお、「完全に理解した」の定義についてはこちらを参考にしてください。
https://togetter.com/li/1268851
ノートブックインスタンスの作成
まずはコンソールに従ってノートブックインスタンスを作成します…と言いたいとこですが、どうやらその前にS3バケットが必要らしいので適当な名前で作っておきます。
ただし、名前に「sagemaker」を含める必要があるようです。
※今回は設定はすべてデフォルトで作成しています。
![スクリーンショット 2019-12-14 16.17.36.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F53386%2F632ca1cf-c826-9881-6c5f-6ce79c972dd9.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=44bbe25418a7d428911b7d10b3348345)
ここで作ったバケットは、IAMロールを作成するときに指定します。
今回は初めてノートブックインスタンスを作成するので、過去に作成したIAMロールはもちろんありません。
なのでインスタンス作成時に合わせて作成することとします。
![スクリーンショット 2019-12-14 16.18.52.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F53386%2F1fece2ac-dc12-c62e-217b-ee77f1bb7019.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=5db42eb4bcca57aaa9349ace7e414b7f)
それ以外の設定はデフォルトのまま作ります。
![スクリーンショット 2019-12-14 16.20.44.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F53386%2F4979b520-a4e0-35ed-7d8a-0c689d153872.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=67e3f8f47d52237c37fe17ee8985a3f7)
作成には少し時間がかかりますが、ボタンを押してしばらく待っているとインスタンスが利用可能になります。
![スクリーンショット 2019-12-14 16.34.28.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F53386%2F56380782-724f-7508-b4f2-d16c5bf8be61.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=6074451679fcd0de2239061fcbc28999)
Jupyter Notebookについての説明は(あまり詳しくできないというのもありますが)このへんの記事を参照
https://deepage.net/machine_learning/2016/12/13/jupyter_notebook.html
Pythonを実行するための環境と思い込んでたんですが、いろんな言語に対応してるんですね。
トレーニングしてみる
AWSの公式ドキュメントにGetting Started的なものがあるのでそれに従います。
今回はConda_Python3
の環境を利用します。
やることはぶっちゃけるとドキュメントに従ってコードを貼り付けて実行するだけです。
それぞれのコードで何やってるかはドキュメント内で解説されてるのでここでは割愛します。
最初に下記を貼り付けてRunを押します。
元のコードはこちら
バケット名は今回作成したものにしています。
※実はこれを最初にしていなかったがために後でエラーになったのでやり直しています。
なのでスクショの順番が少し変わっているところがあります。
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」を押します。
![スクリーンショット 2019-12-14 16.46.07.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F53386%2F0cafb400-a955-efbe-7e0e-2fe0f5f12f3f.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=17ea637a6f2bf1aaf259a0029acbf078)
次にデータセットを変換しS3にアップロードします。
うまくいくとこんな感じになるはずです。
![スクリーンショット 2019-12-14 17.10.11.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F53386%2Fd2a5f6ea-bea4-8e2e-9676-b16bf5b0b860.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=e642000d026068762ca2d43ff8229482)
![スクリーンショット 2019-12-14 17.09.18.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F53386%2F5612bc35-d091-7e8e-d0a4-84617ab27acf.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=681532f841784ec216c38defd9bedfb7)
次はステップ5、モデルのトレーニングをします。
今回は流れに従ってXGBoostアルゴリズムを使うことにします。
そのまま実行しようとしたら下記のようなWARNINGが出てしまったので、少し貼り付けるコードを改変しました。
![スクリーンショット 2019-12-14 17.12.50.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F53386%2Fbf3aed4d-4447-5b2f-fa26-59199065cdcb.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=54d6a4764683341ec4c5d84bc6fa3a3f)
import sagemaker
from sagemaker.amazon.amazon_estimator import get_image_uri
container = get_image_uri(boto3.Session().region_name, 'xgboost', '0.90-1')
このステップはこんな感じ
![スクリーンショット 2019-12-14 17.16.25.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F53386%2F6aa010e8-1199-525f-66cc-240526603049.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=765197d354462c121071bb5e9e465ba1)
コンソールに戻ってトレーニングジョブを見ると動いているのがわかりますね。
![スクリーンショット 2019-12-14 17.17.29.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F53386%2F136ba846-bcca-9a05-7806-07aa0040a04f.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=b48124611b2a315c1fdecd0167f82399)
最大15分ほどかかるそうなので待ちます。(自分は4分で終わりました。)
さすがに貼ったコードの意味を何も理解していないのはまずいので待っている間にコードを見返すのもいいでしょう。
次にステップ6のモデルのデプロイですが、今回はステップ 6.1: Amazon SageMaker ホスティングサービスにモデルをデプロイするに従います。
どうやらdeployメソッド一発で行えるようです。
6.1を選んだのでそのままステップ7.1: Amazon SageMaker ホスティングサービスにデプロイされるモデルの検証に進みます。
そのまま検証に進んだんですが、最後の検証でエラーになってしまいました。
ちょっと解消できそうにないのでここで断念。
うーん、でも大まかなここまでの流れはつかめたので今度やり直します。
完全に理解…できなかったよ…
AutoPilot
これだけだとあんまりなので、先日のre:Inventで発表されたAutoPilotを試してみます。
書こうと思った内容がほぼこちらの記事に書いてあったので、詳細はこちらを見てください(手抜き)
AutoPilotのサンプルはここにあります。
![スクリーンショット 2019-12-14 18.27.30.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F53386%2F1a840822-ec4b-c77e-d493-75622aa848f1.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=e141a3901354ba6e0c5f2453ade50353)
![スクリーンショット 2019-12-14 18.27.34.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F53386%2Fcbe3f7e4-cea1-5a34-cfc4-7adc69c8fb86.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=09fe25f2040e8a6d736f2a7bfe9d2165)
こちら
に従ってやっていきます。
サンプルに文章も細かく書いてあるので、そのまま実行していきます。
途中でMLを実行してステータスを表示します。
ここでかなり待ちます。
![スクリーンショット 2019-12-14 19.39.50.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F53386%2F12ca270e-7ef1-e216-9e32-d2dd4cc0fdf8.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d4124d85e33c5584b65725890693f1ab)
終わるとこんな感じになります。
![スクリーンショット 2019-12-14 20.58.59.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F53386%2Fcf3adb93-3374-e07b-829a-bc4d16c0c76c.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=71bf02c08559008ef289710758418242)
ここまで数時間ぐらいかかりました。
こんな感じでモデルががっつりできています。
![スクリーンショット 2019-12-14 21.01.52.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F53386%2Fbef925db-e5f8-4c84-98b3-cb7efc49ec24.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=f50497b2c77fc4fbf8df6c04ecdafebd)
最終的にバッチ変換ジョブを実行して結果を見るとこんな感じになりました。
なんとなくそれっぽい?
![スクリーンショット 2019-12-14 21.13.47.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F53386%2Fe40e0114-40ab-3ac8-4013-6df39897848d.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=37127b0cb5e6090754785cd0e42f463d)
あとがき
ネタに走ったタイトルですが、いい加減機械学習のほうも少し触らなきゃと思って、その第一歩として手を付けました。
何もしてないと中々仕事で触ることもなくなってしまうので自分でやってみないといけませんね。
というわけで、理解はともかくとして「まず触ってみた」というものでした。
何をやってるか理解していくのはこれからですね、とかいうとタイトルに反してしまうw
環境を自分で用意するのは大変だなと思うので、サクッと実行環境つくれるのはいいかもしれませんね。
こんなことやってますが、明日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ドルくらいかかってました。
ご利用は計画的に。