La inferencia de modelos de Text-to-Speech (TTS) en tiempo real, especialmente para modelos complejos como Qwen3-TTS, presenta un desafío fundamental en la computación distribuida: cómo coordinar tareas heterogéneas con diferentes perfiles de cómputo y requisitos de latencia bajo cargas de trabajo variables para garantizar una experiencia de usuario fluida. El problema se agrava por la necesidad de baja latencia de 'Time-to-First-Audio' (TTFA) y la continuidad de la reproducción sin interrupciones (underruns), mientras se maximiza el throughput y la utilización del hardware.
Tradicionalmente, los sistemas de inferencia de modelos grandes (LLMs, TTS) han optimizado el throughput mediante batching estático o han priorizado la latencia con inferencia de un solo elemento. Sin embargo, los sistemas de streaming de audio requieren un equilibrio dinámico: baja latencia inicial para el primer chunk y luego una latencia predecible para los chunks subsiguientes para evitar underruns. Este artículo aborda cómo un scheduler unificado y una gestión inteligente del estado pueden resolver este dilema, permitiendo tanto baja latencia como alta capacidad en un entorno de streaming.
La relevancia de este problema ha crecido con la proliferación de interfaces conversacionales y asistentes de voz, donde la latencia percibida es crítica para la interacción natural. La arquitectura propuesta busca resolver la tensión entre la eficiencia del batching (que favorece el throughput) y la baja latencia (que a menudo lo penaliza) mediante un scheduling consciente del estado y de la urgencia de la reproducción.
Arquitectura del Sistema
La arquitectura de inferencia de Qwen3-TTS se descompone en tres módulos principales: el Talker, que predice el primer token de codebook; el Code Predictor, que genera los 15 tokens de codebook restantes; y el Codec, que convierte los tokens de codebook en muestras de waveform. La clave de la optimización reside en tratar estos tres módulos como tareas independientemente schedulables bajo un único scheduler compartido, en contraste con las implementaciones que agrupan el Talker y el Code Predictor.
Este scheduler unificado tiene la capacidad de decidir dinámicamente qué módulo ejecutar a continuación, priorizando las tareas según su urgencia. Por ejemplo, una solicitud que aún no ha producido su primer chunk de audio recibe alta prioridad para minimizar el TTFA. Una vez que la reproducción ha comenzado, la prioridad de los chunks subsiguientes se ajusta para asegurar que lleguen antes de que se agote el buffer del cliente, pero sin producirse excesivamente pronto, lo que desperdiciaría recursos. El scheduler utiliza un enfoque de 'anclaje' donde una solicitud urgente se selecciona como ancla y el resto del batch se llena con trabajo compatible para maximizar la utilización de la GPU.
Las optimizaciones adicionales incluyen la eliminación dinámica del silencio inicial (leading silence) para reducir el TTFA percibido, y la sintonización adaptativa del tamaño de los chunks de audio: pequeños inicialmente para baja latencia y más grandes para eficiencia durante la reproducción sostenida. Para el Code Predictor, se explota su estructura regular (15 pasos fijos por frame) para preasignar la KV cache y capturar el bucle completo de generación de frames como un único CUDA graph, utilizando un kernel de atención Triton especializado. El Codec se reconstruye para usar una caché de estado, evitando el reprocesamiento de la historia completa de frames en cada actualización y permitiendo el decodificado incremental. Finalmente, se utilizan CUDA graphs para tamaños de batch predefinidos y se minimiza la sincronización CPU-GPU para reducir la sobrecarga.
Flujo de Inferencia de TTS con Scheduler Unificado
- 1 Solicitud HTTP Cliente envía texto completo en una solicitud HTTP
- 2 Scheduler Unificado Recibe solicitud, evalúa urgencia (TTFA vs. continuidad)
- 3 Talker (GPU) Prioriza si es primera inferencia, genera primer token de codebook
- 4 Code Predictor (GPU) Genera 15 tokens de codebook restantes, usa KV cache preasignada
- 5 Codec (GPU) Convierte tokens en waveform, usa caché de estado incremental
- 6 Trim de Silencio Detecta y elimina silencio inicial dinámicamente
- 7 Streaming de Audio Envía chunks de audio al cliente (pequeños iniciales, grandes subsiguientes)
- 8 Evaluación de Continuidad Scheduler ajusta prioridad para evitar underruns en el cliente
| Capa | Tecnología | Justificación |
|---|---|---|
| compute | NVIDIA H100 SXM | Hardware de aceleración principal para la inferencia del modelo TTS. |
| compute | Qwen3-TTS CustomVoice 1.7B | Modelo de Text-to-Speech base para la inferencia. |
| orchestration | Custom Scheduler | Coordina la ejecución de los módulos Talker, Code Predictor y Codec, priorizando dinámicamente las tareas para optimizar TTFA y continuidad. vs vLLM-Omni, SGLang-Omni, VoxServe, M* Priorización de solicitudes 'no-first-audio' vs. 'playback-deadline-approaching'. |
| compute | CUDA Graphs | Captura y reutiliza secuencias de operaciones GPU para reducir el overhead del host y la latencia en el Code Predictor y otros módulos. Captura para un conjunto predefinido de tamaños de batch. |
| compute | Triton attention kernel | Kernel de atención especializado para el Code Predictor, optimizado para contextos cortos y acotados. |
| cache | KV cache (Key-Value cache) | Preasignada para el Code Predictor para almacenar estados intermedios y acelerar la generación de tokens. |
| cache | State-cache-based Codec | Almacena el contexto del Transformer y el estado convolucional del Codec para permitir el decodificado incremental y evitar el reprocesamiento de frames antiguos. Decodificación completa para el primer audio, incremental para los subsiguientes. |
Trade-offs
Ganancias
- ▲▲ p95 TTFA
- ▲▲ Costo por millón de caracteres
- ▲ Capacidad (RPS)
- ▲ Cero underruns
Costes
- ▲ Complejidad del scheduler
- △ Overhead de inicialización de caché de estado (para el primer chunk)
Fundamentos Teóricos
El problema de la programación de tareas heterogéneas con restricciones de tiempo real en sistemas distribuidos ha sido un tema central en la investigación de sistemas operativos y computación de alto rendimiento. La idea de un scheduler unificado que coordina múltiples etapas de un pipeline de procesamiento, ajustando dinámicamente las prioridades, se alinea con los principios de los sistemas operativos de tiempo real y los schedulers de tareas en entornos de computación paralela. Conceptos como la 'urgencia' basada en deadlines de reproducción recuerdan a los algoritmos de scheduling de Earliest Deadline First (EDF) o Rate Monotonic Scheduling (RMS), aunque aplicados a un contexto de inferencia de ML.
La optimización del Code Predictor mediante la preasignación de KV cache y la captura de CUDA graphs para bucles fijos se relaciona con técnicas de optimización de compiladores y runtimes para GPUs, buscando reducir el overhead del host y maximizar la eficiencia del kernel. La gestión de estado incremental en el Codec, para evitar el reprocesamiento de datos ya calculados, es un patrón común en la computación incremental y la programación reactiva, donde se busca minimizar el trabajo redundante. Aunque el artículo no cita directamente papers académicos específicos para su scheduler, la inspiración de M* (mencionado como arXiv) sugiere una base en la investigación contemporánea sobre sistemas de inferencia de LLM de baja latencia, que a menudo se basan en principios de scheduling y gestión de recursos desarrollados en la academia.