시작하기 / 실습 / ...

실시간 추론 엔드포인트에 기계 학습 모델 배포

자습서

개요

이 자습서에서는 Amazon SageMaker Studio를 사용하여, 훈련된 기계 학습(ML) 모델을 실시간 추론 엔드포인트에 배포하는 방법을 학습합니다.

SageMaker Studio는 ML을 위한 통합 개발 환경(IDE)으로, 모델 배포를 비롯한 엔드 투 엔드 ML 수명 주기 태스크를 수행할 수 있는 완전관리형 Jupyter Notebook 인터페이스를 제공합니다.

SageMaker는 광범위한 사용 사례를 지원하는 다양한 추론 옵션을 제공합니다.

이 자습서에서는 실시간 추론 옵션을 사용하여 가상 자동차 보험 청구 데이터 세트에 이미 훈련한 바이너리 분류 XGBoost 모델을 배포합니다. 해당 데이터 세트는 세부 정보와 claimscustomer 테이블에서 추출된 특성, 그리고 청구의 사기 여부를 나타내는 fraud 열로 구성됩니다. 이 모델은 보험금 청구가 사기일 확률을 예측합니다. 여러분은 이 모델을 배포하고 샘플 추론을 실행하는 기계 학습 엔지니어의 역할을 수행합니다.

학습 목표

이 가이드에서는 다음을 수행합니다.

  • 훈련된 모델 아티팩트에서 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개의 SageMaker Studio 도메인만 설정할 수 있습니다. 미국 동부(버지니아 북부) 리전에 이미 SageMaker Studio 도메인이 있는 경우 SageMaker Studio 설정 가이드에 따라 필요한 AWS IAM 정책을 SageMaker Studio 계정에 연결한 다음 1단계를 건너뛰고 2단계로 바로 넘어가세요. 

기존 SageMaker Studio 도메인이 없는 경우 1단계를 계속 진행하여 AWS CloudFormation 템플릿을 실행합니다. 그러면 SageMaker Studio 도메인이 생성되고 이 자습서의 나머지 부분에 필요한 권한이 추가됩니다.

AWS CloudFormation 스택 링크를 선택합니다. 이 링크를 누르면 AWS CloudFormation 콘솔이 열리고 SageMaker Studio 도메인과 studio-user라는 이름의 사용자가 생성됩니다. 또한 필요한 권한이 SageMaker Studio 계정에 추가됩니다. CloudFormation 콘솔에서 미국 동부(버지니아 북부)(US East (N. Virginia))가 오른쪽 위에 표시된 리전인지 확인합니다. 스택 이름(Stack name)CFN-SM-IM-Lambda-Catalog여야 하며 변경할 수 없습니다. 이 스택은 모든 리소스를 생성하는 데 약 10분이 걸립니다.

이 스택은 퍼블릭 VPC가 계정에 이미 설정되어 있는 것으로 가정합니다. 퍼블릭 VPC가 없는 경우 단일 퍼블릭 서브넷이 있는 VPC를 참조하여 퍼블릭 VPC 생성 방법에 대해 알아보세요. 

AWS CloudFormation이 IAM 리소스를 생성할 수 있음을 동의합니다(I acknowledge that AWS CloudFormation might create IAM resources)를 선택하고 스택 생성(Create stack)을 선택합니다.

CloudFormation 창에서 스택(Stacks)을 선택합니다. 스택이 생성되는 데 약 10분이 걸립니다. 스택이 생성되면 스택 상태가 CREATE_IN_PROGRESS에서 CREATE_COMPLETE로 바뀝니다. 

2단계: SageMaker Studio 노트북 설정

이 단계에서는 새 SageMaker Studio 노트북을 시작하고 필요한 오픈 소스 라이브러리를 설치한 다음 Amazon Simple Storage Service(S3)에서 훈련된 모델 아티팩트를 가져오는 데 필요한 SageMaker 변수를 구성합니다. 하지만 모델 아티팩트는 추론용으로 직접 배포할 수 없으므로, 먼저 모델 아티팩트에서 SageMaker 모델을 생성해야 합니다. 생성된 모델에는 SageMaker가 모델 배포에 사용할 훈련 및 추론 코드가 포함됩니다.

