En cargas de trabajo de inference de larga duración, como AIGC o procesamiento de video, el uso de inference síncrono puede provocar tiempos de espera en la conexión y una distribución desigual de la carga entre réplicas. El inference asíncrono de PAI permite enviar solicitudes y recuperar resultados mediante suscripción o sondeo.
Contexto
Funciones
-
Inference asíncrono
El inference en línea de baja latencia suele utilizar inference síncrono: el cliente envía una solicitud y espera el resultado en la misma conexión.
Cuando los tiempos de inference son largos o impredecibles, la espera síncrona puede causar caídas en las conexiones HTTP y tiempos de espera en el cliente. Con el inference asíncrono, el cliente envía una solicitud y recupera el resultado posteriormente mediante sondeo o suscripción a notificaciones.
-
Servicio de cola
Los escenarios casi en tiempo real, como el procesamiento de videos cortos, el análisis de transmisiones de audio y video o el procesamiento intensivo de imágenes, deben devolver resultados dentro de un plazo específico. Estos escenarios enfrentan los siguientes desafíos:
El algoritmo de balanceo de carga round-robin no es adecuado. Las solicitudes deben distribuirse según la carga real de cada réplica.
Si una réplica falla, sus tareas inconclusas deben reasignarse a otras réplicas sanas para su procesamiento.
PAI proporciona un framework de servicio de cola para resolver estos problemas de distribución de solicitudes.
Funcionamiento
Un servicio de inference asíncrono contiene dos sub-servicios: un sub-servicio de inference y un sub-servicio de cola. El sub-servicio de cola tiene dos colas integradas: una cola de entrada y una cola sink. Las solicitudes llegan primero a la cola de entrada. Cada réplica del sub-servicio de inference se suscribe a la cola de entrada, procesa las solicitudes y escribe las respuestas en la cola sink.
-
Cuando la cola sink está llena, el framework del servicio deja de consumir datos de la cola de entrada para evitar resultados no entregables.
Si escribe los resultados del inference directamente en OSS o en su propio middleware de mensajería, devuelva una respuesta vacía desde la interfaz de inference HTTP. En este caso, la cola sink se ignora.
-
El sub-servicio de cola recibe las solicitudes del cliente y las distribuye a las réplicas de inference según la capacidad de concurrencia. Cada réplica se suscribe a una ventana de solicitudes, lo que evita la sobrecarga y garantiza que todos los datos se devuelvan eventualmente al cliente.
NotaPor ejemplo, si cada réplica puede procesar cinco transmisiones de audio, establezca el tamaño de la ventana en 5. Cuando una réplica termina una transmisión y confirma el resultado, el sub-servicio de cola envía una nueva transmisión. Esto limita cada réplica a cinco transmisiones simultáneas.
El sub-servicio de cola monitorea las conexiones de las réplicas. Si una réplica falla, sus solicitudes no procesadas se redistribuyen a las réplicas sanas, lo que garantiza que no se pierdan datos.
Creación de un servicio de inference asíncrono
Al crear un servicio de inference asíncrono, se genera automáticamente un grupo de servicios con el mismo nombre que incluye un sub-servicio de cola. El sub-servicio de cola tiene una configuración predeterminada de una réplica (1 núcleo, 4 GB de memoria) y escala hasta dos réplicas junto con el sub-servicio de inference. Para personalizar esta configuración, ajuste los Queue sub-service parameters.
EAS admite dos métodos de despliegue para el inference asíncrono:
Despliegue mediante la consola
-
Vaya a la página Custom Deployment y configure los siguientes parámetros clave. Los demás parámetros se describen en Custom Deployment.
Deployment Method: Seleccione Image-based Deployment o Processor-based Deployment y active la casilla Asynchronous Queue.
Una vez configurados los parámetros, haga clic en Deploy.
Despliegue mediante el cliente eascmd
-
Prepare el archivo de configuración del servicio llamado service.json.
-
Utilice un despliegue basado en modelo y procesador.
{ "processor": "pmml", "model_path": "http://example.oss-cn-shanghai.aliyuncs.com/models/lr.pmml", "metadata": { "name": "pmmlasync", "type": "Async", "cpu": 4, "instance": 1, "memory": 8000 } }Los parámetros clave se describen a continuación. Otros parámetros se tratan en JSON-based deployment.
type: Establezca este parámetro en
Asyncpara crear un servicio de inference asíncrono.model_path: Reemplace el valor con la ruta de su modelo.
-
Utilice un despliegue basado en imagen.
{ "metadata": { "name": "image_async", "instance": 1, "rpc.worker_threads": 4, "type": "Async" }, "cloud": { "computing": { "instance_type": "ecs.gn6i-c16g1.4xlarge" } }, "queue": { "cpu": 1, "min_replica": 1, "memory": 4000, "resource": "" }, "containers": [ { "image": "eas-registry-vpc.cn-beijing.cr.aliyuncs.com/pai-eas/chat-llm-webui:3.0.1", "script": "python webui/webui_server.py --port=8000 --model-path=Qwen/Qwen-7B-Chat", "port": 8000 } ] }Los parámetros clave se describen a continuación. Otros parámetros se tratan en JSON-based deployment.
type: Establezca este parámetro en Async para crear un servicio de inference asíncrono.
instance: Número de réplicas para el sub-servicio de inference. Este valor no incluye las réplicas del sub-servicio de cola.
-
rpc.worker_threads: Número de hilos para el framework de servicios de EAS, que equivale al tamaño de la ventana de suscripción. El sub-servicio de cola envía como máximo esta cantidad de mensajes simultáneamente y espera los resultados antes de enviar más.
Por ejemplo, para un servicio de transmisión de video donde cada réplica maneja dos transmisiones a la vez, establezca este valor en 2. El sub-servicio de cola enviará como máximo dos URL de transmisiones de video y solo mandará una nueva después de recibir un resultado.
-
-
Cree el servicio.
Después de iniciar sesión en el cliente eascmd (Download and authenticate the client), ejecute el comando create:
eascmd create service.json
Acceso a un servicio de inference asíncrono
El sistema crea un grupo de servicios con el mismo nombre. Dado que el sub-servicio de cola gestiona el tráfico entrante, acceda a él directamente a través de los siguientes endpoints. Access a queue service.
|
Tipo de endpoint |
Formato |
Ejemplo |
|
Endpoint de cola de entrada |
|
|
|
Endpoint de cola sink |
|
|
Gestión de un servicio de inference asíncrono
Gestione un servicio de inference asíncrono igual que un servicio normal. El sistema administra los sub-servicios automáticamente: al eliminar el servicio se quitan ambos sub-servicios, y al actualizar el sub-servicio de inference, el sub-servicio de cola permanece sin cambios.
Incluso con una sola réplica configurada, la lista de instancias muestra una instancia adicional correspondiente al sub-servicio de cola.
El conteo de réplicas se refiere a las réplicas del sub-servicio de inference. Las réplicas del sub-servicio de cola escalan automáticamente. Por ejemplo, si escala las réplicas de inference a 3, las réplicas de la cola aumentarán a 2.
Reglas de escalado de réplicas:
Cuando el servicio se detiene, ambos sub-servicios escalan a 0 réplicas.
Con una réplica de inference, el sub-servicio de cola también tiene una réplica (a menos que se configure de otra manera).
Con dos o más réplicas de inference, el sub-servicio de cola mantiene dos réplicas (a menos que se configure de otra manera).
Si el escalado automático permite un mínimo de 0 réplicas, el sub-servicio de cola conserva una réplica en espera cuando las réplicas de inference escalan a 0.
Parámetros del sub-servicio de cola
El sub-servicio de cola funciona con la configuración predeterminada en la mayoría de los casos. Personalícelo en el campo queue de nivel superior del archivo JSON:
{
"queue": {
"sink": {
"memory_ratio": 0.3
},
"source": {
"auto_evict": true,
}
}
Las siguientes secciones describen las opciones de configuración.
Recursos del sub-servicio de cola
De forma predeterminada, los recursos del sub-servicio de cola se heredan de metadata. Configúrelos por separado si es necesario.
-
Declare el resource group para el sub-servicio de cola mediante queue.resource.
{ "queue": { "resource": "eas-r-slzkbq4tw0p6xd****" // By default, it uses the resource group of the inference sub-service. } }El valor predeterminado es el resource group del sub-servicio de inference.
-
Para desplegar el sub-servicio de cola en un resource group público, establezca resource como una cadena vacía (
""). Esto resulta útil cuando su resource group dedicado carece de CPU o memoria.NotaSiempre que sea posible, despliegue el sub-servicio de cola en un resource group público.
-
Declare la CPU (en núcleos) y la memoria (en MB) para cada réplica del sub-servicio de cola mediante queue.cpu y queue.memory.
{ "queue": { "cpu": 2, // Default: 1. "memory": 8000 // Default: 4000. } }La configuración predeterminada (1 núcleo de CPU, 4 GB de memoria) es suficiente para la mayoría de los escenarios.
ImportantePara más de 200 suscriptores (réplicas del sub-servicio de inference), configure 2 o más núcleos de CPU.
No reduzca la memoria del sub-servicio de cola en entornos de producción.
-
Configure el número mínimo de réplicas para el sub-servicio de cola mediante queue.min_replica.
{ "queue": { "min_replica": 3 // Default: 1. } }Las réplicas del sub-servicio de cola escalan automáticamente junto con las réplicas de inference en estado running. El rango predeterminado es
[1, min{2, the number of inference sub-service replicas}]. Si el escalado automático permite reducir a 0, se conserva una réplica de cola. Utilice queue.min_replica para ajustar este mínimo.NotaTener más réplicas de cola mejora la disponibilidad, no el rendimiento.
Funciones del sub-servicio de cola
El sub-servicio de cola admite las siguientes configuraciones de funciones.
-
Configure la expulsión automática de datos para las colas sink y de entrada mediante queue.sink.auto_evict o queue.source.auto_evict, respectivamente.
{ "queue": { "sink": { "auto_evict": true // Enables automatic eviction for the sink queue. Default: false. }, "source": { "auto_evict": true // Enables automatic eviction for the input queue. Default: false. } } }La expulsión automática está deshabilitada de forma predeterminada; una cola llena rechaza nuevos datos. Habilite la expulsión para descartar los datos más antiguos y liberar espacio para nuevas entradas.
-
Configure el número máximo de intentos de entrega mediante queue.max_delivery.
{ "queue": { "max_delivery": 10 // The maximum number of delivery attempts is 10. Default: 5. If set to 0, this feature is disabled, and data can be delivered an unlimited number of times. } }Cuando los intentos de entrega superan el umbral, el mensaje se marca como mensaje muerto. Dead-letter policy.
-
Configure el tiempo máximo de procesamiento para un mensaje mediante queue.max_idle.
{ "queue": { "max_idle": "1m" // Configures the maximum processing time for a single message to 1 minute. If this time is exceeded, the message is delivered to another subscriber, and the delivery count is incremented. The default value is 0, which means no maximum processing time. } }Unidades de tiempo compatibles:
h(hora),m(minuto) ys(segundo). Si el procesamiento excede la duración configurada:Si no se supera el umbral de
queue.max_delivery, el mensaje se reenvía a otros suscriptores.Si se supera el umbral de
queue.max_delivery, se aplica la política de mensajes muertos.
-
Configure la política de mensajes muertos mediante queue.dead_message_policy.
{ "queue": { "dead_message_policy": "Rear" // The value can be Rear (default) or Drop. Rear moves the message to the end of the queue. Drop deletes the message. } }
Longitud de cola o tamaño máximo de carga útil
La memoria de la réplica de cola es fija: aumentar el tamaño máximo de carga útil por mensaje reduce la longitud máxima de la cola.
Con la configuración predeterminada (4 GB de memoria, 8 KB de carga útil máxima), cada cola almacena hasta 230,399 mensajes. Para almacenar más, aumente la memoria. El sistema reserva el 10% de la memoria total.
No se pueden configurar simultáneamente la longitud máxima y el tamaño máximo de carga útil para la misma cola.
-
Configure la longitud máxima de las colas sink y de entrada mediante queue.sink.max_length o queue.source.max_length, respectivamente.
{ "queue": { "sink": { "max_length": 8000 // Configures the maximum length of the sink queue to 8,000 messages. }, "source": { "max_length": 2000 // Configures the maximum length of the input queue to 2,000 messages. } } } -
Configure el tamaño máximo de carga útil por mensaje para las colas sink y de entrada mediante queue.sink.max_payload_size_kb o queue.source.max_payload_size_kb, respectivamente.
{ "queue": { "sink": { "max_payload_size_kb": 10 // Configures the maximum payload size per message for the sink queue to 10 KB. Default: 8 KB. }, "source": { "max_payload_size_kb": 1024 // Configures the maximum payload size per message for the input queue to 1024 KB (1 MB). Default: 8 KB. } } }
Proporción de asignación de memoria
-
Ajuste la asignación de memoria entre las colas de entrada y sink mediante queue.sink.memory_ratio.
{ "queue": { "sink": { "memory_ratio": 0.9 // Configures the memory ratio for the sink queue. Default: 0.5. } } }NotaDe forma predeterminada, las colas de entrada y sink comparten la memoria por igual. Aumente
queue.sink.memory_ratiosi la cola sink necesita más espacio (por ejemplo, entrada de texto y salida de imagen), o disminúyalo en el caso contrario.
Escalado automático horizontal
Funcionamiento
El sistema escala dinámicamente las réplicas de inference según el estado de la cola, incluida la reducción a cero cuando la cola está vacía. El siguiente diagrama ilustra el mecanismo.
Procedimiento
En la lista de servicios, haga clic en el nombre del servicio objetivo.
Vaya a la pestaña Auto Scaling. En la sección Auto Scaling, haga clic en Enable Auto Scaling.
-
En el cuadro de diálogo Auto Scaling Settings, configure los parámetros.
-
Configuración básica:
Parámetro
Descripción
Ejemplo
Minimum Replicas
Número mínimo de réplicas para operaciones de reducción. Valor mínimo: 0.
0
Maximum Replicas
Número máximo de réplicas para operaciones de expansión. Valor máximo: 1000.
10
General Scaling Metrics
Métricas de rendimiento integradas que se utilizan para activar el escalado.
Asynchronous Queue Length representa el promedio de tareas en cola por réplica.
Seleccione Asynchronous Queue Length y establezca el umbral en 10.
-
Configuración avanzada:
Parámetro
Descripción
Ejemplo
Scale-out Starts in
Ventana de observación para decisiones de expansión. Después de activarse la expansión, el sistema observa las métricas durante este periodo. Si los valores de las métricas caen por debajo del umbral, la expansión se cancela. Unidad: segundos.
El valor predeterminado es
0segundos, lo que significa que la expansión se realiza de inmediato.0
Scale-in Starts in
Ventana de observación para decisiones de reducción; es el parámetro clave para evitar inestabilidad en el servicio. La reducción ocurre solo después de que las métricas permanecen por debajo del umbral durante toda esta duración. Unidad: segundos.
Valor predeterminado:
300segundos. Esto protege contra eventos frecuentes de reducción debido a fluctuaciones de tráfico. No establezca un valor demasiado bajo para mantener la estabilidad del servicio.300
Scale-in to 0 Instance Starts in
Cuando Minimum Replicas es
0, este parámetro define el tiempo de espera antes de que el conteo de réplicas se reduzca a0.600
Scale-from-Zero Replica Count
Número de réplicas que se agregan cuando el servicio escala desde
0réplicas.1
Los detalles completos de los parámetros y el uso de eascmd se encuentran en Horizontal auto scaling.
-