誰でも出来る「機械学習ワークフローを自動化する」 チュートリアルをもとに機械学習 (CI/CD)を理解する

機械学習って、何？SageMakerで何が出来るの？ChatGPTと何が違うの？
--
機械学習は、コンピューターシステムがデータから __パターンや知識を学習__  し、それを使って __タスクを実行するための技術__ です。具体的には、大量のデータを用いて __アルゴリズムを学習させ、未知のデータに対する予測や判断を行います。__ SageMakerは、Amazon Web Services（AWS）が提供する機械学習のためのマネージドサービスで、機械学習モデルの構築、トレーニング、デプロイメントを行うことができます。 __SageMakerは、データの準備からモデルのトレーニング、評価、デプロイメントまでのワークフローを効率化__ し、スケーラビリティやリソースの管理をサポートします。

一方、ChatGPTは、OpenAIが開発した自然言語処理技術です。ChatGPTは大規模なデータセットを用いてトレーニングされ、テキスト生成、質問応答、文章要約などの自然言語タスクを行うことができます。ChatGPTは、対話形式での自然言語生成に特に適しており、質問応答、文章生成、対話型アプリケーションの構築などの用途で利用されます。__ChatGPTは機械学習モデルの一種ですが、特定のタスクに特化したものではありません。__

:::note info
__チュートリアルのソースコードをそのまま使えます。__
細かい、ソースコードの内容は、こちらをご確認下さい。
https://aws.amazon.com/jp/getting-started/hands-on/machine-learning-tutorial-mlops-automate-ml-workflows/
※現在、こちらは、lambda関数で使用するRun Timeが現在は利用できないバージョンになっています。Cloudformationのリソースの作成に失敗します。しかしながら、一部修正を行うことで実行が可能です。修正方法は、最後にご説明致します。
:::

__SageMaker Pipelines は、__
機械学習のために作られた継続的インテグレーションおよび継続的デリバリー (CI/CD) サービスです。

機械学習パイプラインは、機械学習モデルの構築、トレーニング、評価、デプロイメントなどの一連のプロセスを組み合わせた __フレームワーク__ です。これは、データの収集からモデルの運用までの全体的な流れを体系的に組織し、自動化することを目的としています。

:::note info
一般的な機械学習パイプラインの主要なステップ

__1.データ収集と前処理__
適切なデータセットを収集し、欠損値や異常値の処理、特徴量エンジニアリングなどの前処理を行います。

__2.データ分割__
データセットをトレーニングデータとテストデータに分割します。これにより、モデルのトレーニングと評価を独立して行うことができます。

__3.特徴量エンジニアリング__
データセットから適切な特徴を選択し、変換することでモデルの性能を向上させます。

__4.モデルの選択__
解決すべき課題に応じて、適切な機械学習アルゴリズムやモデルを選択します。

__5.モデルのトレーニング__
トレーニングデータを使用してモデルをトレーニングします。ハイパーパラメータの調整もこの段階で行います。

__6.モデルの評価__
テストデータを使用してモデルの性能を評価します。精度、再現率、適合率などの評価指標を考慮します。

__7.モデルのデプロイメント__
トレーニングされたモデルを本番環境にデプロイし、実際のデータに対する予測を行えるようにします。

__8.モデルのモニタリングとメンテナンス__
デプロイ後もモデルの性能をモニタリングし、必要に応じて再トレーニングや更新を行います。

これらのステップは、機械学習プロジェクトを効果的に進めるために重要です。機械学習パイプラインの自動化は、実験の再現性、生産性の向上、モデルの効果的な管理を可能にし、効率的かつ信頼性の高い機械学習モデルの開発を支援します。
:::

今回は、このパイプラインの使い方を説明します。

__SageMaker Pipelines を使用すると、__
データロード、データ変換、トレーニング、チューニング、評価、デプロイなど、機械学習ワークフローのさまざまなステップを自動化することができます。