SageMaker Studio를 콘솔 검색 창에 입력하고 SageMaker Studio를 선택합니다.

SageMaker 콘솔의 오른쪽 위에 있는 리전(Region) 드롭다운 목록에서 미국 동부(버지니아 북부)(US East (N. Virginia))를 선택합니다. 앱 시작(Launch app)에서 Studio를 선택하고 studio-user 프로필을 사용하여 SageMaker Studio를 엽니다.

SageMaker Studio 인터페이스를 엽니다. 탐색 모음에서 파일(File)새로 만들기(New)노트북(Notebook)을 선택합니다. 

노트북 환경 설정(Set up notebook environment) 대화 상자의 이미지(Image)에서 데이터 과학(Data Science)을 선택합니다. Python 3 커널이 자동으로 선택됩니다. 선택(Select)을 선택합니다. 

노트북의 오른쪽 위에 있는 커널(kernel)에 이제 Python 3(데이터 과학)(Python 3 (Data Science))이 표시됩니다.

다음 코드 조각을 복사하여 노트북의 셀에 붙여 넣고, Shift+Enter를 눌러 현재 셀을 실행하여 여러 AWS 서비스와 상호 작용하는 API인 aiobotocore 라이브러리를 업데이트합니다. 커널을 다시 시작하라는 경고 또는 모든 종속성 충돌 오류를 무시합니다.

%pip install --upgrade -q aiobotocore

또한 S3 클라이언트 객체와 기본 S3 버킷 내의 위치(지표 및 모델 아티팩트가 업로드되는 위치)를 인스턴스화해야 합니다. 그렇게 하려면 다음 코드를 복사하여 노트북 셀에 붙여 넣고 실행합니다. 아래 코드의 16번 줄에 있는 SageMaker 세션 객체에 의해 쓰기 버킷 sagemaker-<your-Region>-<your-account-id>이 자동으로 생성됩니다. 훈련에 사용하는 데이터 세트는 29번 줄에 읽기 버킷으로 지정된 퍼블릭 S3 버킷(sagemaker-sample-files)에 있습니다. 버킷 내의 위치는 읽기 접두사를 통해 지정됩니다.

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 SDK, AWS SDK - Boto3, SageMaker 콘솔 등 다양한 방법으로, 훈련된 모델을 실시간 추론 엔드포인트에 배포할 수 있습니다. 자세한 내용은 Amazon SageMaker 개발자 가이드에서 추론을 위한 모델 배포를 참조하세요. SageMaker SDK는 AWS SDK - Boto3에 비해 추상화가 더 많으며, AWS SDK - Boto3는 모델 배포를 보다 효과적으로 제어할 수 있도록 낮은 수준의 API를 제공합니다. 이 자습서에서는 AWS SDK -Boto3를 사용하여 모델을 배포합니다. 모델을 배포하려면 다음 세 단계를 순서대로 수행해야 합니다.

  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 콘솔의 모델(Models) 섹션에서, 생성된 모델을 확인할 수 있습니다.

SageMaker 모델을 생성한 후 다음 코드를 복사하고 붙여 넣어 Boto3 create_endpoint_config 메서드를 사용하여 엔드포인트를 구성합니다. create_endpoint_config 메서드의 기본 입력은 엔드포인트 구성 이름과 추론 인스턴스 유형 및 개수, 배포할 모델 이름, 엔드포인트가 처리해야 하는 트래픽 공유 등의 변형 정보입니다. 이러한 설정 외에, DataCaptureConfig를 지정하여 데이터 캡처를 설정할 수도 있습니다. 이 기능을 사용하면 Amazon S3에서 요청 및/또는 응답을 캡처하고 저장하도록 실시간 엔드포인트를 구성할 수 있습니다. 데이터 캡처는 모델 모니터링을 설정하는 단계 중 하나로, 기준 지표 및 모니터링 작업과 결합하면 테스트 데이터 지표를 기준과 비교하여 모델 성능을 모니터링하는 데 도움이 됩니다. 이 같은 모니터링은 모델에 따라 또는 데이터 드리프트 및 감사 목적으로 모델 재훈련을 예약하는 데 유용합니다. 현재 설정에서는 입력(들어오는 테스트 데이터)과 출력(모델 예측)이 모두 캡처되어 기본 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 콘솔의 엔드포인트 구성(Endpoint configurations) 섹션에서 확인할 수 있습니다.

 

 

