effidevFlutter · Edge de Cloudflare · Optimización de costes en la nube
Español

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

vLLM vs SGLang Speculative Decoding Chunked Prefill VRAM Latency Optimization

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-model y --num-speculative-tokens quedaron obsoletos y se eliminaron del código fuente. Ejecutar el comando con la sintaxis antigua produce un error unrecognized 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 es None, 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

  1. RAG General y Alta Concurrencia: Elija vLLM por su madurez y ecosistema.
  2. Agentes de IA y Salida JSON Estructurada: Elija SGLang por su alta tasa de reutilización de caché Radix.
  3. Incorporar Speculative Decoding en cualquiera de los dos motores duplica el rendimiento sin reducir la calidad del modelo.