실시간 엔드포인트에서 데이터 캡처 - Amazon SageMaker

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

실시간 엔드포인트에서 데이터 캡처

참고

Data Capture는 추론 요청에 영향이 없도록 하기 위해 디스크 사용량이 많은 경우 요청 캡처를 중단합니다. 데이터 캡처가 요청을 계속 캡처하도록 하려면, 디스크 사용률을 75% 미만으로 유지하는 것이 좋습니다.

실시간 엔드포인트의 데이터를 캡처하려면 호스팅 서비스를 사용하여 SageMaker 모델을 배포해야 합니다. 이렇게 하려면 SageMaker 모델을 생성하고, 엔드포인트 구성을 정의하고, HTTPS 엔드포인트를 생성해야 합니다.

데이터 캡처를 활성화하는 데 필요한 단계는 AWS SDK for Python (Boto) 또는 SageMaker Python 를 사용하든 비슷합니다SDK. 를 사용하는 경우 데이터 캡처를 활성화하는 CreateEndpointConfig 메서DataCaptureConfig드 내에서 필수 필드와 함께 사전을 AWS SDK정의합니다. SageMaker Python 를 사용하는 경우 DataCaptureConfig 클래스를 SDK가져오고 이 클래스에서 인스턴스를 초기화합니다. 그런 다음 이 객체를 sagemaker.model.Model.deploy()메서드의 DataCaptureConfig파라미터에 전달합니다.

이전 코드 조각을 사용하려면 italicized placeholder text 를 사용자 정보가 포함된 예제 코드에 입력합니다.

데이터 캡처 활성화 방법

데이터 캡처 구성을 지정합니다. 이 구성을 사용하여 요청 페이로드, 응답 페이로드 또는 둘 다를 캡처할 수 있습니다. 이전 코드 코드 조각은 AWS SDK for Python (Boto) 및 Python 을 사용하여 데이터 캡처를 SageMaker 활성화하는 방법을 보여줍니다SDK.

참고

요청 또는 응답 페이로드를 캡처하기 위해 모델 모니터를 사용할 필요는 없습니다.

AWS SDK for Python (Boto)

CreateEndpointConfig 메서DataCaptureConfig드를 사용하여 엔드포인트를 생성할 때 사전으로 캡처하려는 데이터를 구성합니다. EnableCapture를 부울 값 True로 설정합니다. 또한 다음과 같은 필수 파라미터를 제공합니다.

  • EndpointConfigName: 엔드포인트 구성의 이름입니다. CreateEndpoint 요청 시 이 이름을 사용하게 됩니다.

  • ProductionVariants: 이 엔드포인트에서 호스팅하려는 모델 모니터입니다. 각 모델의 사전 데이터 유형을 정의합니다.

  • DataCaptureConfig: 샘플링할 데이터의 초기 백분율(InitialSamplingPercentage), URI 캡처된 데이터를 저장할 Amazon S3 및 캡처 옵션(CaptureOptions) 목록에 해당하는 정수 값을 지정하는 사전 데이터 유형입니다. CaptureOptions 목록 내에서 CaptureMode에 대해 Input또는 Output중 하나를 지정합니다.

키-값 페어 인수를 CaptureContentTypeHeader 사전에 전달하여 캡처된 데이터를 SageMaker 인코딩하는 방법을 선택적으로 지정할 수 있습니다.

# Create an endpoint config name. endpoint_config_name = '<endpoint-config-name>' # The name of the production variant. variant_name = '<name-of-production-variant>' # The name of the model that you want to host. # This is the name that you specified when creating the model. model_name = '<The_name_of_your_model>' instance_type = '<instance-type>' #instance_type='ml.m5.xlarge' # Example # Number of instances to launch initially. initial_instance_count = <integer> # Sampling percentage. Choose an integer value between 0 and 100 initial_sampling_percentage = <integer> # The S3 URI containing the captured data s3_capture_upload_path = 's3://<bucket-name>/<data_capture_s3_key>' # Specify either Input, Output, or both capture_modes = [ "Input", "Output" ] #capture_mode = [ "Input"] # Example - If you want to capture input only endpoint_config_response = sagemaker_client.create_endpoint_config( EndpointConfigName=endpoint_config_name, # List of ProductionVariant objects, one for each model that you want to host at this endpoint. ProductionVariants=[ { "VariantName": variant_name, "ModelName": model_name, "InstanceType": instance_type, # Specify the compute instance type. "InitialInstanceCount": initial_instance_count # Number of instances to launch initially. } ], DataCaptureConfig= { 'EnableCapture': True, # Whether data should be captured or not. 'InitialSamplingPercentage' : initial_sampling_percentage, 'DestinationS3Uri': s3_capture_upload_path, 'CaptureOptions': [{"CaptureMode" : capture_mode} for capture_mode in capture_modes] # Example - Use list comprehension to capture both Input and Output } )

다른 엔드포인트 구성 옵션에 대한 자세한 내용은 Amazon Service 참조 가이드CreateEndpointConfigAPI의 섹션을 참조하세요. SageMaker API

