Captura de datos del punto de conexión en tiempo real - Amazon SageMaker

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Captura de datos del punto de conexión en tiempo real

nota

Para evitar que las solicitudes de inferencia se vean afectadas, la captura de datos deja de capturar solicitudes con niveles altos de uso de disco. Se recomienda mantener la utilización del disco por debajo del 75 % para garantizar que la captura de datos siga capturando las solicitudes.

Para capturar datos para su punto final en tiempo real, debe implementar un modelo mediante servicios de SageMaker alojamiento. Esto requiere que cree un SageMaker modelo, defina una configuración de punto final y cree un HTTPS punto final.

Los pasos necesarios para activar la captura de datos son similares tanto si utilizas Python como AWS SDK for Python (Boto) si utilizas SageMaker PythonSDK. Si usa el AWS SDK, defina el DataCaptureConfigdiccionario, junto con los campos obligatorios, dentro del CreateEndpointConfigmétodo para activar la captura de datos. Si usas SageMaker PythonSDK, importa la DataCaptureConfigclase e inicializa una instancia de esta clase. A continuación, pase este objeto al parámetro DataCaptureConfig del método sagemaker.model.Model.deploy().

Para usar los fragmentos de código siguientes, reemplaza el italicized placeholder text en el código de ejemplo con su propia información.

Cómo establecer la captura de datos

Especifique una configuración de captura de datos. Puede capturar la carga útil de solicitud, la carga útil de respuesta o ambas con esta configuración. El fragmento de código siguiente muestra cómo habilitar la captura de datos mediante AWS SDK for Python (Boto) y Python SageMaker. SDK

nota

No necesita usar el monitor de modelos para capturar las cargas de solicitud o respuesta.

AWS SDK for Python (Boto)

Configure los datos que desea capturar con el DataCaptureConfigdiccionario al crear un punto final mediante el CreateEndpointConfig método. Establezca EnableCapture en el valor booleano True. Además, proporcione los siguientes parámetros obligatorios:

  • EndpointConfigName: el nombre de la configuración del punto de conexión. Utilizará este nombre cuando haga una solicitud CreateEndpoint.

  • ProductionVariants: una lista de modelos que desea alojar en este punto de conexión. Defina un tipo de datos de diccionario para cada modelo.

  • DataCaptureConfig: tipo de datos de diccionario en el que se especifica un valor entero que corresponde al porcentaje inicial de datos que se van a muestrear (InitialSamplingPercentage), el Amazon S3 URI en el que desea que se almacenen los datos capturados y una lista de opciones de captura (CaptureOptions). Especifique Input o Output para CaptureMode en la lista CaptureOptions.

Si lo desea, puede especificar cómo SageMaker debe codificar los datos capturados pasando los argumentos del par clave-valor al diccionario. CaptureContentTypeHeader

# 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 } )

Para obtener más información sobre otras opciones de configuración de terminales, consulta CreateEndpointConfigAPIla Guía de API referencia SageMaker de Amazon Service.

SageMaker Python SDK

Importe la clase DataCaptureConfig del módulo sagemaker.model_monitor. Habilite la captura de datos al configurar EnableCapture en el valor booleano True.

Si lo desea, proporcione argumentos para los siguientes parámetros:

  • SamplingPercentage: un valor entero que corresponde al porcentaje de datos que se van a muestrear. Si no proporciona un porcentaje de muestreo, SageMaker tomará una muestra predeterminada del 20 (20%) de sus datos.

  • DestinationS3Uri: Amazon S3 URI SageMaker se utilizará para almacenar los datos capturados. Si no lo proporciona, SageMaker almacenará los datos capturados en"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"], )

Implementar el modelo

Implemente su modelo y cree un HTTPS punto final si DataCapture está activado.

AWS SDK for Python (Boto3)

Proporcione la configuración del punto final a SageMaker. El servicio inicia las instancias de cómputo de ML e implementa el modelo o los modelos según se especifica en la configuración.

Una vez que tenga el modelo y la configuración del punto final, CreateEndpointAPIutilícelos para crear el punto final. El nombre del punto final debe ser único en una AWS región de su AWS cuenta.

Siga estas instrucciones para crear un punto de conexión utilizando la configuración especificada en la solicitud. Amazon SageMaker usa el punto de conexión para aprovisionar recursos e implementar modelos.

# 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)

Para obtener más información, consulte la CreateEndpointAPI.

SageMaker Python SDK

Defina un nombre para el punto de conexión. Este paso es opcional. Si no proporciona uno, SageMaker creará un nombre único para usted:

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

Implemente su modelo en un HTTPS punto final en tiempo real con el deploy() método integrado del objeto Model. Proporcione el nombre del tipo de EC2 instancia de Amazon en el que se va a implementar este modelo en el instance_type campo junto con el número inicial de instancias en las que se ejecutará el punto final para el initial_instance_count campo:

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 )

Ver datos capturados

Cree un objeto predictor a partir de la clase SDK Predictor de SageMaker Python. Utilizará el objeto devuelto por la clase Predictor para invocar su punto de conexión en un futuro. Proporcione el nombre de su punto de conexión (definido anteriormente como endpoint_name), junto con los objetos serializadores y deserializadores para el serializador y el deserializador, respectivamente. Para obtener información sobre los tipos de serializadores, consulte la clase Serializers en Python. SageMaker 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())

En el siguiente escenario de ejemplo de código, invocamos el punto final con los datos de validación de muestra que hemos almacenado localmente en un archivo denominado. CSV validation_with_predictions El conjunto de validación de muestras contiene etiquetas para cada entrada.

Las primeras líneas de la instrucción with abren primero el archivo del conjunto de validación, luego dividen cada fila del CSV archivo por un carácter de coma y, a continuación",", almacenan los dos objetos devueltos en una etiqueta y en variables input_cols. Para cada fila, la entrada (input_cols) se pasa al método integrado Predictor.predict() de los objetos de la variable de predicción (predictor).

Suponga que el modelo devuelve una probabilidad. Las probabilidades oscilan entre valores enteros de 0 y 1,0. Si la probabilidad devuelta por el modelo es superior al 80 % (0,8), se asigna a la predicción una etiqueta de valor entero de 1. De lo contrario, se asigna a la predicción una etiqueta de valor entero de 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!")

Dado que habilitó la captura de datos en los pasos anteriores, la carga de solicitud y respuesta, junto con algunos metadatos adicionales, se guarda en la ubicación de Amazon S3 especificada en DataCaptureConfig. La entrega de los datos de captura a Amazon S3 puede tardar un par de minutos.

Para ve la fecha de captura, enumere los archivos de captura de datos almacenados en Amazon S3. El formato de la ruta de Amazon S3 es: s3:///{endpoint-name}/{variant-name}/yyyy/mm/dd/hh/filename.jsonl.

Espere ver archivos diferentes de distintos períodos de tiempo, organizados en función de la hora en que se produjo la invocación. Ejecute lo siguiente para imprimir el contenido de un único archivo de captura:

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

Esto devolverá un archivo con formato de líneas específico SageMaker . JSON Lo siguiente es un ejemplo de respuesta tomado de un punto de conexión en tiempo real que se invocó con los datos 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"}

En el ejemplo anterior, el objeto capture_file es un tipo de lista. Indexe el primer elemento de la lista para ver una única solicitud de inferencia.

# 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))

Esto devolverá una respuesta similar a la siguiente. Los valores devueltos diferirán en función de la configuración del punto final, el SageMaker modelo y los datos capturados:

{ "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" }