Logo IES Simarro
PP1-Simarro Centro de excelencia en IA y BD

Benchmarks Titán

Mediciones reales de Qwen 3.8 Flash Next servido con vLLM en el nodo Titán (3× NVIDIA RTX PRO 6000 Blackwell Max-Q), en producción 24/7. Documentación pública y viva del clúster de IA soberana del IES Dr. Lluís Simarro — Centro de Excelencia Nacional en IA y Big Data.

602
tok/s pico agregado
1 × RTX PRO 6000
1.668
tok/s pico clúster
3 GPUs simultáneas
85–246
tok/s por usuario
suelo frío → pico en carga
81,8 %
prefill cacheado
(globales)
524K
tokens de contexto
por petición

1. El modelo y el entorno

  • Modelo: Qwen 3.8 Flash Next — MoE con atención híbrida: 48 capas (36 de atención lineal + 12 de atención completa), 512 experts con 10 activos por token, hidden size 2.560, vocabulario 248.320. Checkpoint mixto NVFP4 + FP8 (compressed-tensors): 171 GiB en disco.
  • Hardware: nodo Titán — AMD Ryzen Threadripper PRO 9995WX (96C/192T, 1 nodo NUMA), 3× RTX PRO 6000 Blackwell Max-Q (96 GB GDDR7 ECC c/u, SM120), 512 GB DDR5 ECC octa-channel, NVMe PCIe 5.0 en RAID 10.
  • Motor: vLLM (build a medida sobre vllm/vllm-openai:qwen38-flash-next, V1 engine con torch.compile + CUDA graphs full+piecewise) · gateway LiteLLM · driver NVIDIA 595.x · CUDA 13.2.
  • Despliegue: 3 instancias Docker, una GPU dedicada por instancia (tp=1), activas 24/7 desde el 6 de septiembre de 2026, alimentando las aplicaciones del centro (agentes de código, aula, generación de contenido).
  • Medición: todas las cifras de esta página provienen de los loggers y los /metrics Prometheus de vLLM con carga real de producción (petición streaming, decodificación greedy) y de sondas propias ignore_eos de 256 tokens. No son benchmarks sintéticos de laboratorio: son los números que ve el usuario final.

2. La clave: jerarquía de memoria GPU → CPU para la KV cache

El cuello de botella de un MoE grande en concurrencia no es el decode —es la memoria donde vive el estado de atención. La estrategia del Titán reserva la VRAM para lo que necesita ancho de banda a 1.792 GB/s (pesos + KV residente) y descarga el resto de la KV cache y el estado PLE a la DDR5 ECC del servidor, que aporta ~100 GB de memoria de trabajo por instancia sin penalizar el cómputo:

# Command line de producción (idéntica en las 3 instancias)
vllm serve /model \
  --served-model-name qwen3.8-flash-next \
  --max-model-len 524288 \
  --gpu-memory-utilization 0.97 \
  --kv-cache-memory 15569256448   # 14,5 GiB de KV residente en GPU \
  --enable-prefix-caching \
  --enable-auto-tool-choice --tool-call-parser qwen3_coder \
  --reasoning-parser qwen3 \
  --max-num-seqs 16 --tensor-parallel-size 1
# Offload del estado PLE (Per-layer Embedding/offload) a CPU:
env VLLM_PLE_CPU_OFFLOAD=1  VLLM_PLE_OFFLOAD_READY_TIMEOUT=1800

VRAM por GPU (96 GB)

72,1 GiB pesos + 14,5 GiB KV + 0,3 GiB CUDA graphs ≈ 94 GB en uso productivo

RAM del sistema (512 GB)

101–115 GiB por contenedor (offload + páginas KV) → ≈ 100 GB de KV en RAM por GPU

Contexto

524.288 tokens/petición (YARN ×2) · KV GPU = 604.705 tokens · 16 secuencias máx.

La arquitectura híbrida lineal/completa (36+12 capas) es lo que hace posible el truco: las capas de atención lineal mantienen un estado recurrente de tamaño fijo, así que la KV "que crece con el contexto" solo existe en 12 de las 48 capas. Con 14,5 GiB de KV residente en GPU caben 604.705 tokens —dieciséis sesiones de 32 K o una ventana completa de 512 K— y el paginado a RAM cubre las rachas sin tocar los pesos, que permanecen residentes en GDDR7.

3. Concurrencia: throughput agregado vs. peticiones activas

Curva medida en la instancia 0 a partir de 21.695 muestras de 10 s de los loggers de vLLM (5 días de producción real). Cada barra es el throughput medio de salida de la GPU con N peticiones simultáneas:

1 req
88,0 tok/s
2 reqs
145,7 tok/s
3 reqs
176,5 tok/s
4 reqs
203,9 tok/s
5 reqs
252,6 tok/s
6 reqs
264,6 tok/s
8 reqs
375,2 tok/s (c1)
10 reqs
364,2 tok/s
11 reqs
409,3 tok/s
12 reqs
451,2 tok/s
pico 12r
602,1 tok/s

