リアルタイム推論エンドポイントへの機械学習モデルのデプロイ

チュートリアル

概要

このチュートリアルでは、Amazon SageMaker Studio を使用して、トレーニング済みの機械学習 (ML) モデルをリアルタイム推論エンドポイントにデプロイする方法について学習します。

SageMaker Studio は、機械学習のための統合開発環境 (IDE) であり、フルマネージドな Jupyter Notebook インターフェイスを提供し、モデルのデプロイを含む、エンドツーエンドの機械学習ライフサイクルタスクを実行することができます。

SageMaker は、幅広いユースケースをサポートするために、さまざまな推論オプションを提供しています:

このチュートリアルでは、リアルタイム推論オプションを使用して、合成自動車保険請求データセットで既にトレーニングされている二項分類 XGBoost モデルをデプロイします。このデータセットは、請求顧客の表からの詳細と抽出された特微量、及び請求が不正かそうでないかを示す不正列で構成されています。このモデルは、クレームが不正である確率を予測します。お客様は、機械学習エンジニアのロールを担い、このモデルをデプロイし、サンプル推論を実行します。

実行する内容

このガイドでは、以下のことを行います。

  • トレーニング済みモデルアーティファクトから SageMaker モデルを作成する
  • モデルを提供するためのリアルタイム推論エンドポイントを設定し、デプロイする
  • エンドポイントを呼び出して、テストデータを使用してサンプル予測を実行する
  • トラフィックの変化に対応するため、エンドポイントにオートスケーリングポリシーを追加する

前提条件

本ガイドを開始する前に、以下のものが必要です。

  • AWS アカウント: まだお持ちでない場合は、環境の設定入門ガイドに従って簡単な概要を確認してください。

 AWS の使用経験

初心者

 所要時間

25 分

 完了までのコスト

このチュートリアルにかかるコストの見積もりは、SageMaker の料金を参照してください。

 次のことが求められます

AWS アカウントにログインしている必要があります。

 使用するサービス

Amazon SageMaker リアルタイム推論、Amazon SageMaker Studio

 最終更新日

2022 年 5 月 19 日

実装

ステップ 1: Amazon SageMaker Studio ドメインを設定する

Amazon SageMaker では、コンソールを使用して視覚的にモデルをデプロイするか、SageMaker Studio または SageMaker ノートブックのいずれかを使用してプログラムでモデルをデプロイすることができます。このチュートリアルでは、SageMaker Studio ノートブックを使用してプログラムでモデルをデプロイしますが、これには SageMaker Studio ドメインが必要です。

AWS アカウントは、1 つのリージョンにつき 1 つの SageMaker Studio ドメインのみを持つことができます。米国東部 (バージニア北部) リージョンに SageMaker Studio ドメインを既にお持ちの場合は、SageMaker Studio 設定ガイドに従って必要な AWS IAM ポリシーを SageMaker Studio アカウントにアタッチし、ステップ 1 をスキップして直接ステップ 2 に進みます。 

既存の SageMaker Studio ドメインがない場合は、ステップ 1 に進み、SageMaker Studio ドメインを作成し、このチュートリアルの残りの部分に必要なアクセス許可を追加する AWS CloudFormation テンプレートを実行します。

AWS CloudFormation スタックリンクを選択します。このリンクから AWS CloudFormation コンソールが開き、SageMaker Studio ドメインと studio-user というユーザーが作成されます。また、SageMaker Studio アカウントに必要なアクセス許可を追加します。CloudFormation コンソールで、右上に表示される [リージョン] が [米国東部 (バージニア北部)] であることを確認します。 [スタック名] は [CFN-SM-IM-Lambda-Catalog] とし、変更しないようにします。 このスタックは、すべてのリソースを作成するのに 10 分ほどかかります。

このスタックは、アカウントに既にパブリック VPC が設定されていることを想定しています。パブリック VPC がない場合、パブリック VPC の作成方法については、単一のパブリックサブネットを持つ VPC を参照してください。 