__SageMaker Model Registry を使用すると、__
モデルのバージョン、ユースケースのグループ化などのメタデータ、モデルのパフォーマンスメトリクスベースラインを中央リポジトリで追跡でき、ビジネス要件に基づいてデプロイに適したモデルを容易に選択することができます。

__SageMaker Clarify は、__
トレーニングデータとモデルの可視性を高めることで、バイアスの特定と制限、予測の説明を可能にします。

ステップ 1: Amazon SageMaker Studio ドメインを設定する
--
ドメインの設定方法は、下記にまとめました。
https://qiita.com/kimuni-i/items/d822973ac825cdfbaa6c
※実行ロールの修正箇所は、最後の項目で整理しているので、ご確認下さい。

ステップ 2: SageMaker Studio ノートブックを設定し、パイプラインをパラメータ化する
--
:::note info
__1.必要なライブラリをインポート__
__2.生データセットと処理済みデータセットおよびモデルアーティファクトが保存される S3 バケットロケーションを設定__
__3.パイプラインコンポーネントの名前を設定し、トレーニングと推論のインスタンスタイプと数を指定__
__4.パイプラインパラメータを指定__
:::

ステップ 3: パイプラインコンポーネントの構築
--
データ処理、トレーニング、評価、条件、モデル作成、バイアスチェック、説明可能性、登録、デプロイの各ステップを組み合わせたSageMakerパイプラインがあり、S3からのデータ取得やモデル評価などのタスクを実施し、最終的にSageMaker Model Registryにモデルを登録し、AWS Lambdaを用いてSageMaker Real-Time Inferenceエンドポイントにデプロイします。
![パイプライン.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/b1451dd4-96fc-a3fe-8628-8e8be9eff479.png)

:::note info
__1.データ処理ステップ: S3 にある入力生データを使用して SageMaker Processing ジョブを実行し、S3 にトレーニング、検証、およびテストの分割を出力します。__

__2.トレーニングステップ: S3 内のトレーニングデータと検証データを入力として、SageMaker のトレーニングジョブを使用して XGBoost モデルをトレーニングし、トレーニング済みのモデルアーティファクトを S3 に保存します。__

__3.評価ステップ: テストデータと S3 内のモデルアーティファクトを入力として SageMaker Processing ジョブを実行してテストデータセット上でモデルを評価し、出力されたモデルパフォーマンス評価レポートを S3 に保存します。__

__4.条件ステップ: テストデータセットでのモデルパフォーマンスを閾値と比較します。S3 内のモデルパフォーマンス評価レポートを入力として使用し、SageMaker Pipelines の定義済みステップを実行し、モデルパフォーマンスが許容できる場合に実行されるパイプラインステップの出力リストを保存します。__

__5.モデルステップを作成する: S3 にあるモデルアーティファクトを入力として使用し、SageMaker Pipelines の定義済みステップを実行し、出力された SageMaker モデルを S3 に保存します。__

__6.バイアスチェックのステップ: S3 にあるトレーニングデータとモデルアーティファクトを入力として SageMaker Clarify を使用してモデルのバイアスをチェックし、モデルのバイアスレポートとベースラインメトリクスを S3 に保存します。__

__7.モデル説明可能性ステップ: S3 内のトレーニングデータとモデルアーティファクトを入力として SageMaker Clarify を実行し、モデル説明可能性レポートとベースラインメトリクスを S3 に保存します。__

__8.登録ステップ: モデル、バイアス、説明可能性のベースラインメトリクスを入力として使用し、SageMaker Pipelines の定義済みステップを実行し、SageMaker Model Registry にモデルを登録します。__

__9.デプロイステップ: AWS Lambda ハンドラー関数、モデル、エンドポイント設定を入力として使用し、SageMaker Pipelines の定義済みステップを実行し、モデルを SageMaker Real-Time Inference のエンドポイントにデプロイします。__
:::

ステップ 4: パイプラインの構築と実行
--
機械学習パイプラインは、機械学習モデルの構築、トレーニング、評価、デプロイメントなどの一連のプロセスを組み合わせたフレームワークです。これは、データの収集からモデルの運用までの全体的な流れを体系的に組織し、自動化することを目的としています。

