Amazon SageMaker Jumpstartを使用して、車両フリートの故障確率を予測します
Using Amazon SageMaker Jumpstart, predict the failure rate of a vehicle fleet.
予測保全は自動車産業において重要です。なぜなら、突然の機械の故障や予期せぬ保全活動は業務を妨害するからです。車両の故障を予測し、保全と修理をスケジュールすることで、停止時間を減らし、安全性を向上させ、生産性を向上させることができます。
もし、車両の故障、計画外の停止時間、修理費用に影響を与える一般的な領域にディープラーニングの技術を適用できたらどうでしょうか?
この記事では、Amazon SageMaker JumpStartを使用して、車両フリートの故障確率を予測するモデルのトレーニングと展開方法を紹介します。SageMaker Jumpstartは、Amazon SageMakerの機械学習(ML)ハブであり、さまざまな問題タイプに対して事前にトレーニングされた、一般に利用可能なモデルを提供して、機械学習を始めるのに役立ちます。この記事で説明されているソリューションは、GitHubで入手できます。
SageMaker JumpStartソリューションテンプレート
SageMaker JumpStartは、多くの一般的なMLユースケースに対してワンクリックでエンドツーエンドのソリューションを提供します。以下のユースケースを探索して、利用可能なソリューションテンプレートに関する詳細情報を確認してください:
- Amazon Pollyを使用してテキストが話されている間にテキストをハイライト表示します
- ツール・ド・フランスは、ChatGPTとデジタルツインテクノロジーを導入しました
- Googleはカナダに「リンク税」を支払わないと伝え、ニュースリンクを検索から削除すると発表しました
- 需要予測
- 信用評価予測
- 不正検知
- コンピュータビジョン
- ドキュメントからのデータの抽出と分析
- 予測保全
- 離反予測
- パーソナライズされた推薦
- 強化学習
- 医療とライフサイエンス
- 金融価格設定
SageMaker JumpStartソリューションテンプレートは、さまざまなユースケースをカバーしており、それぞれのユースケースの下に複数の異なるソリューションテンプレートが提供されています(この記事のソリューションである「車両フリートの予測保全」は「ソリューション」セクションにあります)。SageMaker JumpStartランディングページから、ユースケースに最適なソリューションテンプレートを選択してください。各ユースケースの特定のソリューションについての詳細情報やSageMaker JumpStartソリューションの起動方法については、ソリューションテンプレートをご覧ください。
ソリューションの概要
自動車フリートのAWS予測保全ソリューションは、車両の故障、計画外の停止時間、修理費用に影響を与える一般的な領域にディープラーニングの技術を適用します。このソリューションは、短期間で概念実証に到達するための初期のビルディングブロックとして機能します。このソリューションには、SageMaker内のデータの準備と可視化機能が含まれており、データセットのためのディープラーニングモデルのハイパーパラメータをトレーニングおよび最適化することができます。このソリューションでは、独自のデータを使用するか、このソリューションの一部として合成データセットでソリューションを試すことができます。このバージョンでは、車両のセンサーデータを時間の経過に基づいて処理します。次のバージョンでは、保全記録データを処理します。
次の図は、このソリューションをSageMakerのコンポーネントとともに使用する方法を示しています。このソリューションでは、次のサービスが使用されます:
- Amazon S3 – データセットの保存にAmazon Simple Storage Service(Amazon S3)を使用します
- SageMakerノートブック – データの前処理と可視化、ディープラーニングモデルのトレーニングにノートブックを使用します
- SageMakerエンドポイント – トレーニング済みモデルを展開するためにエンドポイントを使用します
ワークフローには、次のステップが含まれます:
- フリート管理システムから車両データとセンサーログを含む過去のデータの抽出が作成されます。
- MLモデルのトレーニング後、SageMakerモデルアーティファクトが展開されます。
- 接続された車両は、センサーログをAWS IoT Coreに送信します(またはHTTPインターフェース経由で送信されます)。
- センサーログはAmazon Kinesis Data Firehoseを介して永続化されます。
- センサーログは、モデルに対してクエリを行うためにAWS Lambdaによって送信され、予測を行います。
- Lambdaは、予測のためにセンサーログをSagemakerモデル推論に送信します。
- 予測結果は、Amazon Auroraに永続化されます。
- 集計結果は、Amazon QuickSightダッシュボードに表示されます。
- 故障の予測確率に関するリアルタイム通知は、Amazon Simple Notification Service(Amazon SNS)に送信されます。
- Amazon SNSは、通知を接続された車両に送信します。
このソリューションは、以下の6つのノートブックで構成されています:
- 0_demo.ipynb – ソリューションのクイックプレビュー
- 1_introduction.ipynb – イントロダクションとソリューションの概要
- 2_data_preparation.ipynb – サンプルデータセットの準備
- 3_data_visualization.ipynb – サンプルデータセットの可視化
- 4_model_training.ipynb – サンプルデータセットを使用してモデルをトレーニングして故障を検出します
- 5_results_analysis.ipynb – トレーニングしたモデルの結果を分析します
前提条件
Amazon SageMaker Studioは、SageMaker内の統合開発環境(IDE)であり、必要なすべての機械学習機能を一つの画面で提供します。SageMaker JumpStartを実行する前に、SageMaker Studioをセットアップする必要があります。既に独自のバージョンのSageMaker Studioを実行している場合は、このステップをスキップできます。
AWSのサービスを使用する前に、まずAWSアカウントにサインアップし、管理ユーザーとグループを作成する必要があります。両方の手順の詳細については、「Amazon SageMakerの前提条件の設定」を参照してください。
次のステップは、SageMakerドメインを作成することです。ドメインはすべてのストレージをセットアップし、ユーザーを追加してSageMakerにアクセスできるようにします。詳細については、「Amazon SageMakerドメインへのオンボード」を参照してください。このデモはAWSリージョンのus-east-1で作成されています。
最後に、SageMaker Studioを起動します。この投稿では、ユーザープロファイルアプリを起動することをおすすめします。手順については、「Amazon SageMaker Studioの起動」を参照してください。
このSageMaker JumpStartソリューションを実行し、インフラストラクチャをAWSアカウントに展開するには、アクティブなSageMaker Studioインスタンスを作成する必要があります(「Amazon SageMaker Studioへのオンボード」を参照)。インスタンスが準備できたら、SageMaker JumpStartの手順に従ってソリューションを起動します。ソリューションのアーティファクトは、このGitHubリポジトリに含まれています。
SageMaker JumpStartソリューションを起動する
このソリューションを使用するには、次の手順を完了してください:
- SageMaker Studioコンソールで、「JumpStart」を選択します。
- Solutionsタブで、「Predictive Maintenance for Vehicle Fleets」を選択します。
- Launchを選択します。 ソリューションの展開には数分かかります。
- ソリューションが展開されたら、Open Notebookを選択します。
カーネルを選択するように求められた場合は、このソリューションのすべてのノートブックに対して「PyTorch 1.8 Python 3.6」を選択してください。
ソリューションのプレビュー
まず、0_demo.ipynb
ノートブックで作業を開始します。このノートブックでは、このソリューションの完全なノートブックを完成させた場合の結果のプレビューを取得できます。
RunとRun All Cellsを選択して、SageMaker Studioのすべてのセルを実行します(またはSageMakerノートブックインスタンスではCellとRun Allを選択します)。各ノートブックのすべてのセルを順番に実行できます。次のノートブックに進む前に、すべてのセルの処理が完了していることを確認してください。
このソリューションでは、構成ファイルを使用してプロビジョニングされたAWSリソースを実行します。ファイルは次のように生成されます:
import boto3
import os
import json
client = boto3.client('servicecatalog')
cwd = os.getcwd().split('/')
i= cwd.index('S3Downloads')
pp_name = cwd[i + 1]
pp = client.describe_provisioned_product(Name=pp_name)
record_id = pp['ProvisionedProductDetail']['LastSuccessfulProvisioningRecordId']
record = client.describe_record(Id=record_id)
keys = [ x['OutputKey'] for x in record['RecordOutputs'] if 'OutputKey' and 'OutputValue' in x]
values = [ x['OutputValue'] for x in record['RecordOutputs'] if 'OutputKey' and 'OutputValue' in x]
stack_output = dict(zip(keys, values))
with open(f'/root/S3Downloads/{pp_name}/stack_outputs.json', 'w') as f:
json.dump(stack_output, f)
私たちは、時間とともに変動する車両のバッテリー電圧とバッテリー電流のサンプル時系列入力データを持っています。次に、サンプルデータを読み込んで可視化します。次のスクリーンショットに示すように、電圧と電流の値はY軸に、読み取り値(19個の読み取り値が記録されています)はX軸に表示されます。
以前にこの電圧と電流データでモデルをトレーニングし、SageMakerでエンドポイントとして展開しました。このエンドポイントにサンプルデータを呼び出して、次の時間帯の故障確率を判定します。
サンプル入力データを考慮すると、故障の予測確率は45.73%です。
次のステージに進むには、ここをクリックして続けてください。
導入とソリューションの概要
1_introduction.ipynb
ノートブックでは、ソリューションとステージの概要、およびコンテンツの定義、データのサンプリング期間、トレーニングおよびテストのサンプル数、パラメータ、場所、および生成されたコンテンツの列名について説明しています。
このノートブックを確認した後、次のステージに進むことができます。
サンプルデータセットの準備
2_data_preparation.ipynb
ノートブックでサンプルデータセットを準備します。
まず、このソリューションの設定ファイルを生成します:
import boto3
import os
import json
client = boto3.client('servicecatalog')
cwd = os.getcwd().split('/')
i= cwd.index('S3Downloads')
pp_name = cwd[i + 1]
pp = client.describe_provisioned_product(Name=pp_name)
record_id = pp['ProvisionedProductDetail']['LastSuccessfulProvisioningRecordId']
record = client.describe_record(Id=record_id)
keys = [ x['OutputKey'] for x in record['RecordOutputs'] if 'OutputKey' and 'OutputValue' in x]
values = [ x['OutputValue'] for x in record['RecordOutputs'] if 'OutputKey' and 'OutputValue' in x]
stack_output = dict(zip(keys, values))
with open(f'/root/S3Downloads/{pp_name}/stack_outputs.json', 'w') as f:
json.dump(stack_output, f)
import os
from source.config import Config
from source.preprocessing import pivot_data, sample_dataset
from source.dataset import DatasetGenerator
config = Config(filename="config/config.yaml", fetch_sensor_headers=False)
config
設定のプロパティは次のとおりです:
fleet_info_fn=data/example_fleet_info.csv
fleet_sensor_logs_fn=data/example_fleet_sensor_logs.csv
vehicle_id_column=vehicle_id
timestamp_column=timestamp
target_column=target
period_ms=30000
dataset_size=25000
window_length=20
chunksize=10000
processing_chunksize=2500
fleet_dataset_fn=data/processed/fleet_dataset.csv
train_dataset_fn=data/processed/train_dataset.csv
test_dataset_fn=data/processed/test_dataset.csv
period_column=period_ms
独自のデータセットを定義するか、当社のスクリプトを使用してサンプルデータセットを生成できます:
if should_generate_data:
fleet_statistics_fn = "data/generation/fleet_statistics.csv"
generator = DatasetGenerator(fleet_statistics_fn=fleet_statistics_fn,
fleet_info_fn=config.fleet_info_fn,
fleet_sensor_logs_fn=config.fleet_sensor_logs_fn,
period_ms=config.period_ms,
)
generator.generate_dataset()
assert os.path.exists(config.fleet_info_fn), "Please copy your data to {}".format(config.fleet_info_fn)
assert os.path.exists(config.fleet_sensor_logs_fn), "Please copy your data to {}".format(config.fleet_sensor_logs_fn)
センサーデータとフリート車両データをマージすることができます:
pivot_data(config)
sample_dataset(config)
次に、データの可視化に移りましょう。
サンプルデータセットの可視化
サンプルデータセットを 3_data_vizualization.ipynb
で可視化します。このソリューションでは、設定ファイルを使用してプロビジョニングされたAWSリソースを実行します。前のノートブックと同様にファイルを生成しましょう。
以下のスクリーンショットは、データセットを示しています。
次に、データセットを構築しましょう:
train_ds = PMDataset_torch(
config.train_dataset_fn,
sensor_headers=config.sensor_headers,
target_column=config.target_column,
standardize=True)
properties = train_ds.vehicle_properties_headers.copy()
properties.remove('vehicle_id')
properties.remove('timestamp')
properties.remove('period_ms')
データセットが準備できたので、データの統計情報を可視化しましょう。以下のスクリーンショットは、車両のメイク、エンジンタイプ、車両クラス、およびモデルに基づくデータの分布を示しています。
ログデータを比較し、メイクEとC(ランダム)における異なる年ごとの平均電圧の例を見てみましょう。
電圧と電流の平均値がY軸に、読み取り回数がX軸に表示されています。
- log_target の可能な値:[‘make’, ‘model’, ‘year’, ‘vehicle_class’, ‘engine_type’]
- log_target のランダムに割り当てられた値:make
- log_target_value1 の可能な値:[‘Make A’, ‘Make B’, ‘Make E’, ‘Make C’, ‘Make D’]
- log_target_value1 のランダムに割り当てられた値:Make B
- log_target_value2 の可能な値:[‘Make A’, ‘Make B’, ‘Make E’, ‘Make C’, ‘Make D’]
- log_target_value2 のランダムに割り当てられた値:Make D
上記に基づいて、log_target: make、log_target_value1: Make B、log_target_value2: Make D と仮定します。
以下のグラフは、ログデータの平均値を分解しています。
以下のグラフは、異なるセンサーログ値と電圧、電流の例を可視化しています。
サンプルデータセットを使用して障害を検出するモデルのトレーニング
4_model_training.ipynb
ノートブックでは、サンプルデータセットを使用して障害を検出するモデルをトレーニングします。
前のノートブックと同様に、設定ファイルを生成してからトレーニングの設定を進めましょう:
sage_session = sagemaker.session.Session()
s3_bucket = sagemaker_configs["S3Bucket"]
s3_output_path = 's3://{}/'.format(s3_bucket)
print("S3 バケットパス:{}".format(s3_output_path))
# このマシン上の local_mode で実行するか、SageMaker TrainingJob として実行するかを選択
local_mode = False
if local_mode:
instance_type = 'local'
else:
instance_type = sagemaker_configs["SageMakerTrainingInstanceType"]
role = sagemaker.get_execution_role()
print("IAM ロール arn を使用:{}".format(role))
# SageMaker ノートブックインスタンスからのみ実行
if local_mode:
!/bin/bash ./setup.sh
cpu_or_gpu = 'gpu' if instance_type.startswith('ml.p') else 'cpu'
データを定義し、ハイパーパラメータの最適化を開始できます:
%%time
estimator = PyTorch(entry_point="train.py",
source_dir='source',
role=role,
dependencies=["source/dl_utils"],
instance_type=instance_type,
instance_count=1,
output_path=s3_output_path,
framework_version="1.5.0",
py_version='py3',
base_job_name=job_name_prefix,
metric_definitions=metric_definitions,
hyperparameters= {
'epoch': 100, # 必要に応じて調整してください
'target_column': config.target_column,
'sensor_headers': json.dumps(config.sensor_headers),
'train_input_filename': os.path.basename(config.train_dataset_fn),
'test_input_filename': os.path.basename(config.test_dataset_fn),
}
)
if local_mode:
estimator.fit({'train': training_data, 'test': testing_data})
%%time
tuner = HyperparameterTuner(estimator,
objective_metric_name='test_auc',
objective_type='Maximize',
hyperparameter_ranges=hyperparameter_ranges,
metric_definitions=metric_definitions,
max_jobs=max_jobs,
max_parallel_jobs=max_parallel_jobs,
base_tuning_job_name=job_name_prefix)
tuner.fit({'train': training_data, 'test': testing_data})
トレーニングしたモデルの結果を分析する
5_results_analysis.ipynb
ノートブックでは、ハイパーパラメータのチューニングジョブからデータを取得し、すべてのジョブのメトリックを視覚化して最良のジョブを特定し、最良のトレーニングジョブに対してエンドポイントを構築します。
前のノートブックと同様に、構成ファイルを生成し、すべてのジョブのメトリックを視覚化します。次のプロットは、テストの正確性 vs. エポックを視覚化しています。
次のスクリーンショットは、実行したハイパーパラメータのチューニングジョブを示しています。
最良のトレーニングジョブのデータを視覚化できるようになりました(4つのトレーニングジョブの中で最も良いテストの正確性(赤)に基づいて)。
次のスクリーンショットでは、テストの損失が減少し、AUCおよび正確性がエポックとともに増加していることがわかります。
視覚化に基づいて、最良のトレーニングジョブに対してエンドポイントを構築できます:
%%time
role = sagemaker.get_execution_role()
model = PyTorchModel(model_data=model_artifact,
role=role,
entry_point="inference.py",
source_dir="source/dl_utils",
framework_version='1.5.0',
py_version = 'py3',
name=sagemaker_configs["SageMakerModelName"],
code_location="s3://{}/endpoint".format(s3_bucket)
)
endpoint_instance_type = sagemaker_configs["SageMakerInferenceInstanceType"]
predictor = model.deploy(initial_instance_count=1, instance_type=endpoint_instance_type, endpoint_name=sagemaker_configs["SageMakerEndpointName"])
def custom_np_serializer(data):
return json.dumps(data.tolist())
def custom_np_deserializer(np_bytes, content_type='application/x-npy'):
out = np.array(json.loads(np_bytes.read()))
return out
predictor.serializer = custom_np_serializer
predictor.deserializer = custom_np_deserializer
エンドポイントを構築した後、サンプルのセンサーログを渡して予測をテストできます:
import botocore
config = botocore.config.Config(read_timeout=200)
runtime = boto3.client('runtime.sagemaker', config=config)
data = np.ones(shape=(1, 20, 2)).tolist()
payload = json.dumps(data)
response = runtime.invoke_endpoint(EndpointName=sagemaker_configs["SageMakerEndpointName"],
ContentType='application/json',
Body=payload)
out = json.loads(response['Body'].read().decode())[0]
print("サンプル入力データに基づいて、故障の予測確率は{:0.2f}%です".format(100*(1.0-out[0])))
サンプルの入力データに基づいて、故障確率の予測は34.60%です。
クリーンアップ
このソリューションの使用を終了したら、不要なすべてのAWSリソースを削除してください。 車両フリートの予知保守 ページの ソリューションの削除 の下にある すべてのリソースを削除 を選択して、ソリューションに関連するすべてのリソースを削除してください。
このノートブックで作成した余分なリソースを手動で削除する必要があります。 例として、余分なS3バケット(ソリューションのデフォルトバケットに対して)や余分なSageMakerエンドポイント(カスタム名を使用)があります。
ソリューションのカスタマイズ
当社のソリューションは簡単にカスタマイズできます。 入力データの可視化を変更するには、sagemaker/3_data_visualization.ipynb を参照してください。 機械学習をカスタマイズするには、sagemaker/source/train.py および sagemaker/source/dl_utils/network.py を参照してください。 データセットの処理をカスタマイズするには、configファイルの定義方法についてはsagemaker/1_introduction.ipynb を参照してください。
さらに、configファイルで設定を変更することもできます。 デフォルトの設定は次のとおりです:
fleet_info_fn=data/example_fleet_info.csv
fleet_sensor_logs_fn=data/example_fleet_sensor_logs.csv
vehicle_id_column=vehicle_id
timestamp_column=timestamp
target_column=target
period_ms=30000
dataset_size=10000
window_length=20
chunksize=10000
processing_chunksize=1000
fleet_dataset_fn=data/processed/fleet_dataset.csv
train_dataset_fn=data/processed/train_dataset.csv
test_dataset_fn=data/processed/test_dataset.csv
period_column=period_ms
configファイルには、次のパラメータがあります:
fleet_info_fn
、fleet_sensor_logs_fn
、fleet_dataset_fn
、train_dataset_fn
、test_dataset_fn
は、データセットファイルの場所を定義しますvehicle_id_column
、timestamp_column
、target_column
、period_column
は、列のヘッダーを定義しますdataset_size
、chunksize
、processing_chunksize
、period_ms
、window_length
は、データセットのプロパティを定義します
結論
この記事では、SageMaker JumpStartを使用して車両フリートの故障確率を予測するためのモデルのトレーニングと展開方法を紹介しました。 このソリューションは、MLとディープラーニングモデルに基づいており、任意の時間変動センサーデータを含むさまざまな入力データを受け入れます。 各車両には異なるテレメトリがありますので、提供されたモデルを所有するデータの頻度とタイプに合わせて微調整することができます。
SageMaker JumpStartでできることについて詳しくは、次を参照してください:
- Amazon SageMaker JumpStartを使用した視覚検査の自動化
- Amazon SageMaker JumpStartを使用した自動モデルチューニングの実行
- Amazon SageMaker JumpStartを使用したAWSでの生成AIの開始
リソース
- Amazon SageMaker開発者ガイド
- SageMaker JumpStart開発者ガイド
- SageMakerを使用した自動モデルチューニングの実行
- SageMaker JumpStart予知保守ソリューション
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles