Comparativa vLLM vs SGLang: Optimización de VRAM y Latencia LLM con Speculative Decoding y Chunked Prefill

Comparativa vLLM vs SGLang: Optimización con Speculative Decoding y Chunked Prefill
Al desplegar Modelos de Lenguaje (LLM) en producción, los mayores obstáculos son la saturación de VRAM en las GPU y las altas latencias de respuesta. Con el aumento del tráfico concurrente, la memoria consumida por el KV Cache crece rápidamente, provocando picos en el tiempo hasta el primer token (TTFT) y fallos por falta de memoria (OOM).
Para solventarlo destacan dos motores de inferencia: vLLM (basado en PagedAttention) y SGLang (basado en RadixAttention).
Esta guía analiza las diferencias de arquitectura de memoria entre vLLM y SGLang, y explica cómo combinar Chunked Prefill con Speculative Decoding para minimizar el consumo de VRAM y acelerar la generación de tokens.
1. vLLM (PagedAttention) vs SGLang (RadixAttention)
| Característica | vLLM (PagedAttention) | SGLang (RadixAttention) |
|---|---|---|
| Arquitectura de KV Cache | Paginación de memoria virtual que evita fragmentación | Mapeo de memoria basado en árbol Radix |
| Reutilización de Prompts | Excelente para prompts de sistema estándar | Superior para chats multiturno, agentes y pocos ejemplos |
| Casos de Uso Ideales | RAG general y chatbots de alta concurrencia | Flujos multiagente, JSON estructurado y herramientas |
| Rendimiento (TPS) | Estándar de la industria | Entre 1.5x y 3x más rápido con alta tasa de aciertos de caché |
2. 2 Técnicas Clave de Optimización
1) Chunked Prefill
Para evitar que el procesamiento de prompts largos (fase Prefill) paralice la generación de respuestas (fase Decode), Chunked Prefill divide las entradas en bloques fijos (ej. 512 o 1024 tokens) equilibrando el uso de la GPU.
2) Speculative Decoding (Decodificación Especulativa)
Un modelo borrador ligero (Draft Model, ej. Qwen2.5-0.5B) genera rápidamente varios candidatos a token, que luego son verificados en una sola pasada por el modelo principal (Target Model, ej. Qwen2.5-72B). Esto acelera la generación entre 2x y 3x sin perder precisión.
3. Códigos de Despliegue en Producción
Comando CLI de vLLM con Speculative Decoding
Desde vLLM v0.9.0 (28-05-2025), los flags independientes
--speculative-modely--num-speculative-tokensquedaron obsoletos y se eliminaron del código fuente. Ejecutar el comando con la sintaxis antigua produce un errorunrecognized arguments; hay que pasar un único objeto JSON con--speculative-config, como se muestra a continuación.
# vLLM: Speculative Decoding (Target: Llama-3.1-70B, Draft: Llama-3.1-8B)
# NOTE: --speculative-model / --num-speculative-tokens were removed in vLLM v0.9.0+.
# Passing them now raises "unrecognized arguments"; use the single --speculative-config JSON flag instead.
python3 -m vllm.entrypoints.openai.api_server \
--model meta-llama/Meta-Llama-3.1-70B-Instruct \
--speculative-config '{"model": "meta-llama/Meta-Llama-3.1-8B-Instruct", "num_speculative_tokens": 5}' \
--enable-chunked-prefill \
--max-num-batched-tokens 2048 \
--gpu-memory-utilization 0.90 \
--tensor-parallel-size 4
Servidor SGLang con Speculative Decoding (Python)
Cuando se usa un modelo borrador independiente, hay que indicar explícitamente
speculative_algorithm="STANDALONE". Su valor por defecto esNone, así que omitirlo deja el Speculative Decoding desactivado aunque se configure la ruta del draft model y el número de tokens.
import sglang as sgl
@sgl.function
def multi_turn_agent(s, system_prompt, user_query):
s += sgl.system(system_prompt)
s += sgl.user(user_query)
s += sgl.assistant(sgl.gen("response", max_tokens=1024, temperature=0.2))
if __name__ == "__main__":
runtime = sgl.Runtime(
model_path="meta-llama/Meta-Llama-3.1-70B-Instruct",
speculative_algorithm="STANDALONE",
speculative_draft_model_path="meta-llama/Meta-Llama-3.1-8B-Instruct",
speculative_num_draft_tokens=5,
mem_fraction_static=0.88,
tp_size=4
)
sgl.set_default_backend(runtime)
4. Resumen de Benchmarks y Guía de Selección
| Métrica | Decodificación Estándar | Con Chunked Prefill + Speculative |
|---|---|---|
| TTFT (Primer Token) | 1.8s | 0.4s (77% de reducción) |
| Velocidad de Respuesta | 24 tokens/sec | 58 tokens/sec (2.4x más rápido) |
| Ahorro de VRAM | Referencia | 35% de ahorro de VRAM en KV Cache |
Matriz de Decisión
- RAG General y Alta Concurrencia: Elija
vLLMpor su madurez y ecosistema. - Agentes de IA y Salida JSON Estructurada: Elija
SGLangpor su alta tasa de reutilización de caché Radix. - Incorporar Speculative Decoding en cualquiera de los dos motores duplica el rendimiento sin reducir la calidad del modelo.