SageMaker Python SDK

sagemaker.model_monitor 모듈에서 DataCaptureConfig클래스를 가져옵니다. EnableCapture를 부울 값 True로 설정하여 데이터 캡처를 활성화합니다.

선택적으로 다음 파라미터에 대한 인수를 제공합니다.

  • SamplingPercentage: 샘플링할 데이터의 백분율에 해당하는 정수 값입니다. 샘플링 백분율을 제공하지 않으면 SageMaker 는 기본값인 데이터 20(20%)을 샘플링합니다.

  • DestinationS3Uri: Amazon S3URI SageMaker 는 캡처된 데이터를 저장하는 데 사용합니다. 제공하지 않으면 SageMaker 는 캡처된 데이터를 에 저장합니다"s3://<default-session-bucket>/ model-monitor/data-capture".

from sagemaker.model_monitor import DataCaptureConfig # Set to True to enable data capture enable_capture = True # Optional - Sampling percentage. Choose an integer value between 0 and 100 sampling_percentage = <int> # sampling_percentage = 30 # Example 30% # Optional - The S3 URI of stored captured-data location s3_capture_upload_path = 's3://<bucket-name>/<data_capture_s3_key>' # Specify either Input, Output or both. capture_modes = ['REQUEST','RESPONSE'] # In this example, we specify both # capture_mode = ['REQUEST'] # Example - If you want to only capture input. # Configuration object passed in when deploying Models to SM endpoints data_capture_config = DataCaptureConfig( enable_capture = enable_capture, sampling_percentage = sampling_percentage, # Optional destination_s3_uri = s3_capture_upload_path, # Optional capture_options = ["REQUEST", "RESPONSE"], )

모델 배포

모델을 배포하고 DataCapture 활성화된 HTTPS 엔드포인트를 생성합니다.

AWS SDK for Python (Boto3)

에 엔드포인트 구성을 제공합니다 SageMaker. 서비스는 ML 컴퓨팅 인스턴스를 시작하고 구성에서 지정된 대로 모델을 배포합니다.

모델 및 엔드포인트 구성이 완료되면 를 사용하여 엔드포인트CreateEndpointAPI를 생성합니다. 엔드포인트 이름은 AWS 계정의 AWS 리전 내에서 고유해야 합니다.

다음은 요청에 지정된 엔드포인트 구성을 사용하여 엔드포인트를 생성합니다. Amazon은 엔드포인트를 SageMaker 사용하여 리소스를 프로비저닝하고 모델을 배포합니다.

# The name of the endpoint. The name must be unique within an AWS Region in your AWS account. endpoint_name = '<endpoint-name>' # The name of the endpoint configuration associated with this endpoint. endpoint_config_name='<endpoint-config-name>' create_endpoint_response = sagemaker_client.create_endpoint( EndpointName=endpoint_name, EndpointConfigName=endpoint_config_name)

자세한 내용은 CreateEndpoint 섹션을 참조하세요API.

SageMaker Python SDK

엔드포인트의 이름을 정의합니다. 이 단계는 선택 사항입니다. 제공하지 않으면 가 고유한 이름을 SageMaker 생성합니다.

from datetime import datetime endpoint_name = f"DEMO-{datetime.utcnow():%Y-%m-%d-%H%M}" print("EndpointName =", endpoint_name)

모델 객체의 기본 제공 deploy() 메서드를 사용하여 모델을 실시간 HTTPS 엔드포인트에 배포합니다. instance_type 필드에 이 모델을 배포할 Amazon EC2 인스턴스 유형의 이름과 필드에 대해 엔드포인트를 실행할 초기 인스턴스 수를 입력합니다initial_instance_count.

initial_instance_count=<integer> # initial_instance_count=1 # Example instance_type='<instance-type>' # instance_type='ml.m4.xlarge' # Example # Uncomment if you did not define this variable in the previous step #data_capture_config = <name-of-data-capture-configuration> model.deploy( initial_instance_count=initial_instance_count, instance_type=instance_type, endpoint_name=endpoint_name, data_capture_config=data_capture_config )

캡처된 데이터 보기

SageMaker Python 예측기 클래스에서 SDK 예측기 객체를 생성합니다. Predictor 클래스에서 반환된 객체를 사용하여 향후 단계에서 엔드포인트를 호출합니다. 엔드포인트 이름(이전에 endpoint_name으로 정의됨)을 serializer 및 deserializer용 serializer 및 deserializer 객체와 함께 제공합니다. 직렬화기 유형에 대한 자세한 내용은 SageMaker Python SDK직렬화기 클래스를 참조하세요.

from sagemaker.predictor import Predictor from sagemaker.serializers import <Serializer> from sagemaker.deserializers import <Deserializers> predictor = Predictor(endpoint_name=endpoint_name, serializer = <Serializer_Class>, deserializer = <Deserializer_Class>) # Example #from sagemaker.predictor import Predictor #from sagemaker.serializers import CSVSerializer #from sagemaker.deserializers import JSONDeserializer #predictor = Predictor(endpoint_name=endpoint_name, # serializer=CSVSerializer(), # deserializer=JSONDeserializer())

