[AWS]Sagemakerノートブックインスタンスを使うときの初期設定(無駄課金防止)

Sagemakerノートブックインスタンスの料金は、CPUの性能とインスタンス起動時間で決まります。無駄課金を防ぐための設定を書いておきます。

:::note
ここを見て勉強しました！AWS初心者にとってクラスメソッドさんの記事は本当に心強い！
ありがとうございます！
https://dev.classmethod.jp/articles/aws-sagemaker-lifecycle-auto-stop/
:::

# １．コスト
最新情報は公式サイトでご確認ください。

https://aws.amazon.com/jp/sagemaker/pricing/


# ２．この記事のポイント
・Sagemakerの料金は、CPUとメモリのクラスと稼働時間で決まる。
　(S3を利用したらもちろんその分も)
・「一定時間経過すると自動でインスタンス停止する」という仕掛けで無駄課金が発生しないようにする。
・インスタンスの管理画面に、"やりたいことそのもの"のパラメータはない。
・起動時にアイドリング検知のスクリプトを定期実行するジョブを登録し、規定時間ごとに動くようにする(アナログ)。例えば、アイドリング時間10分になったらシャットダウンしたい場合は、cronジョブを10分ごとに動かすようにする(ノートブックインスタンスはUNIXライクです)

# ３．手順

## 3-1.ライフサイクル設定を行う。

(1) [Sagemaker]の管理画面にアクセスし、左メニューにて[管理者設定]＞[ライフサイクル設定]＞[ノートブックインスタンス]タブ　の順にクリックし、[設定の作成]をクリックする。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/cd8f3b1a-5343-7fa7-554e-70c8d37a180e.png)

(2)Sagemakerの管理画面で下記情報を入力する。

・名前
　→任意の名前。例)auto-stop

 ・スクリプト
 [ノートブックの開始]タブが開いていることを確認して、このページのスクリプトをコピペして、アイドリング時間を設定する。

最後の行を編集する。この例では5分。
```python
 (crontab -l 2>/dev/null; echo "*/5 * * * * $PYTHON_DIR $PWD/autostop.py --time $IDLE_TIME --ignore-connections >> /var/log/jupyter.log") | crontab -
```

10分。
```python
 (crontab -l 2>/dev/null; echo "*/10 * * * * $PYTHON_DIR $PWD/autostop.py --time $IDLE_TIME --ignore-connections >> /var/log/jupyter.log") | crontab -
``` 

スクリプト全体。
```python
#!/bin/bash

set -ex

# OVERVIEW
# This script stops a SageMaker notebook once it's idle for more than 1 hour (default time)
# You can change the idle time for stop using the environment variable below.
# If you want the notebook the stop only if no browsers are open, remove the --ignore-connections flag
#
# Note that this script will fail if either condition is not met
#   1. Ensure the Notebook Instance has internet connectivity to fetch the example config
#   2. Ensure the Notebook Instance execution role permissions to SageMaker:StopNotebookInstance to stop the notebook 
#       and SageMaker:DescribeNotebookInstance to describe the notebook.
#

# PARAMETERS
IDLE_TIME=3600

echo "Fetching the autostop script"
wget https://raw.githubusercontent.com/aws-samples/amazon-sagemaker-notebook-instance-lifecycle-config-samples/master/scripts/auto-stop-idle/autostop.py


echo "Detecting Python install with boto3 install"

# Find which install has boto3 and use that to run the cron command. So will use default when available
# Redirect stderr as it is unneeded
CONDA_PYTHON_DIR=$(source /home/ec2-user/anaconda3/bin/activate /home/ec2-user/anaconda3/envs/JupyterSystemEnv && which python)
if $CONDA_PYTHON_DIR -c "import boto3" 2>/dev/null; then
    PYTHON_DIR=$CONDA_PYTHON_DIR
elif /usr/bin/python -c "import boto3" 2>/dev/null; then
    PYTHON_DIR='/usr/bin/python'
else
    # If no boto3 just quit because the script won't work
    echo "No boto3 found in Python or Python3. Exiting..."
    exit 1
fi

echo "Found boto3 at $PYTHON_DIR"


echo "Starting the SageMaker autostop script in cron"

#ここを編集。
(crontab -l 2>/dev/null; echo "*/5 * * * * $PYTHON_DIR $PWD/autostop.py --time $IDLE_TIME --ignore-connections >> /var/log/jupyter.log") | crontab -
```

::: note warn
 コピペのときに余計な改行コードが入っていないことを確認する。
:::

## 3-2.ノートブックインスタンスへの紐づけ。

**A:ノートブックインスタンス作成時**

(1)Sagemakerの管理画面で、左メニューから「ノートブックインスタンス」＜「ノートブックインスタンス」をクリック。

(2)[ノートブックインスタンスの作成]をクリック。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/e5540faa-6999-0c29-432f-dd0af91d31a1.png)

(3)「追加設定」をクリックするとオプション欄が出てくるので、[▼]をクリックする。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/344c89e1-3d55-e796-40ce-677feeaefe80.png)

(4)前の手順で作成した設定を選択する。※ここからライフサイクル設定の新規作成も可能。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/c7ba39fe-66ea-5270-0c8f-562a4f427f0b.png)

(5)[ノートブックインスタンスの作成]をクリック。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/02be38ae-fee1-7461-93af-c4d01a9255e3.png)

**B:ノートブックインスタンスへ後付け**

紐づけたいインスタンスの編集画面から後付け設定することも可能。

(1)ノートブックインスタンスの一覧から対象インスタンス名をクリック。
(2)右上の[編集]をクリック
(3)「追加設定」をクリックするとオプション欄が出てくるので、前の手順で作成した設定を選択する。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/1691d1b7-b950-da0a-117e-31fc813a082f.png)

(4)[ノートブックインスタンスの更新]をクリック。


# ４．参考
他にもいろいろなスクリプトがAWSから公開されています。

https://github.com/aws-samples/amazon-sagemaker-notebook-instance-lifecycle-config-samples/tree/master