Medias por nivel de concurrencia (instancia 0; pico de 8 reqs tomado de la instancia 1). El crecimiento es casi lineal hasta ~5–6 secuencias: hasta ese punto cada petición viaja a ~85 tok/s individuales; a partir de ahí entra en juego el batching continuo de vLLM y el agregado sube mientras el coste por secuencia baja.

3.1 Picos por instancia y suma del clúster

Instancia Muestras Pico tok/s P99 tok/s P95 tok/s Media en activo % tiempo con carga
titan-qwen38-0 (GPU 0) 21.695 602,1 356,4 298,8 137,0 81,1 %
titan-qwen38-1 (GPU 1) 21.518 558,3 360,9 303,1 138,4 80,6 %
titan-qwen38-2 (GPU 2) 12.980 513,5 369,0 329,4 148,5 86,5 %
Clúster (3 GPUs) 2.330 min alineados 1.668,4 1.125,4 1.066,6 434,5 (mediana) 229 min > 1.000

Ventana: 6–13 de septiembre de 2026 (instancias 0–1) y desde el reinicio de la instancia 2. Fila del clúster: suma de las 3 instancias alineada por minuto (máximo de las muestras de 10 s de cada engine dentro del mismo minuto), sobre 2.330 minutos con actividad simultánea en las tres GPUs. 229 minutos superaron los 1.000 tok/s agregados.

3.2 Ráfagas simultáneas por encima de 1.000 tok/s

# Σ clúster tok/s GPU 0 GPU 1 GPU 2
1 ◀ pico 1.668,4 596,6 558,3 513,5
2 1.221,1 399,6 414,3 407,2
3 1.205,4 395,0 400,7 409,7
4 1.204,4 402,3 402,0 400,1
5 1.195,2 397,0 401,8 396,4
6 1.184,9 397,1 383,0 404,8
7 1.170,1 403,6 360,6 405,9
8 1.165,0 404,6 362,6 397,8

Las ocho mayores ráfagas medidas con actividad simultánea en las tres GPUs. El pico absoluto muestra a las tres instancias cerca de su máximo individual simultáneamente. Distribución completa de los 2.330 minutos alineados: P99 = 1.125 tok/s · P95 = 1.067 · mediana = 434 — es decir, en el 1 % del tiempo con uso intensivo concurrente el clúster supera los 1.100 tok/s, y en una de cada diez de esas ráfagas, los 1.000 con holgura.

4. Latencias: percentiles reales de producción

Extraídas de los histograms Prometheus de cada engine (/metrics) sobre miles de peticiones de producción real con ~82 % de aciertos de caché de prefijo:

Instancia Peticiones TTFT p50 TTFT p90 TTFT p99 ITL p50 ITL p90 ITL p99
titan-qwen38-0 15.061 470 ms 6,84 s 35,7 s 14,7 ms 23,1 ms 25,0 ms
titan-qwen38-1 14.779 463 ms 6,31 s 31,8 s 14,8 ms 23,0 ms 24,9 ms
titan-qwen38-2 8.484 520 ms 9,88 s 35,4 s 15,5 ms 23,2 ms 24,9 ms

TTFT = tiempo hasta el primer token (incluye prefill; los percentiles altos reflejan prompts de contexto largo —agentes con repositorios completos—, no degradación del decode). ITL = intervalo entre tokens: p50 ≈ 14,7 ms → un usuario individual percibe ~68 tok/s de escritura continua con la máquina cargada, y el p99 de ITL (25 ms) demuestra que el decode nunca se degrada por encima de 40 tok/s ni bajo concurrencia.

4.1 Single-stream controlado (sonda ignore_eos, 256 tokens de salida)

Instancia TTFT (3 rep.) Decode tok/s (3 rep.)
titan-qwen38-0 139 / 127 / 120 ms 86,2 / 85,1 / 83,7
titan-qwen38-1 120 / 117 / 119 ms 85,9 / 85,8 / 86,6
titan-qwen38-2 119 / 126 / 118 ms 78,3 / 78,7 / 78,7

Sonda con prefijo frío (sin caché), prompt de ~500 tokens, temperature=0, con el resto de la carga de producción activa en las otras instancias. TTFT de ~120 ms en frío para un modelo de 171 GiB; ~85 tok/s de decode por secuencia es el suelo de calidad: ni un usuario, ni bajo la peor concurrencia, escribe más lento que en un MacBook con un 4B cuantizado.

5. Por qué Qwen 3.8 Flash Next y no el denso de 27 B

Nuestra carga tipo es la de un agente de código sobre repositorio: reenvía contexto masivo en cada paso (prompts medios de ~90 K tokens en esta máquina) y recibe respuestas cortas. Para ese patrón, el Flash Next nos da mejoras reales frente al Qwen 3.8 denso de 27 B, la referencia densa del fabricante:

Velocidad de los parámetros activos, no del total