[I acknowledge that AWS CloudFormation might create IAM resources] (私は、AWS CloudFormation が IAM リソースを作成する可能性があることを認めます) を選択し、[Create stack] (スタックの作成) を選択します。

[CloudFormation] ペインで、[スタック] を選択します。スタックが作成されるまで 10 分程度かかります。スタックが作成されると、スタックのステータスが [CREATE_IN_PROGRESS] から [CREATE_COMPLETE] に変更されます。 

ステップ 2: SageMaker Studio ノートブックを設定する

このステップでは、新しい SageMaker Studio ノートブックを起動し、必要なオープンソースライブラリをインストールし、Amazon Simple Storage Service (Amazon S3) からトレーニング済みモデルアーティファクトを取得するのに必要な SageMaker 変数を設定します。しかし、モデルアーティファクトは推論用に直接デプロイすることができないため、まずモデルアーティファクトから SageMaker モデルを作成する必要があります。作成されたモデルには、SageMaker がモデルのデプロイに使用するトレーニングと推論のコードが含まれます。

コンソールの検索バーに [SageMaker Studio] と入力し、[SageMaker Studio] を選択します。

SageMaker コンソール右上にあるリージョンのドロップダウンリストから、[米国東部 (バージニア北部)] を選択します。[Launch app] (アプリケーションの起動) で [Studio] を選択し、studio-user プロファイルを使用して SageMaker Studio を開きます。

SageMaker Studio インターフェイスを開きます。ナビゲーションバーで、[ファイル]、[新規作成]、[ノートブック] を選択します。 

[Set up notebook environment] (ノートブック環境の設定) ダイアログボックスで、[画像] の下にある [データサイエンス] を選択します。[Python 3] カーネルが自動的に選択されます。[選択] を選択します。

ノートブックの右上のカーネルに [Python 3 (Data Science)] (Python 3 (データサイエンス)) と表示されているはずです。

以下のコードスニペットをコピーしてノートブックのセルに貼り付け、シフトとエンターキーを押して現在のセルを実行し、AWS の多くのサービスとやりとりするための API である aiobotocore ライブラリを更新します。カーネルを再起動するようにという警告や、依存関係の衝突のエラーは無視してください。

%pip install --upgrade -q aiobotocore

また、S3 クライアントオブジェクトと、メトリクスやモデルアーティファクトがアップロードされるデフォルトの S3 バケット内の場所をインスタンス化する必要があります。これを行うには、以下のコードをコピーしてノートブックのセルに貼り付け、実行します。 以下のコードの 16 行目で、SageMaker セッション オブジェクトによって書き込みバケット sagemaker-<your-Region>-<your-account-id> が自動的に作成されていることに注意してください。トレーニングに使用するデータセットは、sagemaker-sample-files という名前のパブリック S3 バケットに存在し、これは 29 行目で読み込みバケットとして指定されています。バケット内の位置は、read prefix で指定します。

import pandas as pd
import numpy as np
import boto3
import sagemaker
import time
import json
import io
from io import StringIO
import base64
import pprint
import re

from sagemaker.image_uris import retrieve

sess = sagemaker.Session()
write_bucket = sess.default_bucket()
write_prefix = "fraud-detect-demo"

region = sess.boto_region_name
s3_client = boto3.client("s3", region_name=region)
sm_client = boto3.client("sagemaker", region_name=region)
sm_runtime_client = boto3.client("sagemaker-runtime")
sm_autoscaling_client = boto3.client("application-autoscaling")

sagemaker_role = sagemaker.get_execution_role()


# S3 locations used for parameterizing the notebook run
read_bucket = "sagemaker-sample-files"
read_prefix = "datasets/tabular/synthetic_automobile_claims" 
model_prefix = "models/xgb-fraud"

data_capture_key = f"{write_prefix}/data-capture"

