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.
Código de inferencia personalizado con los servicios de alojamiento
En esta sección se explica cómo Amazon SageMaker AI interactúa con un contenedor de Docker que ejecuta su propio código de inferencia para los servicios de alojamiento. Utilice esta información para escribir el código de inferencia y crear una imagen de Docker.
Temas
Cómo ejecuta la SageMaker IA su imagen de inferencia
Para configurar un contenedor para que se inicie como un archivo ejecutable, utilice una instrucción ENTRYPOINT en un Dockerfile. Tenga en cuenta lo siguiente:
-
Para la inferencia de modelos, la SageMaker IA ejecuta el contenedor de la siguiente manera:
docker runimageserveSageMaker La IA anula
CMDlas sentencias predeterminadas de un contenedor especificando elserveargumento después del nombre de la imagen. El argumentoserveanula los argumentos que proporciona con el comandoCMDen el Dockerfile. -
SageMaker La IA espera que todos los contenedores se ejecuten con usuarios root. Cree su contenedor de modo que solo utilice usuarios raíz. Cuando la SageMaker IA ejecuta tu contenedor, los usuarios que no tienen acceso desde la raíz pueden provocar problemas de permisos.
-
Le recomendamos que utilice la forma
execde la instrucciónENTRYPOINT:ENTRYPOINT ["executable", "param1", "param2"]Por ejemplo:
ENTRYPOINT ["python", "k_means_inference.py"]La forma
execde la instrucciónENTRYPOINTinicia el archivo ejecutable directamente, no como un elemento secundario de/bin/sh. Esto le permite recibir señales comoSIGTERMySIGKILLdesde las operaciones de la SageMaker API, lo cual es un requisito.Por ejemplo, cuando utilizas la
CreateEndpointAPI para crear un punto final, la SageMaker IA proporciona el número de instancias de procesamiento de aprendizaje automático que requiere la configuración del punto final, que especificas en la solicitud. SageMaker La IA ejecuta el contenedor de Docker en esas instancias.Si reduces el número de instancias que respaldan el punto final (mediante una llamada a la
UpdateEndpointWeightsAndCapacitiesAPI), la SageMaker IA ejecuta un comando para detener el contenedor de Docker en las instancias que se van a terminar. El comando envía la señalSIGTERMy, a continuación, envía la señalSIGKILL30 segundos más tarde.Si actualizas el punto final (mediante una llamada a la
UpdateEndpointAPI), la SageMaker IA lanza otro conjunto de instancias informáticas de aprendizaje automático y ejecuta los contenedores de Docker que contienen tu código de inferencia. A continuación se ejecuta un comando para detener los contenedores de Docker anteriores. Para detener un contenedor de Docker, el comando envía la señalSIGTERMy, a continuación, envía la señalSIGKILL30 segundos más tarde. -
SageMaker AI usa la definición de contenedor que proporcionaste en tu
CreateModelsolicitud para establecer las variables de entorno y el nombre de host DNS del contenedor de la siguiente manera:-
Establece las variables de entorno mediante el
ContainerDefinition.Environmentstring-to-string mapa. -
Establece el nombre de host de DNS mediante
ContainerDefinition.ContainerHostname.
-
-
Si tiene previsto utilizar los dispositivos GPU para inferencias de modelos (especificando instancias de computación de ML basadas en GPU en su solicitud
CreateEndpointConfig), asegúrese de que los contenedores son compatibles connvidia-docker. No cree un paquete con controladores de NVIDIA con la imagen. Para obtener más información sobrenvidia-docker, consulte NVIDIA/nvidia-docker. -
No puedes usar el
tiniinicializador como punto de entrada en los contenedores de SageMaker IA porque los argumentostrainyservelo confunden.
Cómo carga la SageMaker IA los artefactos de tus modelos
En su solicitud de CreateModelAPI, puede utilizar el S3DataSource parámetro ModelDataUrl o para identificar la ubicación S3 en la que se almacenan los artefactos del modelo. SageMaker La IA copia los artefactos del modelo de la ubicación de S3 al /opt/ml/model directorio para utilizarlos en el código de inferencia. Su contenedor tiene acceso de solo lectura a /opt/ml/model. No escriba en este directorio.
La ModelDataUrl debe apuntar a un archivo tar.gz. De lo contrario, SageMaker AI no descargará el archivo.
Si ha entrenado su modelo en SageMaker IA, los artefactos del modelo se guardan como un único archivo tar comprimido en Amazon S3. Si ha entrenado su modelo fuera de la SageMaker IA, debe crear este único archivo tar comprimido y guardarlo en una ubicación S3. SageMaker AI descomprime este archivo tar en el opt/ml/model directorio/antes de que se inicie el contenedor.
Para implementar modelos de gran tamaño, recomendamos que siga Implementación de modelos sin comprimir.
Cómo debe responder su contenedor a las solicitudes de inferencia
Para obtener inferencias, la aplicación cliente envía una solicitud POST al punto final de la SageMaker IA. SageMaker La IA pasa la solicitud al contenedor y devuelve el resultado de la inferencia del contenedor al cliente.
Para obtener más información sobre las solicitudes de inferencia que recibirá su contenedor, consulte las siguientes acciones en la referencia de la API de Amazon SageMaker AI:
Requisitos para los contenedores de inferencia
Para responder a las solicitudes de inferencia, su contenedor debe cumplir los siguientes requisitos:
-
SageMaker La IA elimina todos los
POSTencabezados excepto los compatibles con.InvokeEndpointSageMaker La IA podría añadir encabezados adicionales. Los contenedores de inferencia deben poder ignorar de forma segura estos encabezados adicionales. -
Para recibir solicitudes de inferencia, el contenedor debe tener un servidor web que realice la escucha en el puerto 8080 y debe aceptar las solicitudes
POSTen los punto de conexión/invocationsy/ping. -
Los contenedores de modelo de un cliente deben aceptar las solicitudes de conexión del socket en un plazo de 250 ms.
-
Los contenedores de modelos de un cliente deben responder a las solicitudes en un plazo de 60 segundos. El propio modelo puede tardar un tiempo máximo de procesamiento de 60 segundos antes de responder a las
/invocations. Si el modelo tiene un tiempo de procesamiento de entre 50 y 60 segundos, deberá establecer el tiempo de espera del conector del SDK en 70 segundos. -
El contenedor modelo de un cliente que admita la transmisión bidireccional debe:
-
admite WebSockets conexiones en el puerto 8080 a/de forma invocations-bidirectional-stream predeterminada.
-
tienen un servidor web que escucha en el puerto 8080 y deben aceptar las solicitudes POST a los puntos finales /ping.
-
Además de las comprobaciones de estado del contenedor a través de HTTP, el contenedor debe responder con Pong Frame per (RFC6455
), si se envía WebSocket Ping Frame.
-
ejemplo funciones de invocación
En los siguientes ejemplos se muestra cómo el código del contenedor puede procesar las solicitudes de inferencia. Estos ejemplos gestionan las solicitudes que las aplicaciones cliente envían mediante la InvokeEndpoint acción.
ejemplo funciones de invocación para solicitudes de streaming
En los siguientes ejemplos se muestra cómo el código del contenedor de inferencia puede procesar las solicitudes de streaming. Estos ejemplos gestionan las solicitudes que las aplicaciones cliente envían mediante la InvokeEndpointWithResponseStream acción.
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.
ejemplo Ejemplos de funciones de invocación para la transmisión bidireccional
Los siguientes ejemplos muestran cómo el código de su contenedor puede procesar las solicitudes y respuestas de inferencia de streaming. Estos ejemplos gestionan las solicitudes de streaming que las aplicaciones cliente envían mediante la InvokeEndpointWithBidirectionalStream acción.
Un contenedor con capacidad de transmisión bidireccional gestiona las solicitudes de inferencia de transmisión en las que las piezas se generan de forma incremental en el cliente y se transmiten al contenedor. Devuelve la inferencia del modelo al cliente como una serie de partes a medida que el modelo las genera. Las aplicaciones cliente comienzan a recibir respuestas inmediatamente cuando están disponibles. No necesitan esperar a que la solicitud se genere por completo en el cliente ni a que el modelo genere la respuesta completa. Puedes implementar la transmisión bidireccional para ofrecer experiencias interactivas rápidas, como chatbots, asistentes de voz interactivos con inteligencia artificial y traducciones en tiempo real, para disfrutar de una experiencia más en tiempo real.
Cómo debe responder su contenedor a las solicitudes de comprobación de estado (ping)
SageMaker La IA lanza nuevos contenedores de inferencia en las siguientes situaciones:
-
Responder a las llamadas a la API
CreateEndpoint,UpdateEndpointyUpdateEndpointWeightsAndCapacities -
Creación de parches de seguridad
-
Reemplazo de instancias con estado incorrecto
Poco después del inicio del contenedor, la SageMaker IA comienza a enviar solicitudes GET periódicas al /ping punto final.
El requisito más sencillo en el contenedor es responder con un código de estado HTTP 200 y un cuerpo vacío. Esto le indica a SageMaker AI que el contenedor está listo para aceptar solicitudes de inferencia en el /invocations punto final.
Si el contenedor no comienza a superar las comprobaciones de estado y responde de forma constante durante 200 segundos durante los 8 minutos posteriores al inicio, no se inicia la nueva instancia. Esto provoca un error de CreateEndpoint y el punto de conexión quedará en un estado de error. No se ha completado la actualización solicitada por UpdateEndpoint, no se han aplicado los parches de seguridad y no se han reemplazado las instancias en mal estado.
Puesto que la barrera mínima es que el contenedor devuelva un código 200 estático, un desarrollador del contenedor puede usar esta funcionalidad para realizar más comprobaciones. El tiempo de espera de la solicitud en los intentos de /ping es de 2 segundos.
Además, un contenedor que sea capaz de gestionar solicitudes de streaming bidireccionales debe responder con una Ping Frame (según el WebSocket protocolo RFC6455
Container Contract to Support Bidirectional Streaming Capabilities
Si desea alojar su contenedor modelo como terminal de SageMaker IA que admita capacidades de transmisión bidireccional, el contenedor modelo debe ser compatible con el siguiente contrato:
1. Etiqueta Docker bidireccional
El contenedor modelo debe tener una etiqueta Docker que indique a la plataforma de SageMaker IA que este contenedor admite la capacidad de transmisión bidireccional.
com.amazonaws.sagemaker.capabilities.bidirectional-streaming=true
2. Support WebSocket Connection para invocaciones
El contenedor modelo de un cliente que admite la transmisión bidireccional debe admitir WebSockets las conexiones en el puerto 8080 de forma predeterminada. /invocations-bidirectional-stream
Esta ruta se puede anular pasando el encabezado X-Amzn-SageMaker-Model -Invocation-Path al invocar la API. InvokeEndpointWithBidirectionalStream Además, los usuarios pueden especificar una cadena de consulta para añadirla a esta ruta pasando el encabezado -Query-String al invocar la API. X-Amzn-SageMaker-Model InvokeEndpointWithBidirectionalStream
3. Gestión del flujo de solicitudes
<Blob>Las cargas útiles de entrada de la InvokeEndpointWithBidirectionalStream API se transmiten como una serie de PayloadParts, que es solo un contenedor de un fragmento binario («Bytes»:):
{ "PayloadPart": { "Bytes": <Blob>, "DataType": <String: UTF8 | BINARY>, "CompletionState": <String: PARTIAL | COMPLETE> "P": <String> } }
3.1. Marcos de datos
SageMaker La IA pasa la entrada PayloadParts al contenedor del modelo como marcos de WebSocket datos (RFC6455-Section-5.6
-
SageMaker La IA no inspecciona el fragmento binario.
-
Al recibir una entrada PayloadPart
-
SageMaker La IA crea exactamente un marco de WebSocket datos a partir del
PayloadPart.Bytescual lo pasa al contenedor modelo. -
Si
PayloadPart.DataType = UTF8, SageMaker AI crea un marco de datos de texto -
Si
PayloadPart.DataTypeno lo presentaPayloadPart.DataType = BINARY, la SageMaker IA crea un marco de datos binario
-
-
Para una secuencia de PayloadParts con y terminada PayloadPart con
PayloadPart.CompletionState = COMPLETEun signoPayloadPart.CompletionState = PARTIAL, la SageMaker IA la traduce en un mensaje WebSocket fragmentado RFC6455-Sección 5.4: Fragmentación:-
La inicial PayloadPart con se
PayloadPart.CompletionState = PARTIALtraducirá a un marco de WebSocket datos, con el bit FIN libre. -
El siguiente PayloadParts con se
PayloadPart.CompletionState = PARTIALtraducirá a marcos de WebSocket continuación con el bit FIN limpio. -
El ancho final PayloadPart se
PayloadPart.CompletionState = COMPLETEtraducirá a un marco de WebSocket continuación con el conjunto de bits FIN.
-
-
SageMaker La IA no codifica ni decodifica el fragmento binario de la entrada PayloadPart, sino que los bytes se pasan al contenedor del modelo tal cual.
-
SageMaker La IA no combina varias entradas en una sola. PayloadParts BinaryDataFrame
-
SageMaker La IA no divide una entrada PayloadPart en varias BinaryDataFrames.
Ejemplo: flujo de mensajes fragmentado
Client sends: PayloadPart 1: {Bytes: "Hello ", DataType: "UTF8", CompletionState: "PARTIAL"} PayloadPart 2: {Bytes: "World", DataType: "UTF8", CompletionState: "COMPLETE"} Container receives: Frame 1: Text Data Frame with "Hello " (FIN=0) Frame 2: Continuation Frame with "World" (FIN=1)
3.2. Marcos de control
Además de los marcos de datos, la SageMaker IA también envía marcos de control al contenedor de modelos (RFC6455-Section-5.5
-
Cerrar marco: la SageMaker IA puede enviar un marco cerrado (RFC6455-Section-5.5.1
) al contenedor modelo en caso de que la conexión se cierre por cualquier motivo. -
Ping Frame: la SageMaker IA envía Ping Frame (RFC6455-Section-5.5.2
) una vez cada 60 segundos, el contenedor modelo debe responder con Pong Frame. Si no se recibe ningún Pong Frame (RFC6455-Sección-5.5.3 ) durante 5 pings consecutivos, la IA cerrará la conexión. SageMaker -
Pong Frame: la SageMaker IA responderá a los Ping Frames desde un contenedor modelo con Pong Frames.
4. Manejo del flujo de respuesta
La salida se transmite como una serie de PayloadParts, ModelStreamErrors o InternalStreamFailures.
{ "PayloadPart": { "Bytes": <Blob>, "DataType": <String: UTF8 | BINARY>, "CompletionState": <String: PARTIAL | COMPLETE>, }, "ModelStreamError": { "ErrorCode": <String>, "Message": <String> }, "InternalStreamFailure": { "Message": <String> } }
4.1. Marcos de datos
SageMaker La IA convierte los marcos de datos recibidos del contenedor del modelo en resultados PayloadParts:
-
Al recibir un marco de datos de WebSocket texto del contenedor del modelo, la SageMaker IA obtiene los bytes sin procesar del marco de datos de texto y los agrupa en una respuesta PayloadPart, mientras está configurada
PayloadPart.DataType = UTF8. -
Al recibir un marco de datos WebSocket binario del contenedor del modelo, la SageMaker IA agrupa directamente los bytes del marco de datos en una respuesta PayloadPart, mientras está configurada.
PayloadPart.DataType = BINARY -
Para mensajes fragmentados, tal como se define en la RFC6455Sección -5.4:
Fragmentación: -
El marco de datos inicial con el bit FIN libre se traducirá a un ancho. PayloadPart
PayloadPart.CompletionState = PARTIAL -
Los fotogramas de continuación siguientes con el bit FIN limpio se traducirán a PayloadParts con
PayloadPart.CompletionState = PARTIAL. -
El último cuadro de continuación con el conjunto de bits FIN se traducirá a PayloadPart con
PayloadPart.CompletionState = COMPLETE.
-
-
SageMaker La IA no codifica ni decodifica los bytes recibidos de los contenedores del modelo, sino que los pasa al contenedor del modelo tal cual.
-
SageMaker La IA no combina varios marcos de datos recibidos del contenedor modelo en una sola respuesta. PayloadPart
-
SageMaker La IA no divide un marco de datos recibido del contenedor del modelo en respuestas PayloadParts múltiples.
Ejemplo: flujo de respuesta en streaming
Container sends: Frame 1: Text Data Frame with "Generating" (FIN=0) Frame 2: Continuation Frame with " response..." (FIN=1) Client receives: PayloadPart 1: {Bytes: "Generating", DataType: "UTF8", CompletionState: "PARTIAL"} PayloadPart 2: {Bytes: " response...", DataType: "UTF8", CompletionState: "COMPLETE"}
4.2. Marcos de control
SageMaker La IA responde a los siguientes marcos de control desde el contenedor del modelo:
-
Al recibir un cuadro cerrado (RFC6455-Sección-5.5.1
) del contenedor modelo, la SageMaker IA empaquetará el código de estado (RFC6455-Sección-7.4 ) y los mensajes de error y los transmitirá al usuario ModelStreamError final. -
Al recibir un Ping Frame (RFC6455-Section-5.5.2
) del contenedor modelo, la IA responderá con un Pong Frame. SageMaker -
Pong Frame (RFC6455-Sección-5.5.3
): Si no se recibe ningún Pong Frame durante 5 pings consecutivos, la IA cerrará la conexión. SageMaker