:::note info
__1.パイプラインを設定__
__2.パイプライン作成__
__3.パイプラインメニューを表示__
__4.作成したパイプラインステップを表示__
__5.パイプラインを実行__
__6.パイプラインの実行を表示__
__7.すべてのステップが正常に実行される__
__8.モデルの登録確認__
__9.モデル説明可能性レポートの確認__
:::

__1.パイプラインを設定__
![パイプラインを設定.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/eb29f5b2-4dae-13cd-5689-05d2e1c9144a.png)

__2.パイプライン作成__
![パイプライン作成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/c04435ed-ceb1-618d-31f8-af57e7b75a7c.png)

__3.パイプラインメニューを表示__
![パイプラインメニューを表示.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/f4163ebf-1169-e52d-4f31-8821bc7474da.png)

__4.作成したパイプラインステップを表示__
![作成したパイプラインステップを表示.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/c3d63c9d-6ec4-b0ee-7f85-bd0e182319db.png)

__5.パイプラインを実行__
![パイプラインを実行.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/434dcff3-bb7b-941a-3635-cb08d215858a.png)

__6.パイプラインの実行を表示__
![パイプラインの実行を表示.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/d4d90c79-9a09-c7ac-fe0b-22503b090a03.png)

__7.すべてのステップが正常に実行される__
![パイプラインの実行を表示の確認 実行完了が緑色となる.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/51ed1e0e-5ecf-d442-566c-027f0b23aeb7.png)

![すべてのステップが正常に実行される.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/02d56c0b-ac9d-abbd-da3b-72f721ffca93.png)

__8.モデルの登録確認__
![モデルの登録確認.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/cec573a1-ab19-8941-7cb5-e2b4f43def7c.png)

__9.モデル説明可能性レポートの確認__
![モデル説明可能性レポートの確認.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/c54ec372-55e2-1d8d-4971-ea867edd1cff.png)

レポートをダウンロードする事も出来る1/2
![レポートをダウンロードする事も出来る1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/b14730f2-e215-002c-9925-c464445f2867.png)

レポートをダウンロードする事も出来る2/2
![レポートをダウンロードする事も出来る2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/24073ff5-bb7b-4605-c901-9ab66fc21c19.png)

ステップ 5: エンドポイントを呼び出してパイプラインをテストする
--
:::note info
__1.エンドポイントのステータスを確認する__
__2.推論を実行し、モデル予測値を確認する__
:::

__1.エンドポイントのステータスを確認する__
![fraud-detect-xgb-pipeline-endpoint のステータスを確認する.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/d818361b-726a-5160-c6e0-769c41c4633a.png)

__2.推論を実行し、モデル予測値を確認する__
![推論を実行し、モデル予測値を確認する.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/5e779ca9-5543-af09-e584-4239f9f4c82e.png)

 ・・・という流れをなぞれば、「機械学習ワークフローを自動化する」 チュートリアルをもとに機械学習 (CI/CD)を誰でも出来ますので、試してみて下さい。
 --

__一部修正のポイント__
※実行ロール作成後、下記の修正が必要です。
__信頼関係の修正__
~~~
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "sagemaker.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
~~~
__ポリシーの修正__
~~~
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"s3:GetObject",
				"s3:PutObject",
				"s3:DeleteObject",
				"s3:ListBucket",
				"iam:PassRole",
				"lambda:CreateFunction"
			],
			"Resource": [
				"arn:aws:s3:::*",
				"arn:aws:iam::アカウント ID:role/*",
				"arn:aws:lambda:us-east-1:アカウント ID:*"
			]
		}
	]
}
~~~
__リソースを削除する場合は、こちらの修正も必要__
~~~
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"lambda:DeleteFunction"
			],
			"Resource": "arn:aws:lambda:us-east-1:アカウント ID:*"
		}
	]
}
~~~

以上、読んでいただいてありがとうございました。