# S3 location of trained model artifact
model_uri = f"s3://{read_bucket}/{model_prefix}/fraud-det-xgb-model.tar.gz"

# S3 path where data captured at endpoint will be stored
data_capture_uri = f"s3://{write_bucket}/{data_capture_key}"

# S3 location of test data
test_data_uri = f"s3://{read_bucket}/{read_prefix}/test.csv"

ステップ 3: リアルタイム推論エンドポイントの作成

SageMaker では、トレーニング済みのモデルをリアルタイム推論エンドポイントにデプロイする方法が複数用意されています。SageMaker SDKAWS SDK - Boto3、SageMaker コンソールです。詳細については、Amazon SageMaker Developer Guide の推論のためのモデルのデプロイを参照してください。SageMaker SDK は AWS SDK - Boto3 と比較してより抽象化されており、後者はより低レベルの API を公開してモデルのデプロイをより詳細に制御することができます。このチュートリアルでは、AWS SDK - Boto3 を使用してモデルをデプロイします。モデルをデプロイするためには、3 つのステップに従う必要があります。

  1. モデルアーティファクトから SageMaker モデルを作成する
  2. インスタンスタイプやインスタンス数などのプロパティを指定するためのエンドポイント設定を作成する
  3. エンドポイント設定を使用してエンドポイントを作成する

S3 に保存されているトレーニング済みモデルアーティファクトを使用して SageMaker モデルを作成するには、次のコードをコピーして貼り付けます。create_model メソッドは、トレーニングイメージを含む Docker コンテナ (このモデルでは XGBoost コンテナ) と、モデルアーティファクトの S3 の場所をパラメータとして受け取ります。 

# Retrieve the SageMaker managed XGBoost image
training_image = retrieve(framework="xgboost", region=region, version="1.3-1")

# Specify a unique model name that does not exist
model_name = "fraud-detect-xgb"
primary_container = {
                     "Image": training_image,
                     "ModelDataUrl": model_uri
                    }

model_matches = sm_client.list_models(NameContains=model_name)["Models"]
if not model_matches:
    model = sm_client.create_model(ModelName=model_name,
                                   PrimaryContainer=primary_container,
                                   ExecutionRoleArn=sagemaker_role)
else:
    print(f"Model with name {model_name} already exists! Change model name to create new")

作成されたモデルは、SageMaker コンソールの [モデル] セクションで確認することができます。

SageMaker のモデルが作成されたら、以下のコードをコピーして貼り付け、Boto3 create_endpoint_config メソッドを使い、エンドポイントを設定します。create_endpoint_config メソッドへの主な入力は、エンドポイント設定名と推論インスタンスタイプや推論インスタンス数などのバリアント情報、デプロイされるモデル名、エンドポイントが処理すべきトラフィックシェアです。これらの設定と並行して、[DataCaptureConfig] を指定することでデータキャプチャを設定することができます。この機能により、リアルタイムエンドポイントがリクエストおよび/またはレスポンスをキャプチャして Amazon S3 に保存するよう設定することができます。データキャプチャは、モデルモニタリングの設定ステップの 1 つで、ベースラインメトリクスやモニタリングジョブと組み合わせると、テストデータのメトリクスとベースラインを比較することで、モデルのパフォーマンスをモニタリングするのに役立ちます。このようなモニタリングは、モデルまたはデータのドリフトに基づくモデルの再トレーニングのスケジュール設定や、監査目的に役立ちます。現在の設定では、入力 (受信テストデータ) と出力 (モデル予測) の両方がキャプチャされ、デフォルトの S3 バケットに保存されます。

# Endpoint Config name
endpoint_config_name = f"{model_name}-endpoint-config"

# Endpoint config parameters
production_variant_dict = {
                           "VariantName": "Alltraffic",
                           "ModelName": model_name,
                           "InitialInstanceCount": 1,
                           "InstanceType": "ml.m5.xlarge",
                           "InitialVariantWeight": 1
                          }

