SageMaker Studioの使い方

Amazon SageMaker Studioをとことん使い倒して情報発信していきます！


# 公式資料
開発者ガイド
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/experiments-mnist.html

SageMaker Studio と Autopilotのデモ
https://aws-blogs-prod.amazon.com/news/aws-aiml-tokyo3/
手順書とデモンストレーション動画あり

Use Amazon SageMaker Studio Notebooks
https://docs.aws.amazon.com/sagemaker/latest/dg/notebooks.html
SageMaker Studioのアーキテクチャが掲載されている。
ユーザーごとに JupyterServer App と EFS の領域が割り当てられ、KernelGateway App を立てて実験を行う。
JupyterServer Appは非課金
EFSは課金
KernelGateway Appは課金


# ハンズオン素材
SageMaker Immersion Day
https://sagemaker-immersionday.workshop.aws/ja/prerequisites.html

# ノートブックカスタムコンテナ
Amazon SageMaker Studio のノートブックでカスタムイメージを使う
https://qiita.com/mariohcat/items/1f183c56478ad60ebe36

カスタムコンテナイメージを用いたデータ分析環境共通化Tips（ローカルPC&AWS SageMaker Studio）
https://tech.connehito.com/entry/2021/06/10/120044



# CLIでユーザーを作る

https://docs.aws.amazon.com/cli/latest/reference/sagemaker/create-app.html
CLIを使うときに、JSONシンタックスの使い方がよくわからなかったので、検証する。
もともとはcreate-domainしたかったのだが、JSON構文がどうやって使うのかわからなかったので、
まずはシンプルなcreate-appにてJSON構文の使い方を覚える。


# マネジメントコンソールを経由せずにログインする方法

1. AWS Single Sign-On(SSO)を利用する。
2. 署名付き(Presigned)URLを発行して対応

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sagemaker/create-presigned-domain-url.html

```bash
$ aws sagemaker create-presigned-domain-url --domain-id d-XXXXXXXXXXXX --user-profile-name default-XXXXXXXXXXXXX --region us-east-1
```

有効期限は1800秒(30分)から43200秒(12時間)
Valid Range: Minimum value of 1800. Maximum value of 43200.

SageMakerノートブックインスタンスでも発行は可能
https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreatePresignedNotebookInstanceUrl.html
こちらはデフォルト5分と記載あり。
（おそらくSageMaker Studioも5分)



# PyTorchが動かない

## ImportError: FloatProgress not found. Please update jupyter and ipywidgets.

下記がエラーメッセージ全文

```
ImportError: FloatProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
```

利用したリポジトリ
https://github.com/YutaroOgawa/pytorch_advanced/blob/master/1_image_classification/1-1_load_vgg.ipynb

### 環境
インスタンス：4 vCPU + 16 GiB + 1 GPU
カーネル：Python 3 (PyTorch GPU Optimized)

### エラー内容

https://github.com/YutaroOgawa/pytorch_advanced/blob/master/1_image_classification/1-1_load_vgg.ipynb

```py
# 学習済みのVGG-16モデルをロード
# 初めて実行する際は、学習済みパラメータをダウンロードするため、実行に時間がかかります

# VGG-16モデルのインスタンスを生成
use_pretrained = True  # 学習済みのパラメータを使用
net = models.vgg16(pretrained=use_pretrained)
net.eval()  # 推論モードに設定

# モデルのネットワーク構成を出力
print(net)
```
models.vgg16()にて、エラーが発生した。


### 確認コマンド
```
!pip freeze | grep ipywidgets
!pip freeze | grep widgetsnbextension
!pip freeze | grep conda
```

```py
# 動作するノートブックインスタンスの場合
ipywidgets==7.4.0
widgetsnbextension==3.4.2
anaconda-client==1.6.14
anaconda-project==0.8.2
nb-conda==2.2.1
nb-conda-kernels==2.2.2
```