다음 코드를 복사하고 붙여 넣어 엔드포인트를 생성합니다. 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 resources) 아이콘을 선택합니다. SageMaker 리소스(SageMaker resources)에서 엔드포인트)를 선택하고 이름(name)에서 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 직렬화 프로세스가 사용됩니다. 그런 다음 응답이 예측의 배열로 역직렬화됩니다. 실행이 완료되면, 셀은 모델 예측과 테스트 샘플의 실제 레이블을 반환합니다. XGBoost 모델은 실제 클래스 레이블 대신 확률을 반환합니다. 이 모델은 테스트 샘플이 사기성 보험금 청구일 가능성을 매우 낮게 예측했으며 예측은 실제 레이블과 일치합니다.

 

# 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 콘솔을 엽니다. 추론(Inference)에서 엔드포인트(Endpoints)fraud-detect-xgb-endpoint를 차례로 선택합니다.

 

엔드포인트 세부 정보(Endpoint details) 페이지의 모니터링(Monitor)에서 호출 지표 보기(View invocation metrics)를 선택합니다. 처음에는 지표 차트에 점이 하나만 표시될 수 있습니다. 하지만 여러 번 호출하면 샘플 스크린샷에 있는 것과 유사한 줄이 표시됩니다.

지표(Metrics) 페이지에는 여러 엔드포인트 성능 지표가 표시됩니다. 1시간 또는 3시간과 같은 다른 기간을 선택하여 엔드포인트 성능을 시각화할 수 있습니다. 선택한 기간 동안의 추세를 확인하려면 지표를 선택합니다. 다음 단계에서는 이러한 지표 중 하나를 선택하여 오토 스케일링 정책을 정의합니다.

 

 

엔드포인트 구성에 데이터 캡처가 설정되어 있으므로, 응답과 함께 엔드포인트로 전송된 페이로드를 검사할 수 있습니다. 캡처된 데이터를 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 Lines 파일로 저장됩니다. JSON Lines는 각 줄이 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는 대상 추적 스케일링, 단계 스케일링, 온디맨드 스케일링, 예약된 스케일링 등 다양한 오토 스케일링 유형을 제공합니다. 이 자습서에서는 선택한 스케일링 지표가 선택한 대상 임계값을 초과할 때 트리거되는 대상 추적 스케일링 정책을 사용합니다.

오토 스케일링은 두 단계로 설정할 수 있습니다. 먼저, 엔드포인트당 최소 인스턴스, 원하는 인스턴스 및 최대 인스턴스 수에 대한 세부 정보가 포함된 확장 정책을 구성합니다. 다음 코드를 복사하고 붙여 넣어 대상 추적 스케일링 정책을 구성합니다. 지정된 최대 인스턴스 수는 트래픽이 다음 단계에서 선택하는 임계값을 초과할 때 실행됩니다.

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입니다. 이 지표는 모델 변동으로 인해 각 추론 인스턴스가 분당 호출되는 평균 횟수입니다. 이 숫자가 선택한 임계값인 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를 사용하여 엔드포인트 지표를 모니터링할 수 있습니다. 호출(invocation)을 포함하여 사용 가능한 엔드포인트 지표의 목록을 보려면 SageMaker 엔드포인트 호출 지표를 참조하세요. SageMaker 콘솔의 추론(Inference)에서 엔드포인트(Endpoints), fraud-detect-xgb-endpoint를 차례로 선택합니다. 엔드포인트 세부 정보(Endpoint details) 페이지에서 모니터링(Monitor) 섹션으로 이동하고 호출 지표 보기(View invocation metrics)를 선택합니다. 지표(Metrics) 페이지의 지표 목록에서 InvocationsPerInstance(확장 정책을 설정할 때 선택하는 모니터링 지표)와 호출(Invocations)을 선택한 후 그래프로 표시된 지표(Graphed metrics) 탭을 선택합니다.

그래프로 표시된 지표(Graphed metrics) 페이지에서 엔드포인트가 수신한 트래픽 패턴을 육안으로 검사하고, 시간 세분화 수준을 변경(예: 기본값 5분에서 1분으로 변경)할 수 있습니다. 오토 스케일링이 두 번째 인스턴스를 추가하는 데 몇 분 정도 걸릴 수 있습니다. 새 인스턴스가 추가되고 나면, 인스턴스당 호출이 전체 호출의 절반이라는 것을 알 수 있습니다.

