AWS公式資料で挑むMLS認定(12)-Amazon SageMaker Studio

##### [前回] [AWS公式資料で挑むMLS認定(11)-Amazon SageMakerチュートリアル(XGBoostモデルの構築)](https://qiita.com/mingchun_zhao/items/637c4a25ffa7fa0919d2)

## はじめに

今回は、Amazon SageMaker Studioを使用し、
機械学習モデルを構築/トレーニング/デプロイ/モニタリングします。

## 理論武装: MLモデルの予測(推論)プロセス

運用環境にMLモデルデプロイ時は、どのように予測を行うか考慮が必要。

### MLモデルの主な予測プロセス

- バッチ推論
    - 観測用バッチに基づいて予測を行う非同期プロセス
    - 予測結果は、ファイルかデータベースに格納される
- リアルタイム(対話型)推論
    - モデルをリリースし、任意のタイミングで予測を行う
    - 即座に応答を得られる 
    - ストリーミングおよび対話型アプリケーションのデータ分析に使用

### 予測プロセスの選択

モデルを評価し、自分のモデルに適したものを選択。
要検討事項:

- 予測の生成頻度
- 結果はすぐ必要か
- 予測をどのように生成するか
    - 個別に
    - 小規模なバッチで
    - 大規模なバッチで
- モデルで予想される待機時間
- モデル実行に必要なコンピューティング能力
- モデル保守と運用コスト

## Amazon SageMaker Studioとは

- 機械学習用の完全統合開発環境(IDE)
- ML開発のすべてのステップを実行可能
- 単一のウェブベースのビジュアルインターフェイスを提供

## チュートリアルの概要