# Data capture config parameters
data_capture_config_dict = {
                            "EnableCapture": True,
                            "InitialSamplingPercentage": 100,
                            "DestinationS3Uri": data_capture_uri,
                            "CaptureOptions": [{"CaptureMode" : "Input"}, {"CaptureMode" : "Output"}]
                           }


# Create endpoint config if one with the same name does not exist
endpoint_config_matches = sm_client.list_endpoint_configs(NameContains=endpoint_config_name)["EndpointConfigs"]
if not endpoint_config_matches:
    endpoint_config_response = sm_client.create_endpoint_config(
                                                                EndpointConfigName=endpoint_config_name,
                                                                ProductionVariants=[production_variant_dict],
                                                                DataCaptureConfig=data_capture_config_dict
                                                               )
else:
    print(f"Endpoint config with name {endpoint_config_name} already exists! Change endpoint config name to create new")

作成されたエンドポイント設定は、SageMaker コンソールの [エンドポイント設定] セクションで確認することができます。

 

 

次のコードをコピーして貼り付け、エンドポイントを作成します。create_endpoint メソッドは、エンドポイント設定をパラメータとして受け取り、エンドポイント設定で指定されたモデルをコンピューティングインスタンスにデプロイします。モデルのデプロイにかかる時間は約 6 分です。

endpoint_name = f"{model_name}-endpoint"

endpoint_matches = sm_client.list_endpoints(NameContains=endpoint_name)["Endpoints"]
if not endpoint_matches:
    endpoint_response = sm_client.create_endpoint(
                                                  EndpointName=endpoint_name,
                                                  EndpointConfigName=endpoint_config_name
                                                 )
else:
    print(f"Endpoint with name {endpoint_name} already exists! Change endpoint name to create new")

resp = sm_client.describe_endpoint(EndpointName=endpoint_name)
status = resp["EndpointStatus"]
while status == "Creating":
    print(f"Endpoint Status: {status}...")
    time.sleep(60)
    resp = sm_client.describe_endpoint(EndpointName=endpoint_name)
    status = resp["EndpointStatus"]
print(f"Endpoint Status: {status}")

エンドポイントのステータスを確認するには、[SageMaker リソース] アイコンを選択します。[SageMaker リソース] の [エンドポイント] を選択し、[名前] で [fraud-detect-xgb-endpoint] を選択します。

 

ステップ 4: 推論エンドポイントを呼び出す

エンドポイントのステータスが [InService] (稼働中) に変わったら、REST API、AWS SDK - Boto3、SageMaker Studio、AWS CLI、または SageMaker Python SDK を使用してエンドポイントを呼び出すことができます。このチュートリアルでは、AWS SDK - Boto3 を使用します。エンドポイントを呼び出す前に、シリアライゼーションとデシリアライゼーションを使用して、テストデータをエンドポイントに適した形式にすることが重要です。シリアライゼーションは、.csv のような形式の生データを、エンドポイントが使用できるバイトストリームに変換するプロセスです。デシリアライゼーションは、バイトストリームを人間が読める形式に変換する逆の処理です。このチュートリアルでは、テストデータセットから最初の 5 つのサンプルを送信することで、エンドポイントを呼び出します。エンドポイントを呼び出して予測結果を得るには、以下のコードをコピーして貼り付けてください。エンドポイントへのリクエスト (テストデータセット) は .csv 形式であるため、csv シリアライズ処理によりペイロードが作成されます。その後、レスポンスが予測の配列にデシリアライズされます。実行が完了すると、セルはテストサンプルのモデル予測と true ラベルを返します。XGBoost モデルが実際のクラスラベルの代わりに確率を返していることに注意してください。このモデルは、テストサンプルが不正請求である可能性が非常に低いことを予測しており、その予測は true ラベルと一致しています。

 

