Invoque modelos para realizar inferencias 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.

Invoque modelos para realizar inferencias en tiempo real

Después de implementar el modelo mediante los servicios de SageMaker alojamiento, puede probarlo en ese punto final enviándole datos de prueba. Puede probar sus puntos de enlace con Amazon SageMaker Studio, los AWS SDK o el. AWS CLI

Invoque su terminal con Amazon Studio SageMaker

Después de implementar el modelo en un punto final, puede ver el punto final a través de Amazon SageMaker Studio y probarlo enviando solicitudes de inferencia únicas.

nota

SageMaker solo admite pruebas de puntos de enlace en Studio para puntos de enlace en tiempo real.

Para enviar una solicitud de inferencia de prueba a su punto de conexión
  1. Abre Amazon SageMaker Studio.

  2. En el panel de navegación de la izquierda, selecciona Implementaciones.

  3. En el menú desplegable, selecciona Puntos de conexión.

  4. Busque su punto de conexión por nombre y elija el nombre en la tabla. Los nombres de los puntos de conexión que aparecen en el panel Puntos de conexión se definen al implementar un modelo. El espacio de trabajo de Studio abre la página Endpoint en una pestaña nueva.

  5. Seleccione la pestaña Probar inferencia.

  6. En Opciones de prueba, seleccione una de las siguientes opciones:

    1. Seleccione Probar la solicitud de muestra para enviar inmediatamente una solicitud a su punto final. Utilice el editor JSON para proporcionar datos de muestra en formato JSON y elija Enviar solicitud para enviar la solicitud a su punto final. Tras enviar la solicitud, Studio muestra el resultado de la inferencia en una tarjeta a la derecha del editor JSON.

    2. Seleccione Usar código de ejemplo del SDK de Python para ver el código para enviar una solicitud al punto final. A continuación, copia el ejemplo de código de la sección Ejemplo de solicitud de inferencia y ejecuta el código desde tu entorno de pruebas.

La parte superior de la tarjeta muestra el tipo de solicitud que se envió al punto de conexión (solo se acepta JSON). La tarjeta muestra los campos siguientes:

  • Estado: muestra uno de los siguientes tipos de estado:

    • Success: la solicitud se ha realizado correctamente.

    • Failed: error en la solicitud. Aparece una respuesta en Motivo del error.

    • Pending: mientras la solicitud de inferencia está pendiente, el estado muestra un icono circular giratorio.

  • Duración de la ejecución: tiempo que duró la invocación (hora de finalización menos hora de inicio) en milisegundos.

  • Tiempo de solicitud: cuántos minutos han transcurrido desde que se envió la solicitud.

  • Tiempo de resultado: cuántos minutos han transcurrido desde que se envió la solicitud.

Invocar un punto de conexión mediante AWS SDK for Python (Boto3)

Después de implementar el modelo en un punto final, puede comprobarlo mediante uno de los AWS SDK, como el. AWS SDK for Python (Boto3) Para probar el punto de conexión con este SDK, utilice uno de los siguientes métodos:

  • invoke_endpoint: envía una solicitud de inferencia a un punto de conexión del modelo y devuelve la respuesta que genera el modelo. Este método devuelve la carga útil de inferencia como respuesta cuando el modelo termina de generarla. Para obtener más información, consulte invoke_endpoint en la Referencia de la API del SDK AWS para Python (Boto3).

  • invoke_endpoint_with_response_stream: envía una solicitud de inferencia a un punto de conexión del modelo y transmite en streaming la respuesta en partes incrementales mientras el modelo genera la inferencia. Con este método, la aplicación cliente comienza a recibir inmediatamente partes de la respuesta a medida que están disponibles. El cliente no necesita esperar a que el modelo genere toda la carga útil de la respuesta. Puede implementar la transmisión en streaming para que admita experiencias interactivas rápidas, como chatbots, asistentes virtuales y generadores de música.

    Utilice este método únicamente para invocar modelos que admitan streaming de inferencias.

    Cuando un contenedor gestiona una solicitud de inferencia de streaming, devuelve la inferencia del modelo como una serie de partes de forma incremental a medida que el modelo las genera. Las aplicaciones cliente comienzan a recibir respuestas inmediatamente cuando están disponibles. No necesitan esperar a que el modelo genere la respuesta completa. Puede implementar la transmisión en streaming para que admita experiencias interactivas rápidas, como chatbots, asistentes virtuales y generadores de música.

Antes de poder utilizar estos métodos en el código de su cliente, debe crear un cliente SageMaker Runtime y especificar el nombre de su punto final. En el siguiente ejemplo, se configuran el cliente y el punto de conexión para el resto de los ejemplos:

import boto3 # Create a low-level client representing Amazon SageMaker Runtime sagemaker_runtime = boto3.client( "sagemaker-runtime", region_name='aws_region') # The endpoint name must be unique within # an AWS Region in your AWS account. endpoint_name='endpoint-name'

Invocar para obtener una respuesta de inferencia

En el siguiente ejemplo se utiliza el método invoke_endpoint para invocar un punto de conexión con AWS SDK for Python (Boto3):

# Gets inference from the model hosted at the specified endpoint: response = sagemaker_runtime.invoke_endpoint( EndpointName=endpoint_name, Body=bytes('{"features": ["This is great!"]}', 'utf-8') ) # Decodes and prints the response body: print(response['Body'].read().decode('utf-8'))

En este ejemplo, se proporcionan datos de entrada en el Body campo SageMaker para pasarlos al modelo. Estos datos deben tener el mismo formato que se utilizó para el entrenamiento. El ejemplo almacena la respuesta en la variable response.

La variable response proporciona acceso al estado HTTP, al nombre del modelo implementado y a otros campos. El siguiente fragmento de código imprime HTTPStatusCode:

print(response["HTTPStatusCode"])

Invocar para transmitir una respuesta de inferencia

Si implementó un modelo que admite streaming de inferencias, puede invocar el modelo para recibir su carga útil de inferencia como un flujo de partes. El modelo entrega estas partes de forma incremental a medida que las genera. Cuando una aplicación recibe un flujo de inferencia, no necesita esperar a que el modelo genere toda la carga útil de respuesta. Por el contrario, la aplicación comienza a recibir inmediatamente partes de la respuesta a medida que están disponibles.

Al consumir un flujo de inferencia en la aplicación, puede crear interacciones en las que los usuarios perciban que la inferencia es rápida, ya que obtienen la primera parte de forma inmediata. Por ejemplo, puede crear un chatbot que muestre de forma incremental el texto generado por un modelo de lenguaje grande (LLM).

Para obtener un flujo de inferencia, puede emplear el método invoke_endpoint_with_response_stream del SDK para Python (Boto3). En el cuerpo de la respuesta, el SDK proporciona un objeto EventStream, que proporciona la inferencia en forma de una serie de objetos PayloadPart.

ejemplo Flujo de inferencia

A continuación se muestra un ejemplo de objetos PayloadPart:

{'PayloadPart': {'Bytes': b'{"outputs": [" a"]}\n'}} {'PayloadPart': {'Bytes': b'{"outputs": [" challenging"]}\n'}} {'PayloadPart': {'Bytes': b'{"outputs": [" problem"]}\n'}} . . .

En cada parte de la carga útil, el campo Bytes proporciona una parte de la respuesta de inferencia del modelo. Esta parte puede ser cualquier tipo de contenido que genere un modelo, como datos de texto, imagen o audio. En este ejemplo, las partes son objetos JSON que contienen texto generado a partir de un LLM.

La parte de carga útil suele contener un fragmento discreto de datos del modelo. En este ejemplo, los fragmentos discretos son objetos JSON completos. Algunas veces, la respuesta de streaming divide los fragmentos en varias partes de la carga útil o combina varios fragmentos en una sola parte de la carga útil. En el siguiente ejemplo se muestra un fragmento de datos en formato JSON dividido en dos partes de carga útil:

{'PayloadPart': {'Bytes': b'{"outputs": '}} {'PayloadPart': {'Bytes': b'[" problem"]}\n'}}

Cuando escriba el código de una aplicación que procesa un flujo de inferencia, incluya la lógica que gestiona estas divisiones y combinaciones ocasionales de los datos. Como estrategia, puede escribir código que concatene el contenido de Bytes mientras la aplicación recibe las partes de la carga. Al concatenar aquí los datos JSON del ejemplo, se combinan los datos en un cuerpo JSON delimitado por nuevas líneas. A continuación, el código podría procesar el flujo analizando todo el objeto JSON en cada línea.

El siguiente ejemplo muestra el JSON delimitado por nuevas líneas que crearía al concatenar el contenido del ejemplo de Bytes:

{"outputs": [" a"]} {"outputs": [" challenging"]} {"outputs": [" problem"]} . . .
ejemplo Código para procesar un flujo de inferencia

El siguiente ejemplo de clase de Python, SmrInferenceStream, demuestra cómo se puede procesar un flujo de inferencia que envía datos de texto en formato JSON:

