Código de inferencia personalizado con los servicios de alojamiento - Amazon SageMaker AI

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.

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 run image serve

    SageMaker La IA anula CMD las sentencias predeterminadas de un contenedor especificando el serve argumento después del nombre de la imagen. El argumento serve anula los argumentos que proporciona con el comando CMD en 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 exec de la instrucción ENTRYPOINT:

    ENTRYPOINT ["executable", "param1", "param2"]

    Por ejemplo:

    ENTRYPOINT ["python", "k_means_inference.py"]

    La forma exec de la instrucción ENTRYPOINT inicia el archivo ejecutable directamente, no como un elemento secundario de /bin/sh. Esto le permite recibir señales propias SIGTERM y SIGKILL procedentes de las SageMaker API operaciones, lo cual es un requisito.

     

    Por ejemplo, cuando se utiliza CreateEndpointAPIpara crear un punto de conexión, la SageMaker IA proporciona el número de instancias de procesamiento de aprendizaje automático que requiere la configuración del punto de conexión, que se especifica 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 (llamando al 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ñal SIGTERM y, a continuación, envía la señal SIGKILL 30 segundos más tarde.

     

    Si actualizas el punto final (mediante una llamada a UpdateEndpointAPI), la SageMaker IA lanza otro conjunto de instancias de procesamiento 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ñal SIGTERM y, a continuación, envía la señal SIGKILL 30 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 DNS nombre de host del contenedor de la siguiente manera:

     

    • Establece las variables de entorno mediante el ContainerDefinition.Environment string-to-string mapa.

    • Establece el DNS nombre de host mediante. ContainerDefinition.ContainerHostname

       

  • Si planea usar GPU dispositivos para inferencias de modelos (especificando instancias de procesamiento de aprendizaje automático GPU basadas en su CreateEndpointConfig solicitud), asegúrese de que sus contenedores sean nvidia-docker compatibles. No agrupe NVIDIA los controladores con la imagen. Para obtener más información al respectonvidia-docker, consulte NVIDIA/nvidia-docker.

     

  • No puedes usar el tini inicializador como punto de entrada en los contenedores de SageMaker IA porque los argumentos y lo confunden. train serve

Cómo carga la SageMaker IA los artefactos de tus modelos

En su CreateModelAPIsolicitud, 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 into /opt/ml/model directorio de archivos tar 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 POST solicitud 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 APIreferencia 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 POST encabezados excepto los admitidos por. InvokeEndpoint SageMaker 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 POST en los punto de conexión /invocations y /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 su modelo va a tardar entre 50 y 60 segundos de tiempo de procesamiento, el tiempo de espera del SDK socket debe configurarse en 70 segundos.

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.

FastAPI

Fast API es un marco web para construir APIs con Python.

from fastapi import FastAPI, status, Request, Response . . . app = FastAPI() . . . @app.post('/invocations') async def invocations(request: Request): # model() is a hypothetical function that gets the inference output: model_resp = await model(Request) response = Response( content=model_resp, status_code=status.HTTP_200_OK, media_type="text/plain", ) return response . . .

En este ejemplo, la invocations función gestiona la solicitud de inferencia que la SageMaker IA envía al /invocations punto final.

Flask

Flask es un marcopara desarrollar aplicaciones web con Python.

import flask . . . app = flask.Flask(__name__) . . . @app.route('/invocations', methods=["POST"]) def invoke(request): # model() is a hypothetical function that gets the inference output: resp_body = model(request) return flask.Response(resp_body, mimetype='text/plain')

En este ejemplo, la invoke función gestiona la solicitud de inferencia que la SageMaker IA envía al /invocations punto final.

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.

FastAPI

Fast API es un marco web para construir APIs con Python.

from starlette.responses import StreamingResponse from fastapi import FastAPI, status, Request . . . app = FastAPI() . . . @app.post('/invocations') async def invocations(request: Request): # Streams inference response using HTTP chunked encoding async def generate(): # model() is a hypothetical function that gets the inference output: yield await model(Request) yield "\n" response = StreamingResponse( content=generate(), status_code=status.HTTP_200_OK, media_type="text/plain", ) return response . . .

En este ejemplo, la invocations función gestiona la solicitud de inferencia que la SageMaker IA envía al /invocations punto final. Para transmitir la respuesta, el ejemplo utiliza la clase StreamingResponse del marco Starlette.

Flask

Flask es un marcopara desarrollar aplicaciones web con Python.

import flask . . . app = flask.Flask(__name__) . . . @app.route('/invocations', methods=["POST"]) def invocations(request): # Streams inference response using HTTP chunked encoding def generate(): # model() is a hypothetical function that gets the inference output: yield model(request) yield "\n" return flask.Response( flask.stream_with_context(generate()), mimetype='text/plain') . . .

En este ejemplo, la invocations función gestiona la solicitud de inferencia que la SageMaker IA envía al /invocations punto final. Para transmitir la respuesta, el ejemplo utiliza la función flask.stream_with_context del marco Flask.

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 CreateEndpoint a UpdateEndpoint y llamar UpdateEndpointWeightsAndCapacities API

  • 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 GET solicitudes periódicas al /ping punto final.

El requisito más simple del contenedor es responder con un código de estado HTTP 200 y un cuerpo vacío. Esto 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.