Capturar dados do endpoint em tempo real - SageMaker IA da Amazon

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Capturar dados do endpoint em tempo real

nota

Para evitar o impacto nas solicitações de inferência, a Captura de dados interrompe a captura de solicitações em altos níveis de uso do disco. É recomendável que você mantenha a utilização do disco abaixo de 75% para garantir que a captura de dados continue capturando as solicitações.

Para capturar dados para seu endpoint em tempo real, você deve implantar um modelo usando serviços de hospedagem de SageMaker IA. Isso exige que você crie um modelo de SageMaker IA, defina uma configuração de endpoint e crie um endpoint HTTPS.

As etapas necessárias para ativar a captura de dados são semelhantes, independentemente de você usar o SDK do Python AWS SDK for Python (Boto) ou do SageMaker Python. Se você usa o AWS SDK, defina o DataCaptureConfigdicionário, junto com os campos obrigatórios, dentro do CreateEndpointConfigmétodo para ativar a captura de dados. Se você usa o SDK do SageMaker Python, importe a DataCaptureConfigclasse e inicialize uma instância dessa classe. Em seguida, transmita esse objeto para o parâmetro DataCaptureConfig no método sagemaker.model.Model.deploy().

Para usar os trechos de código de processo, substitua o código italicized placeholder text no exemplo por suas próprias informações.

Como habilitar a captura de dados

Especifique uma configuração de captura de dados. É possível capturar a carga útil da solicitação, a carga útil da resposta ou ambas com essa configuração. O trecho de código em andamento demonstra como habilitar a captura de dados usando o SDK AI Python e AWS SDK for Python (Boto) o AI SageMaker Python.

nota

Você não precisa usar o Model Monitor para capturar cargas úteis da solicitação ou da resposta.

AWS SDK for Python (Boto)

Configure os dados que você deseja capturar com o DataCaptureConfigdicionário ao criar um endpoint usando o CreateEndpointConfig método. Defina EnableCapture como o valor booleano True. Além disso, forneça os seguintes parâmetros obrigatórios:

  • EndpointConfigName: nome da configuração do endpoint. Você usará esse nome ao fazer uma solicitação CreateEndpoint.

  • ProductionVariants: lista dos modelos que você deseja hospedar nesse endpoint. Defina um tipo de dados de dicionário para cada modelo.

  • DataCaptureConfig: tipo de dados de dicionário em que você especifica um valor inteiro que corresponde à porcentagem inicial de dados a serem amostrados (InitialSamplingPercentage), o URI do Amazon S3 em que você deseja que os dados capturados sejam armazenados e uma lista de opções de captura (CaptureOptions). Especifique uma Input ou Output para o CaptureMode dentro da lista CaptureOptions.

Opcionalmente, você pode especificar como a SageMaker IA deve codificar os dados capturados passando argumentos de pares de valores-chave para o dicionário. 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 obter mais informações sobre outras opções de configuração de endpoint, consulte a CreateEndpointConfigAPI no Guia de referência de API do Amazon SageMaker AI Service.

SageMaker Python SDK

Importe a classe DataCaptureConfig do módulo sagemaker.model_monitor. Ative a captura de dados configurando EnableCapture com o valor booleano True.

Opcionalmente, forneça argumentos para os seguintes parâmetros:

  • SamplingPercentage: valor inteiro que corresponde à porcentagem de dados da amostra. Se você não fornecer uma porcentagem de amostragem, a SageMaker IA coletará uma amostra padrão de 20 (20%) dos seus dados.

  • DestinationS3Uri: o URI do Amazon S3 que a SageMaker IA usará para armazenar dados capturados. Se você não fornecer um, a SageMaker IA armazenará os dados capturados em"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"], )

Implantar o modelo

Implante seu modelo e crie um endpoint HTTPS com DataCapture ativado.

AWS SDK para Python (Boto3)

Forneça a configuração do endpoint para a SageMaker IA. O serviço inicia as instâncias de cálculo de ML e implanta o modelo ou modelos conforme especificado na configuração.

Depois de ter seu modelo e configuração de endpoint, use a API CreateEndpoint para criar seu endpoint. O nome do endpoint deve ser exclusivo em uma AWS região da sua AWS conta.

O recurso abaixo cria um endpoint usando a configuração de endpoint especificada na solicitação. A Amazon SageMaker AI usa o endpoint para provisionar recursos e implantar 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 obter mais informações, consulte a API CreateEndpoint.

SageMaker Python SDK

Definir um nome para o endpoint. Esta etapa é opcional. Se você não fornecer um, a SageMaker IA criará um nome exclusivo para você:

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

Implante seu modelo em um endpoint HTTPS em tempo real com o método deploy() integrado do objeto do modelo. Forneça o nome do tipo de EC2 instância da Amazon na qual implantar esse modelo no instance_type campo junto com o número inicial de instâncias nas quais executar o endpoint para o 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 )

Visualizar os dados capturados

Crie um objeto preditor a partir da classe SageMaker Python SDK Predictor. Você usará o objeto retornado pela Classe Predictor para invocar seu endpoint em uma etapa futura. Forneça o nome do seu endpoint (definido anteriormente como endpoint_name), junto com os objetos serializadores e desserializadores para o serializador e o desserializador, respectivamente. Para obter informações sobre os tipos de serializadores, consulte a classe Serializers no SDK do AI SageMaker Python.

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

No cenário de exemplo de código em andamento, invocamos o endpoint com exemplos de dados de validação que armazenamos localmente em um arquivo CSV chamado validation_with_predictions. Nosso conjunto de validação de amostras contém rótulos para cada entrada.

As primeiras linhas da instrução With abrem primeiro o arquivo CSV do conjunto de validação, depois dividem cada linha dentro do arquivo pelo caractere de vírgula "," e, em seguida, armazenam os dois objetos retornados em um rótulo e variáveis input_cols. Para cada linha, a entrada (input_cols) é passada para o método Predictor.predict() integrado dos objetos da variável preditora (predictor).

Suponha que o modelo retorne uma probabilidade. As probabilidades variam entre valores inteiros de 0 e 1.0. Se a probabilidade retornada pelo modelo for maior que 80% (0,8), atribuímos à predição um rótulo de valor inteiro de 1. Caso contrário, atribuímos à predição um rótulo de valor inteiro 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!")

Como você habilitou a captura de dados nas etapas anteriores, a carga útil da solicitação e da resposta, além de alguns metadados adicionais, é salva no local do Amazon S3 especificado em DataCaptureConfig. A entrega dos dados de captura para o Amazon S3 pode exigir alguns minutos.

Visualize dados capturados listando os arquivos de captura de dados armazenados no Amazon S3. O formato do caminho do Amazon S3 é: s3:///{endpoint-name}/{variant-name}/yyyy/mm/dd/hh/filename.jsonl.

Espere ver arquivos diferentes de diferentes períodos de tempo, organizados com base na hora em que a invocação ocorreu. Execute o seguinte para imprimir o conteúdo de um único arquivo de captura:

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

Isso retornará um arquivo formatado em linha JSON específico para SageMaker IA. A seguir está um exemplo de resposta retirado de um endpoint em tempo real que invocamos usando dados 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"}

No exemplo a seguir, o objeto capture_file é um tipo de lista. Indexe o primeiro elemento da lista para visualizar uma única solicitação de inferência.

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

Essa ação retornará uma resposta semelhante à seguinte: Os valores retornados serão diferentes com base na configuração do endpoint, no modelo de SageMaker IA e nos dados 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" }