El denso activa sus 27 B parámetros en cada token; el Flash Next solo 10 de 512 experts por capa (FFN de 640) más las proyecciones de atención. Cada token cuesta varias veces menos FLOPs: por eso sostenemos ~85 tok/s de suelo por secuencia y 602 tok/s agregados por GPU. El denso de 27 B paga cada token a precio completo: en una sola tarjeta, difícilmente alcanza este régimen de agregado con contexto largo.

Atención híbrida: la KV solo crece en 12 de 48 capas

Las 36 capas de atención lineal mantienen estado recurrente de tamaño fijo; solo las 12 de atención completa generan KV proporcional al contexto. Con 14,5 GiB de KV residente caben 604.705 tokens —una ventana de 512 K o dieciséis sesiones de 32 K— en una fracción de la memoria que exige un denso equivalente, donde la KV completa en todas sus capas convierte el estado de atención en el cuello de botella de la concurrencia.

Capacidad muy superior al tamaño activo

El checkpoint completo ocupa 171 GiB: la capacidad total del modelo multiplica largamente los 27 B del denso mientras el coste por token se comporta como el de un modelo pequeño. En la práctica: mejor calidad en razonamiento largo, tool calling y repositorios grandes, sin pagar la latencia del denso.

Nativo para servir: un modelo, tres GPUs, sin tp=2

Los 72,1 GiB de pesos cuantizados (NVFP4+FP8) caben en una sola tarjeta: servimos tp=1 con tres instancias independientes y equilibrio de carga en LiteLLM. Sin overhead de paralelo de tensores, sin punto único de fallo, y con el doble de flexibilidad de plan de memoria (el KV en RAM) que un deployment repartido entre dos GPUs.

La relación prompt:generación ≈ 53:1 de nuestra carga confirma el patrón: con agentes que reenvían todo el contexto en cada paso, la ventaja del Flash Next no es solo de velocidad punta — es estructural: menos FLOPs por token y KV solo en un cuarto de las capas. El denso de 27 B sigue siendo una opción excelente para calidad por euro en contexto corto; para concurrencia con repositorio completo, el MoE híbrido gana en nuestra máquina de forma clara.

6. Conclusiones

En concurrencia manda la gestión del KV

Con un MoE grande, el cuello de botella deja de ser el decode y pasa a ser dónde vive el estado de atención. Reservar ~94 GB de VRAM para pesos + KV residente y descargar ~100 GB de KV/estado a DDR5 ECC es lo que sostiene 602 tok/s agregados por GPU con contexto de 512 K. Mismo silicio, el doble de usuarios: solo cambia el plan de memoria.

Prefijo cacheado = GPU libre

El 81 % del prefill de nuestra carga real sale de caché: TTFT mediano de 470 ms pese a prompts promedio de ~90 K tokens, y cola media de 0,5 s. Es lo que hace compartible una máquina así sin que nadie lo note.

Escalado casi lineal hasta 5 secuencias

88 → 146 → 253 tok/s con 1 → 2 → 5 peticiones activas: el continuous batching de vLLM multiplica el agregado sin castigar al usuario (ITL p99 estable en ~25 ms = 40 tok/s por usuario en el peor caso). El techo de max-num-seqs=16 no llega a saturarse en producción.

NVFP4+FP8: 171 GiB que caben en 96 GB de VRAM

La cuantización mixta nativa de Blackwell (tensor cores FP4 de 5ª gen) reduce los pesos a 72 GiB, y la atención híbrida lineal/completa recorta la KV a 12 de 48 capas. Sin ambos, este modelo sencillamente no se sirve en una workstation.

7. Limitaciones y validez

  • Carga real heterogénea: los percentiles de TTFT incluyen prompts de contexto completo (hasta 512 K) y reflejan la distribución de uso del centro, no un barrido controlado de laboratorio.
  • Los picos por instancia (513–602 tok/s) son máximos de las muestras de 10 s de los loggers con la máquina en su régimen natural; el techo absoluto con vllm bench serve al 100 % de max-num-seqs sería mayor.
  • Las 16 muestras con 9–12 peticiones activas de la instancia 0 coinciden con ráfagas multiusuario; el tamaño muestral por nivel alto de concurrencia es limitado (se indicará en próximas revisiones).
  • Instancia 2 reiniciada el 11-sep: sus contadores acumulados son de menor ventana.

Sobre este documento

Documento público y vivo del IES Dr. Lluís Simarro, Centro de Excelencia Nacional en IA y Big Data. Datos extraídos directamente del nodo Titán el 13 de septiembre de 2026 (loggers de vLLM, endpoint /metrics Prometheus y sondas propias de latencia). Repositorio: aulaenlanube/pp1-simarro.

Estos números tienen una ingeniería detrás: descubre cómo está montada la plataforma

Por qué réplicas TP=1 y no tensor-parallel, cómo funciona la cola de distribución HAProxy, qué aprendimos balanceando streams LLM y cómo se escala de 1 a 3 GPUs sin cortar el servicio.

VER LA PLATAFORMA DE INFERENCIA →
Volver al índice de benchmarks