# Fetch test data to run predictions with the endpoint
test_df = pd.read_csv(test_data_uri)

# For content type text/csv, payload should be a string with commas separating the values for each feature
# This is the inference request serialization step
# CSV serialization
csv_file = io.StringIO()
test_sample = test_df.drop(["fraud"], axis=1).iloc[:5]
test_sample.to_csv(csv_file, sep=",", header=False, index=False)
payload = csv_file.getvalue()
response = sm_runtime_client.invoke_endpoint(
                                             EndpointName=endpoint_name,
                                             Body=payload,
                                             ContentType="text/csv",
                                             Accept="text/csv"
                                            )

# This is the inference response deserialization step
# This is a bytes object
result = response["Body"].read()
# Decoding bytes to a string
result = result.decode("utf-8")
# Converting to list of predictions
result = re.split(",|\n",result)

prediction_df = pd.DataFrame()
prediction_df["Prediction"] = result[:5]
prediction_df["Label"] = test_df["fraud"].iloc[:5].values
prediction_df

Amazon CloudWatch を使用してエンドポイント呼び出しメトリクスをモニタリングするには、SageMaker コンソールを開きます。[推論] の下で、[エンドポイント]、[fraud-detect-xgb-endpoint] を選択します。

 

[エンドポイントの詳細] ページで、[モニタリング] の下にある [View invocation metrics] (呼び出しメトリクスの表示) を選択します。最初は、メトリクスチャートに 1 つの点だけが表示されるかもしれません。しかし、複数回呼び出すと、サンプルのスクリーンショットのような線が表示されます。

[メトリクス] ページには、複数のエンドポイントパフォーマンスメトリクスが表示されます。エンドポイントのパフォーマンスを可視化するために、1 時間や 3 時間など、異なる期間を選択することができます。任意のメトリクスを選択し、選択した期間での傾向を確認します。次のステップでは、これらのメトリクスのうち 1 つを選択して、オートスケーリングポリシーを定義します。

 

 

エンドポイント設定でデータキャプチャが設定されているため、どのペイロードがエンドポイントに送信されたかを、そのレスポンスと一緒に検査する方法が用意されています。キャプチャされたデータは、S3 に完全にアップロードされるまでに時間がかかります。以下のコードをコピーして貼り付け、データキャプチャが完了したかどうかを確認します。

from sagemaker.s3 import S3Downloader
print("Waiting for captures to show up", end="")
for _ in range(90):
    capture_files = sorted(S3Downloader.list(f"{data_capture_uri}/{endpoint_name}"))
    if capture_files:
        capture_file = S3Downloader.read_file(capture_files[-1]).split("\n")
        capture_record = json.loads(capture_file[0])
        if "inferenceId" in capture_record["eventMetadata"]:
            break
    print(".", end="", flush=True)
    time.sleep(1)
print()
print(f"Found {len(capture_files)} Data Capture Files:")

キャプチャされたデータは、エンドポイント呼び出しごとに別のファイルとして S3 に JSON 行 (各行が JSON 値である構造化データを保存するための改行区切り形式) で保存されます。以下のコードをコピーして貼り付け、データキャプチャファイルを取得します。 

capture_files = sorted(S3Downloader.list(f"{data_capture_uri}/{endpoint_name}"))
capture_file = S3Downloader.read_file(capture_files[0]).split("\n")
capture_record = json.loads(capture_file[0])
capture_record

以下のコードをコピーして貼り付け、キャプチャファイルのデータを base64 を使用してデコードします。このコードは、ペイロードとして送信された 5 つのテストサンプルと、その予測を取得します。この機能は、モデルのレスポンスによるエンドポイントの負荷を検査し、モデルのパフォーマンスをモニタリングするのに役立ちます。