```py
# 動作しないSageMaker Studioの場合
conda==4.8.3
conda-package-handling==1.6.0
```
### 対応策1
再度発生し、対応策2ではだめだった。こちらが正しいかも
1.エラーメッセージにあるサイトを見る
https://ipywidgets.readthedocs.io/en/stable/user_install.html

2.with conda を実行
conda install -c conda-forge ipywidgets

3. kernelを再起動

### 対応策2
ipywidgetsのバージョンをダウンすると、治った（詳細原因不明。。）

```
!pip uninstall -y ipywidgets
!pip install ipywidgets==7.4.0
```

```
# 確認
!pip freeze | grep ipywidgets
!pip freeze | grep widgetsnbextension
!pip freeze | grep conda
```
ipywidgets==7.4.0
widgetsnbextension==3.4.2
conda==4.8.3
conda-package-handling==1.6.0


### 参考
AnacondaのJupyter notebookでipywidgtesのエラーの対処法
https://qiita.com/SaitoTsutomu/items/192109ce96ac23d4db7d


# Experiments
モデル開発向け。

Amazon SageMaker Experimentsを試してみた #reinvent
https://dev.classmethod.jp/articles/yoshim-amazon-sagemaker-experiments/

>SageMaker、もしくはSageMaker Autopilot上でトレーニングJOBを実行する、といった条件で「Amazon SageMaker Experiments」を利用するために必要なことは「Estimator」に「そのtrialがどのexperimentsに紐づけられるか」といったことを定義したパラメータを追加すればよく、全ての入力と出力は自動的にログとして出力されます。

ようするに、Experimentとtrialを作成し、.fitの時にそのtrialを指定しておけばいいということ。

【公式】Amazon SageMaker Studio でのトライアルの追跡と比較
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/experiments-mnist.html


CLI:list-experiments
https://docs.aws.amazon.com/cli/latest/reference/sagemaker/list-experiments.html
Experimentsのリストを取得したい場合。

```
$ aws sagemaker list-experiments | grep ExperimentName | cut -d ":" -f 2
```

# Debugger
モデル開発向け。

公式
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/train-debugger.html

SageMaker Debuggerを使ってみた（XGBoost編）
https://qiita.com/nakamichi/items/e097bf2175e963e450b9
>現時点ではこれらの指標を簡単に追跡できるのはSageMaker Debuggerだけだと思うので，この機能を使って新たにデバッグや精度改善，モデル解釈のテクニックを考えてみるのはおもしろそうです．

Amazon SageMaker Debuggerによって収集したデータをTensorBoardで確認する
https://dev.classmethod.jp/articles/sagemaker-debugger-tensorboard/

Amazon SageMaker Debuggerを試してみる
https://techblog.nhn-techorus.com/archives/16854
ノートブックインスタンスではTensorboardにアクセスできたが、SageMaker Studioからはアクセスできなかった。(2020/6/1)まあ、ローカルPCで起動すればいいかな。。S3のパス指定して。

>更に、モデル内部の状態をS3に出力する際、TensorBoard用のログとして出力できます。
このTensorBoard形式での出力機能は、PyTorchなど、TensorFlow以外のフレームワークでも使用できます。

>このように、SageMaker Debuggerを使えば、ほぼスクリプトの修正なしで、トレーニング中のモデルの問題を自動で検知し、モデル内部を可視化し、問題を調査することができ、とても便利です。
特にトレーニングに長時間を要する大規模なモデルにおいては、トレーニング中に問題を素早く検知し解決できることで、検証サイクルの改善が期待できます。


【公式】Amazon SageMaker Debugger によって提供される組み込みルールのリスト
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/debugger-built-in-rules.html

【公式】SageMaker API : TensorBoardOutputConfig
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/APIReference/API_TensorBoardOutputConfig.html

【公式】Amazon SageMaker Debugger TensorBoard 概要、分布、ヒストグラムを使用してテンソルを可視化する
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/debugger-data.html#debugger-enable-tensorboard-summaries

# Model Monitor
本番運用向け。

公式
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/model-monitor.html

