【AWSで始める異常検知】Part2. Amazon SageMakerで設備故障の検知

#はじめに
AWS ソリューションライブラリーにて提供されている [機械学習を利用した予知保全](https://aws.amazon.com/jp/solutions/implementations/predictive-maintenance-using-machine-learning/) の実装をやってみます。
用意されているAWS CloudFormation テンプレートを使用するので簡単にデプロイできます。

##Amazon SageMakerとは
Amazon SageMaker は、機械学習モデルを短期間で簡単に構築、トレーニング、デプロイできるようにするフルマネージド型サービスです。
あらゆる作業を効率化する機能が提供されているため、人手をかけずに異常検知をやりたいときに最適なサービスです。

#本記事のゴール
機械学習モデルとターボファンの劣化シミュレーションデータのサンプルデータセットをデプロイして、潜在的な設備故障を認識するようにモデルをトレーニングするというサンプルアーキテクチャを紹介します。

アーキテクチャ図は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/cc979598-33e5-fbdf-e342-fe0b9edc5302.png)

このアーキテクチャでは、サンプルデータセットを使って、
設備故障の評価対象としてRUL（残存耐用期間）を計算し、予測値と観測値を比較して異常検知します。
トレーニングデータとテストデータは、S3バケットに格納します。
これをAWS Lambda などを使って1日に1回スケジュール実行します。

#実装手順

手順は大まかに以下の4つです。

1. スタックを起動する
1. ML モデルをトレーニング
1. CloudWatch Events ルールを有効にする
1. Lambda 関数がデータを処理していることを確認する

## 1. スタックを起動する

[機械学習を利用した予知保全](https://aws.amazon.com/jp/solutions/implementations/predictive-maintenance-using-machine-learning/) から CloudFormationテンプレートをダウンロードします。

テンプレートに含まれているもの：
__Amazon CloudWatch Events ルール__
__AWS Lambda 関数__
__Amazon SageMaker ノートブックインスタンス__
__Amazon S3 バケット__

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/6c9e1815-ba9b-476b-3e99-202b2c3c87d7.png)

[AWS CloudFormation](https://aws.amazon.com/jp/cloudformation/)に移動 → 「スタックの作成」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/87e93141-93fa-298a-c74d-183f2f73c7fe.png)

ダウンロードしたテンプレートをアップロード → 「次へ」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/42a07a84-340c-3ebc-bcc9-27542c499fe2.png)

スタックの名前を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/7462b237-a802-6ea8-d24c-23b5902f7d9a.png)

S3バケットの名前を入力 → SageMaker ノートブックインスタンスをデプロイす
る VPC Id、Subnet Id を選択 → 「次へ」で次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/847be90e-2f9e-60d7-c2f0-f02ac2c64fa1.png)

オプションの設定はスキップします。
「次へ」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/ed6aba27-ae7f-e0e4-6f3f-c1141555f7d3.png)

設定を見直します。
テンプレートが AWS IAM リソースを作成することを確認するチェックボックスをオンにして → 「スタックの作成」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/5367623f-af60-0f31-ca14-95be74fb4d5a.png)

CREATE_COMPLETE のステータスが表示されたら、デプロイが完了したということです。
5分ほどかかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/2858d6f0-45ba-076f-06fc-256cb2625294.png)


## 2. Amazon SageMaker でノートブックを実行する

Amazon SageMaker では、任意の深層学習フレームワークを使用してカスタム深層学習モデルをトレーニングできます。
このソリューションでは、カスタムの Stack LSTM ニューラルネットワークを活用して、時系列データから履歴パターンを学習します。


[Amazon SageMaker コンソール](https://console.aws.amazon.com/sagemaker/)に移動 → 「SageMaker Studio」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/5c43ae10-6584-eb8e-4f67-b1c50179b6c1.png)

「ノートブックインスタンス」 → 「PredictiveMaintenceNotebookInstance」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/4602d284-0c30-c0ba-8935-9d7eadb6724c.png)

「Jupyterを開く」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/94ce28f7-e65b-a83b-54f5-e1551274b0cd.png)

sagamaker_predictive_maintenance.ipynb のノートブックを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/20f1b4fd-18e6-1119-5c42-0e3c0cad5ce8.png)

全てのセルを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/41530831-6473-3a36-d77b-b16e025ea6cd.png)


## 3. CloudWatch Events ルールを有効にする

1日に1回実行するように設定されてます
Amazon SageMaker バッチ変換ジョブを作成する AWS Lambda 関数をトリガーするように設定されており、AWS SageMaker バッチ変換ジョブはトレーニング済みモデルを使用してデータのサンプルから残存耐用年数を予測します。

[AWS Lambda コンソール](https://console.aws.amazon.com/lambda/)に移動 → 「関数」 → 「predivtive-maintenance-batch-transformer」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/b3c5d34d-56dc-39a0-70d9-ff02722aa874.png)

「EventBridge(CloudWatch Events)」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/c7bd38f7-ff80-64b0-7475-eb7495924e10.png)

predictive-maintenance-ScheduledRule-<id>を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/c38d1633-18b1-a8fc-3df5-68aa75dfe12b.png)

「有効にする」を選択し、を有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/6aef3b8d-8fae-4e9a-3a94-f787213bd039.png)

「有効にする」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/b3af7d44-e248-ef24-ba92-761ccb7fce46.png)

## 4. Lambda 関数がデータを処理していることを確認する

[モニタリング] を選択し、[Invocations] グラフにアクティビティが表示されているこを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/58dc1f25-3d26-959f-4771-7138236c2485.png)

テスト結果はS3バケットに格納されます。
画像のように、RUL（残存耐用年数）の列が追加されていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/5c407644-8d00-4cc9-6422-8efdb32d7c6f.png)


#さいごに

今回は、Amazon SageMakerを使って異常検知のアーキテクチャ実装を試してみました。
AWS CloudFormation テンプレートを使用することで、モデルのトレーニングからノートブックのスケジュール実行の設定まで数分で出来ました。
今回はサンプルデータを使用していますが、任意のデータセットを使用するようにソリューションを変更できることもできるようなので、次回はトライしてみたいです。

#参考

https://aws.amazon.com/jp/solutions/implementations/predictive-maintenance-using-machine-learning/