input_data = capture_record["captureData"]["endpointInput"]["data"]
output_data = capture_record["captureData"]["endpointOutput"]["data"]
input_data_list = base64.b64decode(input_data).decode("utf-8").split("\n")
print(input_data_list)
output_data_list = base64.b64decode(output_data).decode("utf-8").split("\n")
print(output_data_list)

ステップ 5: エンドポイントにオートスケーリングを設定する

リアルタイム推論エンドポイントを使用するワークロードは、通常、低レイテンシーを必要とします。さらに、トラフィックが急増すると、リアルタイム推論エンドポイントに CPU の過負荷、高レイテンシー、またはタイムアウトが発生する可能性があります。そのため、低レイテンシーで効率的にトラフィックの変化を処理できるように、容量をスケールすることが重要です。SageMaker 推論オートスケーリングは、ワークロードをモニタリングし、低コストで安定した予測可能なエンドポイント性能を維持するために、インスタンス数を動的に調整します。ワークロードが増加すると、オートスケーリングはより多くのインスタンスをオンラインにし、ワークロードが減少すると、不要なインスタンスを削除し、コンピューティングコストの削減を支援します。このチュートリアルでは、AWS SDK - Boto3 を使用して、エンドポイントにオートスケーリングを設定します。SageMaker では、ターゲット追跡スケーリング、ステップスケーリング、オンデマンドスケーリング、スケジュールされたスケーリングと、複数のタイプのオートスケーリングが用意されています。このチュートリアルでは、選択したスケーリングメトリクスが指定したターゲット閾値を超えて増加したときにトリガーされる、ターゲット追跡スケーリングポリシーを使用します。

オートスケーリングは、2 つのステップで設定できます。まず、エンドポイントごとのインスタンスの最小数、希望数、最大数の詳細を含むスケーリングポリシーを設定します。次のコードをコピーして貼り付けると、ターゲット追跡スケーリングポリシーが設定されます。次のステップで選択する、指定した閾値を超えるトラフィックが発生すると、指定した最大数のインスタンスが起動します。

resp = sm_client.describe_endpoint(EndpointName=endpoint_name)

# SageMaker expects resource id to be provided with the following structure
resource_id = f"endpoint/{endpoint_name}/variant/{resp['ProductionVariants'][0]['VariantName']}"

# Scaling configuration
scaling_config_response = sm_autoscaling_client.register_scalable_target(
                                                          ServiceNamespace="sagemaker",
                                                          ResourceId=resource_id,
                                                          ScalableDimension="sagemaker:variant:DesiredInstanceCount", 
                                                          MinCapacity=1,
                                                          MaxCapacity=2
                                                        )

次のコードをコピーして貼り付け、スケーリングポリシーを作成します。選択したスケーリングメトリクスは、SageMakerVariantInvocationsPerInstance で、これは、モデルバリアントの各推論インスタンスが呼び出される 1 分あたりの平均回数です。この数値が指定した閾値である 5 を超えると、オートスケーリングが開始されます。

# Create Scaling Policy
policy_name = f"scaling-policy-{endpoint_name}"
scaling_policy_response = sm_autoscaling_client.put_scaling_policy(
                                                PolicyName=policy_name,
                                                ServiceNamespace="sagemaker",
                                                ResourceId=resource_id,
                                                ScalableDimension="sagemaker:variant:DesiredInstanceCount",
                                                PolicyType="TargetTrackingScaling",
                                                TargetTrackingScalingPolicyConfiguration={
                                                    "TargetValue": 5.0, # Target for avg invocations per minutes
                                                    "PredefinedMetricSpecification": {
                                                        "PredefinedMetricType": "SageMakerVariantInvocationsPerInstance",
                                                    },
                                                    "ScaleInCooldown": 600, # Duration in seconds until scale in
                                                    "ScaleOutCooldown": 60 # Duration in seconds between scale out
                                                }
                                            )

次のコードをコピーして貼り付けると、スケーリングポリシーの詳細を取得できます。

response = sm_autoscaling_client.describe_scaling_policies(ServiceNamespace="sagemaker")