import io import json # Example class that processes an inference stream: class SmrInferenceStream: def __init__(self, sagemaker_runtime, endpoint_name): self.sagemaker_runtime = sagemaker_runtime self.endpoint_name = endpoint_name # A buffered I/O stream to combine the payload parts: self.buff = io.BytesIO() self.read_pos = 0 def stream_inference(self, request_body): # Gets a streaming inference response # from the specified model endpoint: response = self.sagemaker_runtime\ .invoke_endpoint_with_response_stream( EndpointName=self.endpoint_name, Body=json.dumps(request_body), ContentType="application/json" ) # Gets the EventStream object returned by the SDK: event_stream = response['Body'] for event in event_stream: # Passes the contents of each payload part # to be concatenated: self._write(event['PayloadPart']['Bytes']) # Iterates over lines to parse whole JSON objects: for line in self._readlines(): resp = json.loads(line) part = resp.get("outputs")[0] # Returns parts incrementally: yield part # Writes to the buffer to concatenate the contents of the parts: def _write(self, content): self.buff.seek(0, io.SEEK_END) self.buff.write(content) # The JSON objects in buffer end with '\n'. # This method reads lines to yield a series of JSON objects: def _readlines(self): self.buff.seek(self.read_pos) for line in self.buff.readlines(): self.read_pos += len(line) yield line[:-1]

En este ejemplo se procesa el flujo de inferencia de la siguiente manera:

  • Se inicializa con un cliente SageMaker Runtime y el nombre del punto final del modelo. Para poder obtener un flujo de inferencia, el modelo que aloja el punto de conexión debe admitir streaming de inferencia.

  • En el método stream_inference de ejemplo, recibe un cuerpo de solicitud y lo pasa al método invoke_endpoint_with_response_stream del SDK.

  • Itera cada evento del objeto EventStream que devuelve el SDK.

  • De cada evento, obtiene el contenido del objeto Bytes en el objeto PayloadPart.

  • En el método _write de ejemplo, escribe en un búfer para concatenar el contenido de los objetos Bytes. El contenido combinado forma un cuerpo JSON delimitado por nuevas líneas.

  • Utiliza el método _readlines de ejemplo para obtener una serie iterable de objetos JSON.

  • En cada objeto JSON, obtiene una parte de la inferencia.

  • Con la expresión yield, devuelve las partes de forma incremental.

El siguiente ejemplo crea y utiliza un objeto SmrInferenceStream:

request_body = {"inputs": ["Large model inference is"], "parameters": {"max_new_tokens": 100, "enable_sampling": "true"}} smr_inference_stream = SmrInferenceStream( sagemaker_runtime, endpoint_name) stream = smr_inference_stream.stream_inference(request_body) for part in stream: print(part, end='')

Este ejemplo pasa un cuerpo de solicitud al método stream_inference. Itera la respuesta para imprimir cada parte que devuelve el flujo de inferencia.

En el ejemplo se da por sentado que el modelo del punto de conexión especificado es un LLM que genera texto. El resultado de este ejemplo es un cuerpo de texto generado que se imprime de forma incremental:

a challenging problem in machine learning. The goal is to . . .

Invoque su punto final mediante el AWS CLI

Puede probar su punto final ejecutando comandos con la tecla AWS Command Line Interface (AWS CLI). AWS CLI admite solicitudes de inferencia estándar con el comando invoke-endpoint y admite solicitudes de inferencia asincrónicas con el comando invoke-endpoint-async.

nota

AWS CLI No admite solicitudes de inferencia de streaming.

En el siguiente ejemplo se utiliza el comando invoke-endpoint para enviar una solicitud de inferencia a un punto de conexión del modelo:

aws sagemaker-runtime invoke-endpoint \ --endpoint-name endpoint_name \ --body fileb://$file_name \ output_file.txt

Para el parámetro --endpoint-name, proporcione el nombre que especificó para EndpointName cuando creó el punto de conexión con CreateEndpoint. Para el --body parámetro, proporcione los datos de entrada SageMaker para pasarlos al modelo. Los datos deben tener el mismo formato que se utilizó para el entrenamiento. En este ejemplo se muestra cómo enviar datos binarios a su punto de conexión.

Para obtener más información sobre cuándo usar file:// Over fileb:// al pasar el contenido de un archivo a un parámetro del AWS CLI, consulte Prácticas recomendadas para los parámetros de archivos locales.

Para obtener más información y ver parámetros adicionales que puede pasar, consulte invoke-endpoint en la Referencia de comandos de AWS CLI .

Si el comando invoke-endpoint se ejecuta correctamente, devuelve una respuesta similar a la siguiente:

{ "ContentType": "<content_type>; charset=utf-8", "InvokedProductionVariant": "<Variant>" }

Si el comando no se ejecuta correctamente, compruebe si la carga útil de entrada tiene el formato correcto.

Vea el resultado de la invocación comprobando el archivo de salida del archivo (output_file.txt en este ejemplo).

more output_file.txt