>Amazon SageMaker Model Monitor は、本番稼働中の Amazon SageMaker 機械学習モデルの品質を継続的に監視します。開発者はこれにより、データのドリフトなど、モデルの品質に偏差がある場合にアラートを設定できます。これらの偏差を早期かつプロアクティブに検出すると、モデルの再トレーニング、上流システムの監査、データ品質の問題の修正などの修正措置を講じることができます。手動でモデルを監視したり、追加のツールを構築したりする必要はありません。コーディングを必要としない Model Monitor のビルド済みモニタリング機能を使用できます。また、カスタム分析を提供するコーディングによってモデルを柔軟に監視できます。

【公式】モニタリングジョブのスケジュール
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/model-monitor-scheduling.html
>ベースラインリソース (制約および統計) を使用して、リアルタイムトラフィックと比較します。

学習モデル構築時のインプットと、推論のインプット（リアルタイムトラフィック）の統計量を比較している。

Amazon SageMaker Model Monitorを試してみた #reinvent
https://dev.classmethod.jp/articles/yoshim-amazon-sagemaker-model-monitor/
公式GitHubのIntroductionを日本語解説。わかりやすい。

やってみた。にあるこちらのGitHubをSageMaker Studioで実行確認できた。
https://github.com/awslabs/amazon-sagemaker-examples/blob/master/sagemaker_model_monitor/introduction/SageMaker-ModelMonitoring.ipynb

モニタリングのカスタマイズ
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/model-monitor-custom-monitoring-schedules.html
検知したい項目を独自に設定することも可能

# SageMaker Clarify
local SHAPとglobal SHAPの概念がある。

local SHAP:推論した1データのSHAP
global SHAP:local SHAPを集計（平均、中間値、二乗平均）した値
https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-configure-processing-jobs.html

【公式】ホワイトペーパー
https://pages.awscloud.com/rs/112-TZM-766/images/Amazon.AI.Fairness.and.Explainability.Whitepaper.pdf

SageMaker Clarifyで特徴量重要度を出力する
https://note.com/dd_techblog/n/n98c44ae5cfca

SageMaker Clarify を用いた機械学習モデルのバイアス検出と説明可能性
https://techblog.nhn-techorus.com/archives/18312

SHAP を用いて機械学習モデルを説明する
https://www.datarobot.com/jp/blog/explain-machine-learning-models-using-shap/



# 自動でインスタンスを停止したい
以下のExtensionsを導入すればOK
https://aws.amazon.com/blogs/machine-learning/save-costs-by-automatically-shutting-down-idle-resources-within-amazon-sagemaker-studio/


Lambda + EventBridgeでSageMaker StudioのKernelGatewayを自動削除して不要なコストを削減する
https://dev.classmethod.jp/articles/sagemaker-studio-delete-kernel-gateway-by-lambda-and-event-bridge/


# ユーザーごとにコスト管理したい
コストタグに対応しました。
https://aws.amazon.com/jp/about-aws/whats-new/2021/04/now-use-tags-track-allocate-amazon-sagemaker-studio-notebooks-costs/

# ユーザーが起動できるインスタンスを制限したい
IAMポリシーで制御する
https://github.com/aws/amazon-sagemaker-examples/issues/1499#issuecomment-850381743
sagemaker:CreateAppをDenyすることで、起動できなくなります。

# SageMaker AutoPilot
Studioでなくても使える。Studioだとノーコードで実行できる。

論文
https://www.amazon.science/publications/amazon-sagemaker-autopilot-a-white-box-automl-solution-at-scale


# SageMaker Pipelines
Amazon SageMaker Pipelines がどんなことをしているか図解しながら進めてみた
https://dev.classmethod.jp/articles/amazon-sagemaker-pipelines-workflow-image/

【公式doc】Update the Approval Status of a Model
https://docs.aws.amazon.com/sagemaker/latest/dg/model-registry-approve.html
公式のテンプレートでModel Registryに登録されたモデルの承認プロセスがあるが、boto3でもできる。