pp = pprint.PrettyPrinter(indent=4, depth=4)
for i in response["ScalingPolicies"]:
    pp.pprint(i["PolicyName"])
    print("")
    if("TargetTrackingScalingPolicyConfiguration" in i):
        pp.pprint(i["TargetTrackingScalingPolicyConfiguration"])

以下のコードをコピーして貼り付け、エンドポイントのストレステストを行います。このコードは 250 秒間実行され、テストデータセットからランダムに選択したサンプルを送信して、エンドポイントを繰り返し呼び出します。

request_duration = 250
end_time = time.time() + request_duration
print(f"Endpoint will be tested for {request_duration} seconds")
while time.time() < end_time:
    csv_file = io.StringIO()
    test_sample = test_df.drop(["fraud"], axis=1).iloc[[np.random.randint(0, test_df.shape[0])]]
    test_sample.to_csv(csv_file, sep=",", header=False, index=False)
    payload = csv_file.getvalue()
    response = sm_runtime_client.invoke_endpoint(
                                                 EndpointName=endpoint_name,
                                                 Body=payload,
                                                 ContentType="text/csv"
                                                )

Amazon CloudWatch を使用して、エンドポイントメトリクスをモニタリングすることができます。呼び出しを含む利用可能なエンドポイントメトリクスのリストは、SageMaker エンドポイント呼び出しメトリクスを参照してください。SageMaker コンソールで、[推論] から [エンドポイント]、[fraud-detect-xgb-endpoint] を選択します。 [エンドポイント詳細] ページで、[モニタリング] セクションに移動し、[View invocation metrics] (呼び出しメトリクスの表示) を選択します。[メトリクス] のページで、メトリクスのリストから [InvocationsPerInstance] (これはスケーリングポリシーの設定時に選択したモニタリングメトリクスです) と [呼び出し] を選択し、[Graphed metrics] (グラフ化されたメトリクス) タブを選択します。

[Graphed metrics] (グラフ化されたメトリクス) ページでは、エンドポイントが受信したトラフィックパターンを視覚的に検査し、時間粒度を変更できます (例えば、デフォルトの 5 分から 1 分へ)。 オートスケーリングが 2 番目のインスタンスを追加するのに数分かかる場合があります。新しいインスタンスが追加されると、インスタンスごとの呼び出しが総呼び出しの半分になることに気が付きます。

エンドポイントが増加したペイロードを受信したら、以下のコードを実行してエンドポイントのステータスを確認することができます。このコードは、エンドポイントのステータスが [InService] (稼働中) から [Updating] (更新中) に変わったときにチェックし、インスタンス数を記録します。数分後、ステータスが [InService] (稼働中) から [Updating] (更新中) に変わり、[InService] (稼働中) に戻りますが、インスタンス数が増えていることが確認できます。

# Check the instance counts after the endpoint gets more load
response = sm_client.describe_endpoint(EndpointName=endpoint_name)
endpoint_status = response["EndpointStatus"]
request_duration = 250
end_time = time.time() + request_duration
print(f"Waiting for Instance count increase for a max of {request_duration} seconds. Please re run this cell in case the count does not change")
while time.time() < end_time:
    response = sm_client.describe_endpoint(EndpointName=endpoint_name)
    endpoint_status = response["EndpointStatus"]
    instance_count = response["ProductionVariants"][0]["CurrentInstanceCount"]
    print(f"Status: {endpoint_status}")
    print(f"Current Instance count: {instance_count}")
    if (endpoint_status=="InService") and (instance_count>1):
        break
    else:
        time.sleep(15)

ステップ 6: リソースのクリーンアップ

意図しない料金が発生しないように、使用しなくなったリソースは削除することがベストプラクティスです。

