【AWS】SageMakerStudioでノートブックをスケジュール実行する

# 概要 
本記事では、**SageMakerStudio**というAWSのサービスにおいて、Notebookに記述した処理をスケジュール実行する方法について説明していきます。

普段の業務でモデルの学習時間に7時間ほどかかってしまうので、「業務時間外に実行、始業時間以降に結果を確認」というフローを実現したかったのです。そこで**sagemaker-run-notebook**という便利なライブラリがあることを知り、使い勝手がよかったので記事を書いてみました。

普段SageMakerで開発を行なっている方で、「実行時間が長いので夜中に実行しておきたい」「毎日同じ処理を決まった時間帯に実行したい」といった悩みを持っている方の参考になれば嬉しいです。

# 目次
[1.SageMakerStudioとは](#1-SageMakerStudioとは)
[2.全体像](#2-全体像)
[3.手順の説明](#3-手順の説明)
[4.拡張機能の使い方](#4-拡張機能の使い方)
[5.最後に](#5-最後に)

# 1. SageMakerStudioとは
>Amazon SageMaker Studioは、すべてのML開発ステップを実行できる単一のウェブベースのビジュアルインターフェイスを提供し、データサイエンスチームの生産性を最大10倍向上させます。SageMaker Studioは、モデルの構築、トレーニング、およびデプロイに必要な各ステップに対する完全なアクセス、コントロール、および可視性を提供します。

コードをゴリゴリ書かなくても機械学習モデルを構築できる便利なサービスなんですね。
とはいえ私も使い始めたばかりなので全然使いこなせておりません笑

# 2. 全体像
スケジュール実行するためには**sagemaker-run-notebook**というライブラリを使います。 
このライブラリを使うためにはいくつか準備が必要で、それも含めた大まかな手順を以下に示します。

1. AWS-CLIをインストール・セットアップ
1. sagemaker-run-notebookをインストール(同時にcliツールもインストールされる)
1. cliツールを使ってポリシーやDockerコンテナを作成
1. 拡張機能のアクティブ化

詳細は[こちら](https://github.com/aws-samples/sagemaker-run-notebook/blob/master/QuickStart.md)を参照してください。非常にわかりやすい手順書が公開されていました。

次章ではそれぞれの詳細な手順を説明していきます。

# 3. 手順の説明
それでは具体的な導入手順を説明していきます。
今回はSageMakerStudioのセットアップは完了している前提で話を進めていきます。
完了していない方は[こちら](https://qiita.com/s_Pure/items/4312c0b27296d6dce433)の記事を参考にしてセットアップを完了させて下さい。
### AWS-CLIのインストール・セットアップ
以下のコマンドを順に実行してAWS-CLIをインストールします
```shell:terminal
% curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
% sudo installer -pkg AWSCLIV2.pkg -target /
```
以下でバージョンを確認できればインストール完了です。
```shell:terminal
% aws --version
aws-cli/2.6.1 Python/3.9.11 Darwin/21.2.0 exe/x86_64 prompt/off
```
aws configureで適宜必要な情報を入力すればセットアップも完了です。
```:terminal
% aws configure
AWS Access Key ID [None]:AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

### sagemaker-run-notebookをインストール
Githubから直接ライブラリをインストールします。
```shell:terminal
% pip install https://github.com/aws-samples/sagemaker-run-notebook/releases/download/v0.20.0/sagemaker_run_notebook-0.20.0.tar.gz
```
(※注意※)
ご自身のSageMakerStudioのJupyterLabのバージョンを確認して、1.xなら以下のバージョンをv0.19.0に指定して実行してください。(「Helpタブ->About JupyterLab」でご自身のJupyterLabのバージョンが確認できます。)
![スクリーンショット 2022-05-06 17.29.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1441421/afa00320-3aeb-9ec9-929d-62e6c86cb927.png)

### ポリシー・Dockerコンテナを作成
ライブラリをインストールした際にcliツールも同時にインストールされるので、以下のコマンドを実行しましょう。クラウドフォーメーションへのアクセス権限がない場合は実行できないので適宜設定してください。
```shell:terminal
% run-notebook create-infrastructure
```
このコマンドを実行すると、自動的にクラウドフォーメーションにてスタックが作成され、スケジュール実行に必要なポリシーやlambda関数が作成されます。
この時、**ExecuteNotebookClientPolicy-ap-northeast-1**という名前のポリシーが作成されますので、こちらをJupyterLabを使用するユーザーにアタッチしておきましょう。

次に以下のコマンドを入力しましょう。
```shell:terminal
% run-notebook create-container
```
これを実行すると、CodeBuildに一時的なプロジェクトが作成され、Dockerイメージがビルドされます。SageMakerのジョブはこのコンテナ内で実行されます。

### 拡張機能のアクティブ化
ここまできたらあとはSageMaker側の設定だけです。
スケジュール実行する方法は
1. CLIツールを用いる
1. Pythonライブラリを使用する
1. JupyterLabの拡張機能を使用する

の3通りありますが、今回は3個目の「JupyterLabの拡張機能を使用する」方法を説明していきます。

まずは、SageMakerStudioを起動してinstall-run-notebook.shというファイルを作成します。
ファイルの内容はGithubに公開されているのでコピペしましょう。JupyterLabのバージョンが1.xの方は、1行目を0.19.0にするのを忘れずに！
[install-run-notebook.sh](https://github.com/aws-samples/sagemaker-run-notebook/blob/master/scripts/studio/install-run-notebook.sh)
![スクリーンショット 2022-05-06 17.10.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1441421/a149698a-3ffc-d0e3-e781-685fba939ac1.png)

最後に、ターミナルタブ(File->New->Terminal)を開いて、先ほど作成したスクリプトファイルを実行しましょう。
```bash
$ bash install-run-notebook.sh
```
スクリプトの実行が完了すると拡張機能がactivateされます。

ページを更新するとロケットマークのタブが出現していると思いますが、こちらがスケジュール実行用の拡張機能になります！
![スクリーンショット 2022-05-06 17.23.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1441421/bf1effd7-3ddf-d0e8-b32d-5a1ebc4cdefc.png)
これで拡張機能を使ってノートブックをスケジュール実行する準備が整いました。
次章では拡張機能の使い方を説明していきます。

# 4. 拡張機能の使い方
まずはスケジュール実行を行うノートブックを作成しましょう。私はtest.ipynbを作成しました。
![スクリーンショット 2022-05-06 18.03.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1441421/fab2b3ba-e481-f305-691e-e931bb04bdf4.png)
- image: 手順3でecrに作成されたnotebook-runnerイメージを指定
- Role: 実行ロールを入力
- Instance: 各自適切なインスタンスタイプを入力
- Rule Name: 各自好きなルール名を入力
- Schedule: cron式でスケジュール設定を行う。cron式については[こちら](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html)を参考にしてください。

以上必須項目を入力し終えたら、Create Scheduleボタンを押しましょう。
何も問題がなければ、これでcron式で設定したスケジュールに沿って指定のノートブックが実行されます。
Scheduleボタンを押すとこれまでに作成したスケジュールが見れますので、もし必要無くなったらDeleteしましょう。
![スクリーンショット 2022-05-06 18.14.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1441421/d98bd110-da9a-ce75-1720-68f35a3831ff.png)

実行結果のノートブックはS3に自動的に保存されていくので、実行結果を見たい場合は、ダウンロードするか、以下のようにView Output->Create a Copyでワークスペースにコピーをダウンロードしましょう。
![スクリーンショット 2022-05-06 18.20.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1441421/3edc4e29-a1bf-ba91-4d52-9401629beff3.png)
![スクリーンショット 2022-05-06 18.22.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1441421/ff77e1b5-f715-02c5-7501-244445bf317a.png)

これにてsagemaker-run-notebook拡張機能の簡単な使い方の説明は終わりです。
スケジュールのトリガータイプは他にもたくさんあるので、あとは皆さんが使いやすいようにカスタムしていくと良いでしょう。

# 5. 最後に 
スケジュール機能を導入してみましたが、非常に便利で開発効率が上がりそうだと感じました。
自分自身まだSageMakerStudioを使いこなせているわけではないので、便利な機能を見つけたらまた紹介しようと思います。
もし私と同じような悩みを持っている方のお役に立てれば幸いです！