이전 코드 예제 시나리오에서는 라는 CSV 파일에 로컬로 저장한 샘플 검증 데이터가 포함된 엔드포인트를 호출합니다validation_with_predictions. 샘플 검증 세트에는 각 입력에 대한 레이블이 포함되어 있습니다.

문이 있는 의 처음 몇 줄은 먼저 검증 세트 CSV 파일을 연 다음 파일 내의 각 행을 쉼표 문자 로 분할","한 다음 반환된 두 객체를 레이블 및 input_cols 변수에 저장합니다. 각 행에 대해 입력(input_cols)은 예측 변수(predictor)의 객체 내장 메서드 Predictor.predict()로 전달됩니다.

모델이 확률을 반환한다고 가정해 보겠습니다. 확률의 범위는 0~1.0입니다. 모델에서 반환되는 확률이 80%(0.8)보다 큰 경우 예측에 정수 값 레이블 1을 할당합니다. 그렇지 않으면 예측에 정수 값 레이블 0을 할당합니다.

from time import sleep validate_dataset = "validation_with_predictions.csv" # Cut off threshold of 80% cutoff = 0.8 limit = 200 # Need at least 200 samples to compute standard deviations i = 0 with open(f"test_data/{validate_dataset}", "w") as validation_file: validation_file.write("probability,prediction,label\n") # CSV header with open("test_data/validation.csv", "r") as f: for row in f: (label, input_cols) = row.split(",", 1) probability = float(predictor.predict(input_cols)) prediction = "1" if probability > cutoff else "0" baseline_file.write(f"{probability},{prediction},{label}\n") i += 1 if i > limit: break print(".", end="", flush=True) sleep(0.5) print() print("Done!")

이전 단계에서 데이터 캡처를 활성화했으므로 요청 및 응답 페이로드는 일부 추가 메타데이터와 함께 DataCaptureConfig에서 지정한 Amazon S3 위치에 저장됩니다. 캡처 데이터를 Amazon S3로 전송하는 데 몇 분이 걸릴 수 있습니다.

캡처된 데이터는 Amazon S3에 저장된 데이터 캡처 파일을 나열하는 방식으로 확인하세요. 해당 Amazon S3 경로의 형식은 s3:///{endpoint-name}/{variant-name}/yyyy/mm/dd/hh/filename.jsonl입니다.

호출이 발생한 시간을 기준으로 구성된 서로 다른 기간의 서로 다른 파일을 볼 수 있습니다. 다음을 실행하여 단일 캡처 파일의 내용을 인쇄합니다.

print("\n".join(capture_file[-3:-1]))

이렇게 하면 SageMaker 특정 JSON줄 형식의 파일이 반환됩니다. 다음은 csv/text데이터를 사용하여 호출한 실시간 엔드포인트에서 가져온 응답 샘플입니다.

{"captureData":{"endpointInput":{"observedContentType":"text/csv","mode":"INPUT", "data":"69,0,153.7,109,194.0,105,256.1,114,14.1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0\n", "encoding":"CSV"},"endpointOutput":{"observedContentType":"text/csv; charset=utf-8","mode":"OUTPUT","data":"0.0254181120544672","encoding":"CSV"}}, "eventMetadata":{"eventId":"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee","inferenceTime":"2022-02-14T17:25:49Z"},"eventVersion":"0"} {"captureData":{"endpointInput":{"observedContentType":"text/csv","mode":"INPUT", "data":"94,23,197.1,125,214.5,136,282.2,103,9.5,5,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1\n", "encoding":"CSV"},"endpointOutput":{"observedContentType":"text/csv; charset=utf-8","mode":"OUTPUT","data":"0.07675473392009735","encoding":"CSV"}}, "eventMetadata":{"eventId":"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee","inferenceTime":"2022-02-14T17:25:49Z"},"eventVersion":"0"}

진행 예시에서 capture_file객체는 목록 유형입니다. 목록의 첫 번째 요소를 인덱싱하여 단일 추론 요청을 확인합니다.

# The capture_file object is a list. Index the first element to view a single inference request print(json.dumps(json.loads(capture_file[0]), indent=2))

이는 다음과 비슷한 응답을 반환합니다. 반환되는 값은 엔드포인트 구성, SageMaker 모델 및 캡처된 데이터에 따라 달라집니다.

{ "captureData": { "endpointInput": { "observedContentType": "text/csv", # data MIME type "mode": "INPUT", "data": "50,0,188.9,94,203.9,104,151.8,124,11.6,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,1,0\n", "encoding": "CSV" }, "endpointOutput": { "observedContentType": "text/csv; charset=character-encoding", "mode": "OUTPUT", "data": "0.023190177977085114", "encoding": "CSV" } }, "eventMetadata": { "eventId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "inferenceTime": "2022-02-14T17:25:06Z" }, "eventVersion": "0" }