La inferencia de Large Language Models (LLMs) a escala de hyperscaler presenta un problema fundamental de optimización de recursos computacionales y memoria. Dada la naturaleza bimodal de las cargas de trabajo (procesamiento intensivo de entrada vs. generación secuencial de salida) y el tamaño masivo de los modelos, la utilización ineficiente de las costosas GPUs es un cuello de botella crítico. Este artículo aborda cómo Cloudflare, a través de Workers AI, resuelve este desafío mediante una combinación de disociación de etapas computacionales, gestión inteligente de caché distribuida y algoritmos de inferencia avanzados, buscando maximizar el throughput y minimizar la latencia en un entorno de agentes conversacionales.
El problema se agrava con los casos de uso de agentes, donde los contextos de entrada son largos y crecen con cada interacción, haciendo que la recomputación de tensores de entrada sea prohibitivamente costosa. La necesidad de soportar modelos con billones de parámetros que exceden la VRAM de una sola GPU introduce complejidades adicionales en la gestión de memoria y la comunicación inter-GPU. La solución no solo debe ser eficiente en hardware, sino también adaptable a patrones de tráfico cambiantes y a la rápida evolución de la investigación en LLMs.
Arquitectura del Sistema
La arquitectura de inferencia de Workers AI se basa en varias capas de optimización. En el nivel de hardware, se utiliza una configuración heterogénea de GPUs, adaptada a las necesidades específicas de las fases de prefill y decode. La disociación de prefill/decode (PD) es una técnica clave: las solicitudes se enrutan primero a servidores de prefill (compute-bound) que procesan los tokens de entrada y pueblan el KV cache. Luego, la solicitud se transfiere a servidores de decode (memory-bound) que generan los tokens de salida. Un balanceador de carga complejo gestiona este enrutamiento, reescribe respuestas (incluyendo streaming SSE) y facilita la transferencia del KV cache entre servidores, utilizando un balanceo de carga consciente de tokens para distribuir la carga de manera uniforme.
Para optimizar el rendimiento en casos de uso de agentes con contextos largos, se implementa un caching de prompts eficiente. Esto se logra mediante un encabezado x-session-affinity que permite enrutar solicitudes a la región donde los tensores de entrada ya han sido computados y almacenados en caché. Internamente, se utiliza un enrutamiento consciente del KV-cache. La optimización del KV-cache multi-GPU se realiza con el Mooncake Transfer Engine (que soporta RDMA como NVLink y NVMe over Fabric) y Mooncake Store de Moonshot AI. Esto permite que el KV cache se extienda más allá de la VRAM de una sola GPU, utilizando almacenamiento NVMe para prolongar la vida de las sesiones en caché y mejorar el ratio de aciertos.
La decodificación especulativa (speculative decoding) es otra técnica implementada, utilizando un modelo LLM más pequeño (draft model, como NVIDIA EAGLE-3) para generar tokens candidatos que el modelo objetivo más grande valida. Esto acelera la generación de tokens por segundo al reducir la carga computacional del modelo principal. Todas estas optimizaciones se orquestan a través de Infire, el motor de inferencia propietario de Cloudflare, escrito en Rust. Infire soporta configuraciones multi-GPU con paralelismo de pipeline y tensor, optimizando la carga y minimizando la comunicación cross-GPU, además de reducir el overhead de memoria y acelerar los tiempos de cold-start.
Flujo de Inferencia con Prefill/Decode Disociado
- 1 Cliente Envía solicitud de inferencia (prompt) al balanceador de carga.
- 2 Balanceador de Carga Enruta la solicitud al servidor de Prefill disponible.
- 3 Servidor de Prefill Procesa tokens de entrada, calcula tensores y popula el KV cache.
- 4 Servidor de Prefill Notifica al balanceador de carga y transfiere KV cache al servidor de Decode.
- 5 Balanceador de Carga Enruta la solicitud al servidor de Decode, indicando transferencia de KV cache.
- 6 Servidor de Decode Genera tokens de salida secuencialmente usando el KV cache.
- 7 Balanceador de Carga Reescribe y transmite la respuesta (incluyendo SSE) al cliente.
| Capa | Tecnología | Justificación |
|---|---|---|
| compute | NVIDIA H100/H200 GPUs | Hardware principal para la ejecución de modelos LLM, proporcionando la capacidad de procesamiento y VRAM. Configuraciones heterogéneas optimizadas para prefill (compute-bound) y decode (memory-bound). |
| data-processing | Infire (Cloudflare proprietary engine) | Motor de inferencia de LLMs escrito en Rust, optimizado para rendimiento, bajo overhead de memoria y soporte multi-GPU (pipeline/tensor parallelism). vs vLLM Soporte para modelos de billones de parámetros, optimización de comunicación cross-GPU, tiempos de cold-start < 20s. |
| cache | KV Cache | Almacena los tensores de entrada procesados (prompts) para evitar recomputaciones en interacciones subsecuentes, crucial para casos de uso de agentes. Optimizado para multi-GPU y extendido a NVMe storage. |
| networking | Mooncake Transfer Engine | Framework de transferencia de datos de alto rendimiento para compartir KV cache a través de múltiples GPUs y nodos. Soporta protocolos RDMA como NVLink y NVMe over Fabric. |
| storage | Mooncake Store | Extiende el KV cache más allá de la VRAM de la GPU, utilizando almacenamiento NVMe para prolongar la vida de las sesiones en caché. |
| orchestration | Custom Load Balancer | Gestiona el enrutamiento de solicitudes entre servidores de prefill y decode, reescribe respuestas y facilita la transferencia de KV cache. Consciente de tokens (token-aware load balancing) para distribuir la carga uniformemente. |
Trade-offs
Ganancias
- ▲ Eficiencia de utilización de GPU
- ▲ Latencia de Time to First Token (TTFT)
- ▲ Latencia inter-token
- ▲ Throughput de solicitudes
- ▲ Capacidad de manejar modelos más grandes
- ▲ Reducción de costos operativos (menos GPUs para la misma carga)
Costes
- ▲ Complejidad de la arquitectura del balanceador de carga
- △ Overhead de transferencia de KV cache entre servidores
- △ Dependencia de hardware específico (RDMA)
Fundamentos Teóricos
La disociación de prefill/decode se alinea con principios de optimización de sistemas distribuidos que buscan desacoplar cargas de trabajo con diferentes perfiles de recursos para maximizar la utilización. Esto es análogo a la separación de responsabilidades en microservicios o la segmentación de pipelines de procesamiento. La gestión del KV cache y su extensión a través de múltiples GPUs y NVMe se relaciona con conceptos de memoria jerárquica y gestión de caché en sistemas operativos y bases de datos, buscando optimizar la latencia de acceso a datos frecuentemente utilizados. La idea de extender la memoria más allá de la RAM principal a almacenamiento persistente para caché es un patrón bien establecido en sistemas de bases de datos (ej., buffer pools).
La decodificación especulativa tiene sus raíces en algoritmos de predicción y corrección de errores, y se ha popularizado en la investigación de LLMs como una forma de mejorar el throughput sin sacrificar la calidad. Conceptos similares se encuentran en la ejecución especulativa de CPUs o en la predicción de ramas. El uso de RDMA (Remote Direct Memory Access) para la transferencia de datos entre GPUs y nodos es un principio fundamental en computación de alto rendimiento (HPC) y redes de baja latencia, crucial para escalar cargas de trabajo intensivas en datos como los LLMs. La eficiencia del motor Infire en Rust refleja la tendencia de utilizar lenguajes de programación de sistemas para optimizar el rendimiento y el control de recursos, similar a cómo C/C++ se ha utilizado tradicionalmente en HPC.