ノートブックで次のコードブロックを実行し、このチュートリアルで作成したモデル、エンドポイント設定、およびエンドポイントを削除します。 エンドポイントを削除しないと、エンドポイントで実行しているコンピューティングインスタンスに対する課金がアカウントに蓄積されたままになります。

# Delete model
sm_client.delete_model(ModelName=model_name)

# Delete endpoint configuration
sm_client.delete_endpoint_config(EndpointConfigName=endpoint_config_name)

# Delete endpoint
sm_client.delete_endpoint(EndpointName=endpoint_name)

S3 バケットを削除するには、以下を実行します。 

  • Amazon S3 コンソールを開きます。ナビゲーションバーで、[バケット]sagemaker-<your-Region>-<your-account-id>を選択し、[fraud-detect-demo] の横のチェックボックスを選択します。その後、[Delete] (削除) を選択します
  • [Delete objects] (オブジェクトの削除) ダイアログボックスで、削除するオブジェクトが正しく選択されていることを確認し、[Permanently delete objects] (オブジェクトの完全削除) 確認ボックス [permanently delete] (完全に削除する) と入力します。
  • これが完了し、バケットが空になったら、再度同じ手順で sagemaker-<your-Region>-<your-account-id>バケットを削除することができます。

このチュートリアルでノートブック画像を実行するために使用されているデータサイエンスカーネルは、カーネルを停止するか、次のステップを実行してアプリケーションを削除するまで、料金が蓄積されます。 詳細については、Amazon SageMaker Developer Guide のリソースのシャットダウンを参照してください。

SageMaker Studio のアプリケーションを削除するには、次の手順を実行します。SageMaker Studio コンソールで、[studio-user] を選択し、[Delete app] (アプリケーションの削除) を選択して [Apps] (アプリケーション) の下に表示されているアプリケーションをすべて削除します。[ステータス] が [削除] に変わるまで待ちます。

ステップ 1 で既存の SageMaker Studio ドメインを使用した場合は、ステップ 6 の残りをスキップして、結論のセクションに直接進んでください。 

ステップ 1 で CloudFormation テンプレートを実行して新しい SageMaker Studio ドメインを作成した場合は、次のステップに進み、CloudFormation テンプレートで作成したドメイン、ユーザー、リソースを削除してください。  

CloudFormation コンソールを開くには、AWS コンソールの検索バーに [CloudFormation] と入力し、検索結果から [CloudFormation] を選択します。

[CloudFormation] ペインで、[スタック] を選択します。ステータスドロップダウンリストから、[アクティブ] を選択します。スタック名で、[CFN-SM-IM-Lambda-catalog] を選択し、スタックの詳細ページを開きます。

CFN-SM-IM-Lambda-catalog スタックの詳細ページで、[削除] を選択して、ステップ 1 で作成したリソースと一緒にスタックを削除します。

まとめ

おめでとうございます。 これで、リアルタイム推論エンドポイントへの機械学習モデルのデプロイチュートリアルは終了です。 

このチュートリアルでは、SageMaker モデルを作成し、リアルタイム推論エンドポイントにデプロイしました。AWS SDK - Boto3 API を使用してエンドポイントを呼び出し、データキャプチャ機能を活用してエンドポイントのペイロードとレスポンスを S3 に保存しながら、サンプル推論を実行してテストしました。最後に、トラフィックの変動に対応するために、ターゲットエンドポイントの呼び出しメトリクスを使用して、オートスケーリングを設定しました。

以下の次のステップのセクションに従うことで、SageMaker を使用した機械学習のジャーニーを続けることができます。

このページは役に立ちましたか?

深層学習モデルをトレーニング

TensorFlow 深層学習モデルの構築、トレーニング、およびチューニングの方法を学びます。
次へ »

機械学習モデルを自動的に作成する

コードを書かずに機械学習モデルを開発するために AutoML を使用する方法を学びます。
次へ »

その他のハンズオンチュートリアルを探す

他の機械学習チュートリアルを参照して、より深く掘り下げます。
次へ »