- AWS公式チュートリアル
[Amazon SageMaker Studioを使用し、機械学習モデルを構築、トレーニング、デプロイ、およびモニタリングする](https://aws.amazon.com/jp/getting-started/hands-on/build-train-deploy-monitor-machine-learning-model-sagemaker-studio/)

- チュートリアルのシナリオ
    - Amazon SageMaker Studioを使用
    - XGBoostモデルを構築/トレーニング/デプロイ/モニタリング
        - [XGBoostモデルとは](https://qiita.com/mingchun_zhao/items/637c4a25ffa7fa0919d2#%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%AE%E3%82%B4%E3%83%BC%E3%83%AB)
    - 以下機械学習(ML)ワークフロー全体をカバー
        - 特徴量エンジニアリング(Feature Engineering)
            - 今あるデータ特徴量からドメイン知識などを生かし、新しくデータ特徴量を作成する作業
        - モデルトレーニング
        - MLモデルのバッチ/ライブデプロイ

- チュートリアルで学ぶ内容
    - ①Amazon SageMaker Studioコントロールパネルを設定
    - ②Amazon SageMaker Studioノートブックを使用し
        - 公開データセットをダウンロード
        - Amazon S3にアップロード
    - ③Amazon SageMaker Experimentを作成
        - トレーニング/処理のジョブを追跡/管理
    - ④Amazon SageMaker Processingジョブを使用し、生データから特徴量を生成
    - ⑤組み込みのXGBoostアルゴリズムを使用し、モデルをトレーニング
    - ⑥Amazon SageMaker Batch Transformを使用し、テストデータセットでモデルのパフォーマンスをテスト
    - ⑦モデルをエンドポイントとしてデプロイ
        - モニタリングジョブを設定
        - 本番環境でモデルエンドポイントのデータドリフトをモニタリング
            - データドリフト(Data drift)とは
                - モデルトレーニング時の`入力データ(特徴量、説明変数)`の統計的分布と
                - テスト/本番環境での`入力データ`の統計的分布が
                - 何らかの変化によってズレてきていること
                - 特徴量ドリフト(Feature drift)や共変量シフト(Covariate shift)とも呼ばれる
    - ⑧SageMaker Model Monitorを使用し、結果を視覚化、モデルをモニタリング
        - トレーニングデータセットとデプロイされたモデルの違いを判断

- トレーニングに使用するデータセット
    - `UCI Credit Card Default Data Set`を使用
    - データセットに含まれる内容
        - 顧客層
        - 支払い履歴
        - 請求履歴

## チュートリアル開始

各ステップにおける理論根拠に着目し、詳細ステップは割愛します。

### ステップ1: AWSアカウントを準備

本検証に必要な料金は`10USD`未満と書かれていました。

### ステップ2: Amazon SageMaker Studioコントロールパネルを作成

- a. Amazon SageMakerコンソールにサインイン
    - SageMaker Studio が利用可能なAWSリージョンを選択
- b. Amazon SageMakerのナビゲーションペインで`Amazon SageMaker Studio`を選択
    -  Amazon SageMaker Studioにオンボード(乗り込む?)が必要
        -  IAM認証を使用しました
- c. `今すぐ始める`で`クイックスタート`を選択
    - ユーザー名を指定
- d. `実行ロール`で`IAMロールを作成する`を選択
    - `任意のS3バケット`を選択
    - `ロールの作成`を選択
        - Amazon SageMakerで必要なアクセス許可を持つロールが作成される
        - ロールがインスタンスに割り当てられる
- e. `送信`をクリック

### ステップ3: データセットをダウンロード

- Amazon SageMaker Studioノートブックとは
    - トレーニングスクリプトの作成とテストが可能なワンクリックの Jupyterノートブック
- SageMaker Studio Experimentsによる追跡と視覚化
    - 機械学習ワークフロー全体を1か所で簡単管理
- 作業内容
    - SageMakerノートブックを作成
    - データセットをダウンロード
    - データセットをAmazon S3にアップロード

- a. `Amazon SageMaker Studioコントロールパネル`で`Studioを開く`を選択
- b. `JupyterLab`の`ファイル`メニューで、`新規`/`ノートブック`を
    - `カーネルを選択`で`Python 3(データサイエンス)`を選択
- c. Amazon SageMaker Python SDKのバージョンを確認
- d. プロジェクトのAmazonS3バケットとフォルダを定義
- e. データセットをダウンロードし、pandasライブラリを使用してインポート
- f. 最後の列の名前を`Label`に変更し、ラベル列を個別に抽出
    - Amazon SageMakerの組み込みXGBoostアルゴリズムの場合、ラベル列はデータフレームの最初の列である必要あり
- g. CSVデータセットをAmazon S3バケットにアップロード

### ステップ4: Amazon SageMaker Processingでデータ処理

- Amazon SageMaker Processingを使用すると
    - フルマネージドのインフラストラクチャで
        - 前処理
        - 後処理
        - モデル評価のワークロード
    - ※ Amazon SageMaker Processingは、ノートブックとは別のコンピューティングインスタンスで実行される
        - 処理ジョブの進行中に、ノートブックでコードの実験と実行を継続できる
        - 処理ジョブの期間中に、稼働インスタンスのコストに対し追加料金発生
            - 処理ジョブが完了すると、インスタンスはSageMakerによって自動終了

- 作業内容
    - データセットの前処理
        - 特徴量(列)のスケーリング
        - トレーニングデータとテストデータへの分割
    - 特徴量生成

- a. scikit-learn processingコンテナをインポート
    - Amazon SageMakerは、scikit-learnのマネージドコンテナを提供
- b. 前処理スクリプトを実行
- c. 前処理コードをAmazonS3バケットにコピー
- d. SageMaker Processingジョブ完了後にトレーニングデータとテストデータの保存場所を指定
- e. Processingジョブを開始
    - sklearn_processor.runを呼び出し、ジョブ開始
    - 処理ジョブに関するオプションのメタデータを抽出
        - トレーニングおよびテストの出力保存場所など
    - ※ 留意
        - プロセッサに提供される出力のコード/トレーニング/テストデータの場所
        - 処理スクリプトに提供されている引数
### ステップ5: Amazon SageMaker Experimentを作成

- Experiment(実験)とは
    - 同じ機械学習プロジェクトに関連した処理ジョブとトレーニングジョブの集合
    - Amazon SageMaker Experimentsは、以下を自動的に管理/追跡
        - トレーニングジョブ
            - `trial`(トライアル)とログに記録される
            - 各トライアルは、エンドツーエンドのトレーニングジョブの反復
        - 前処理ジョブと後処理ジョブ
        - データセットやその他メタデータ
        - 1つの実験に複数トライアルを含めることが可能
    - Amazon SageMaker Studio Experimentsペイン内で複数の反復を経時的に追跡可能

- a. `Build-train-deploy-`という名前の実験を作成
- b. Experiments下の前処理ジョブとトレーニングパイプラインのステップを追跡
- c. 実験の詳細を表示
    - `実験`ペインで、`Build-train-deploy-`実験を右クリック
    - `トライアルコンポーネントリストで開く`を選択
- d. XGBoost分類器をトレーニング
    - Amazon SageMakerによって管理されているXGBoostコンテナをインポート
    - `トライアル`で実行されたトレーニングをログに記録
        - SageMaker Experimentsが`トライアル`名でトレーニングを追跡可能に
        - 前処理ジョブはパイプラインの一部であるため、同じトライアル名となる
    - SageMaker Estimatorオブジェクトを作成
        - インスタンスタイプを自動プロビジョニング
        - 処理ジョブで指定された出力場所からトレーニングデータをコピー
        - モデルをトレーニング
        - モデルアーティファクトを出力
    - トレーニングジョブ完了まで約70秒
- e. 左側ツールバーで、`Experiment`を選択
    - `Build-train-deploy-`を右クリックし、`トライアルコンポーネントリストで開く`を選択
    - Amazon SageMaker Experimentsは、失敗したトレーニング実行を含むすべての実行をキャプチャ
- f. 完了した`トレーニングジョブ`の1つを右クリックし、`トライアルの詳細で開く`を選択
    - トレーニングジョブに関連付けられているメタデータを調べる
    - ※ 最新の結果表示には、ページ更新が必要な場合あり

### ステップ6: オフライン(バッチ)推論用のモデルをデプロイ

- 作業内容
    - 前処理ステップで生成したテストデータを使用し、
    - トレーニングされたモデルからオフライン(バッチ)推論を生成し
        - モデルの未知のテストデータにおけるパフォーマンスを評価

- a. テストデータセットを Amazon S3 の場所からローカルフォルダーにコピー
- b. CSVファイル読み込み
- c. ラベル列を抽出
- d. バッチ変換ジョブを作成
    - トレーニングジョブ同様、基盤となるリソースをプロビジョニング
    - トレーニングされたモデルアーティファクトをコピー
    - Batchエンドポイントをローカルに設定
    - データをコピー
    - データに対し推論を実行
    - 出力をAmazon S3にプッシュ
    - ※ 留意
        - input_filterを設定ことで、テストデータの最初のラベル列を無視するように、バッチ変換に通知
    - バッチ変換ジョブ完了まで約4分
- e. モデルのメトリクスを評価
    - バッチ変換ジョブの出力をAmazon S3バケットからプルする関数を定義
        - 拡張子は`.out`
    - 予測されたラベルをデータフレームに抽出
    - 実際(真)のラベルをデータフレームに追加
    - 出力結果
        - 予測値を実値と比較し、`True`/`False`の総数を表示
- f. ベースラインモデルの精度とモデルの精度の両方を抽出
    - ベースラインモデルとは、極力加工しない状態のデータを使って(または、すぐ実施可能な特徴量加工/生成だけを行って)構築した機械学習モデル
        - `最低限これ以上の精度は出るはず`といったベースラインを与えてくれる
    - 結果から、単純なモデルがすでにベースラインの精度を上回っている
        - 結果を改善には、ハイパーパラメータを調整
        - SageMakerのハイパーパラメータ最適化(HPO)を使用し、モデルを自動調整可能

### ステップ7: モデルをエンドポイントとしてデプロイし、データキャプチャを設定

- 作業内容
    - モデルをRESTful HTTPSエンドポイントとしてデプロイし、リアルタイム推論を提供
    - Amazon SageMakerは、モデルのホスティングとエンドポイントの作成を自動的に処理

- a. モデル作成
- b. データ構成設定を指定し、SageMakerに以下を指示
    - エンドポイントが受信した推論ペイロードを100%キャプチャ
    - 入力と出力の両方をキャプチャ
    - 入力コンテンツタイプをcsvとして記録
- c. エンドポイント設定を作成し、エンドポイントをデプロイ
    - 以下を指定可能
        - インスタンスタイプ
        - すべてのトラフィックをエンドポイントに送信するか
- d. エンドポイントを作成
- e. 左側のツールバーで、`Endpoints`を選択
    - `build-train-deploy`エンドポイントが`作成中`ステータス
    - Amazon SageMakerが、モデルをデプロイするには
        - 最初にモデルアーティファクトと推論イメージをインスタンスにコピー
        - HTTPSエンドポイントを設定し、クライアントアプリケーションまたはRESTful APIと接続可能に
    - エンドポイントが作成されると、ステータスは`稼働中`に変わる
        - エンドポイントの作成には約5〜10分
        - ※ 更新ステータスを取得するには、`更新`をクリックする必要がある場合あり
- f. JupyterLabノートブックで、テストデータセットのサンプルを取得
    - 最初の10行
- g. いくつか推論リクエストをエンドポイントに送信
- h. Model Monitorが受信データを正しくキャプチャしていることを確認
    - current_endpoint_capture_prefixは、Model Monitor出力が格納されているディレクトリパスをキャプチャ
    - Amazon S3バケットに移動し、予測リクエストがキャプチャされている確認
        - 場所は、上記のコードのs3_capture_upload_pathと一致
    - キャプチャされた出力から、以下確認
        - データキャプチャが設定されたか
        - 着信リクエストが保存されたか 
- i. jsonファイルの1つのコンテンツを抽出し、キャプチャされた出力を表示
    - 出力から、データキャプチャがモデルの入力ペイロードと出力両方をキャプチャしているかを確認

### ステップ8: SageMaker Model Monitorでエンドポイントをモニタリング

- 作業内容
    - SageMaker Model Monitorを有効にし
    - デプロイされたエンドポイントのデータドリフトをモニタリング
        - モデルに送信されたペイロードと出力をベースラインと比較し、
        - 入力データまたはラベルにドリフトがあるかどうかを判断

- a. Amazon S3バケットにフォルダを作成し、Model Monitorの出力を保存
    - 2つのフォルダを作成
        - 1つ目のフォルダには、モデルのトレーニングに使用したベースラインデータが格納される
        - 2つ目のフォルダには、そのベースラインとの相違が格納される
- b. Model Monitorのベースラインジョブを設定
    - トレーニングデータの統計をキャプチャ
        - Model Monitorは、Apache Spark上に構築されたdeequライブラリを使用し、データの単体テストを実行 
    - Model Monitorは、個別のインスタンスを設定し
        - トレーニングデータをコピー
        - 統計を生成
- c. ベースラインジョブによって生成された出力を確認
    - constraints.jsonとstatistics.jsonが表示される
        - `/statistics.json`のjson出力をpandasデータフレームに変換
        - deequライブラリが以下統計パラメータを推測
            - 列のデータ型
            - Null値または欠落値の有無
            - 入力データストリームの平均、最小、最大、合計、標準偏差、スケッチパラメータ 
    - constraints.jsonファイルは、トレーニングデータセットが従ういくつかの制約で構成される
        - 値の非負性
        - 特徴フィールドのデータ型
- d. エンドポイントモニタリングの頻度を設定
    - 毎日または毎時を指定可能
        - 1時間ごとの頻度は大量のデータを生成するため、本番アプリケーションでは使用しないこと
        - Model Monitorは、検出したすべての違反で構成されるレポートを作成
    - 出力をCloudWatchに送信するようにModel Monitorに指示
        - Amazon CloudWatchメトリクスを有効にすることで
            - CloudWatchアラームを使用し、アラームをトリガーし、データドリフトの検出を通知可能 

### ステップ9: SageMaker Model Monitorのパフォーマンスをテスト

- 作業内容
    - サンプルデータに照らしてModel Monitorを評価
    - テストペイロードをそのまま送信せず
    - テストペイロード内の特徴量分布を変更し
    - Model Monitorが変更を検出できるかテスト

- a. テストデータをインポートし、変更されたサンプルデータを生成
- b. 特徴量(列)を変更
    - ラベル列を削除し、変更したサンプルテストデータを保存
- c. 変更されたデータセットでエンドポイントを繰り返し呼び出す
- d. Model Monitorジョブのステータスを確認
- e. モニタリング出力が生成されたか10分ごとに確認
    - ※ 最初のジョブは約20分のバッファで実行される可能性あり
- f. Amazon SageMaker Studioの左側のツールバーで、`Endpoints`を選択
    - `build-train-deploy`エンドポイントを右クリック
    - `エンドポイントの説明`を選択
- g. `モニタリングジョブの履歴`を
    - `モニタリングステータス`に`In progress`と表示される
        - ジョブが完了すると、`Issue found`と表示される
‐ h. 問題をダブルクリックし詳細を表示
    - Model Monitorが、以前変更した`EDUCATION`フィールドと `BILL_AMT2`フィールドで大きなベースラインドリフトを検出
        - 他の2つのフィールドのデータ型の違いも検出
            - トレーニングデータは整数ラベルで構成されるが、XGBoostモデルは確率スコアを予測するため不一致を報告 
- i. JupyterLabノートブックで、Model Monitorの出力を確認
- j. Model Monitorによって生成されたレポートを表示
    - statistics.jsonとconstraints.jsonに加え、constraint_violations.jsonが生成

### ステップ10: クリーンアップ

- 作業内容
    - 使用したリソースを終了させる
    - ※ 重要: リソースを終了しないと、料金が発生し続ける

- a. モニタリングスケジュールを削除
    - ※ エンドポイントに関連付けられているすべてのモニタリングジョブが削除されるまで
        - Model Monitorエンドポイントは削除できない
- b. エンドポイントを削除
    - ※ エンドポイントに関連付けられているすべてのモニタリングジョブを最初に削除する必要あり
    - (オプショナル)すべてのトレーニングアーティファクト(モデル、前処理済みのデータセットなど)を削除

## おわりに

Amazon SageMaker Studioを使用し、
機械学習モデルを作成/トレーニング/デプロイ/モニタリングしました。
次回も、Amazon SageMakerの内容が続きます。お楽しみに。

##### [次回] [AWS公式資料で挑むMLS認定(13)-機械学習レンズ(AWS Well-Architectedフレームワーク)](https://qiita.com/mingchun_zhao/items/fb302d067e9961fc5a6c)