엔드포인트가 증가된 페이로드를 수신하면, 아래 코드를 실행하여 엔드포인트의 상태를 확인할 수 있습니다. 이 코드는 엔드포인트의 상태가 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 콘솔을 엽니다. 탐색 모음에서 버킷(Buckets), sagemaker-<your-Region>-<your-account-id>,를 선택한 다음 fraud-detect-demo 옆의 확인란을 선택합니다. 그런 다음 삭제(Delete)를 선택합니다. 
  • 객체 삭제(Delete objects) 대화 상자에서 삭제할 객체를 올바르게 선택했는지 확인하고 이 객체를 영구적으로 삭제(Permanently delete objects) 확인 입력란에 영구 삭제(permanently delete)를 입력합니다. 
  • 완료되면 버킷이 비워지고 동일한 절차를 다시 사용하여sagemaker-<your-Region>-<your-account-id> 버킷을 삭제할 수 있습니다.

이 자습서에서 노트북 이미지를 실행하는 데 사용된 데이터 과학(Data Science) 커널은 커널을 중지하거나 다음 단계를 수행하여 앱을 삭제할 때까지 변경 사항을 누적합니다. 자세한 내용은 Amazon SageMaker 개발자 안내서에서 리소스 종료를 참조하세요.

SageMaker Studio 앱을 삭제하려면 다음을 수행합니다. SageMaker Studio 콘솔에서 studio-user를 선택한 다음 앱 삭제(Delete app)를 선택하여 앱(Apps)에 나열된 모든 앱을 삭제합니다. 상태(Status)삭제됨(Deleted)으로 변경될 때까지 기다립니다.

1단계에서 기존 SageMaker Studio 도메인을 사용한 경우 6단계로 건너뛰고 결론 섹션으로 바로 진행합니다. 

1단계에서 CloudFormation 템플릿을 실행하여 새 SageMaker Studio 도메인을 생성한 경우 다음 단계를 계속 진행하여 CloudFormation 템플릿으로 생성된 도메인, 사용자 및 리소스를 삭제합니다.  

CloudFormation 콘솔을 열려면 AWS Console 검색 창에 CloudFormation을 입력하고 검색 결과에서 CloudFormation을 선택합니다.

CloudFormation 창에서 스택(Stacks)을 선택합니다. 상태 드롭다운 목록에서 활성(Active)을 선택합니다. 스택 이름(Stack name) 아래에서 CFN-SM-IM-Lambda-catalog를 선택하여 스택 세부 정보 페이지를 엽니다.

CFN-SM-IM-Lambda-catalog 스택 세부 정보 페이지에서 삭제(Delete)를 선택하여 스택과 함께 1단계에서 생성된 리소스를 삭제합니다.

결론

축하합니다! 실시간 추론 엔드포인트에 기계 학습 모델 배포 자습서를 완료하셨습니다. 

이 자습서에서는 SageMaker 모델을 생성하여 실시간 추론 엔드포인트에 배포했습니다. AWS SDK - Boto3 API를 사용하여 엔드포인트를 호출하고 샘플 추론을 실행하여 테스트하고, 데이터 캡처 기능을 활용하여 엔드포인트 페이로드와 응답을 S3에 저장했습니다. 마지막으로, 트래픽 변동에 대응하기 위해 대상 엔드포인트 호출 지표를 사용하여 오토 스케일링을 구성했습니다.

아래의 다음 단계 섹션에 따라 SageMaker를 통한 기계 학습 여정을 계속할 수 있습니다.

이 페이지의 내용이 도움이 되었습니까?

딥 러닝 모델 훈련

TensorFlow 딥 러닝 모델을 구축, 훈련 및 튜닝하는 방법을 알아봅니다.
다음 »

ML 모델을 자동으로 생성

AutoML을 사용하여 코드 작성 없이 ML 모델을 개발하는 방법을 알아봅니다.
다음 »

추가 실습 자습서 찾기

심화 학습을 위한 다른 기계 학습 자습서를 살펴봅니다.
다음 »