Medir inferencia sin engañarte: tokens/s, TTFT y benchmarks mentirosos
Un benchmark puede hacerte creer que el modelo A es el doble de rápido que el B, y ser completamente falso por cómo se midió. Me pasó mirando números publicados: dos "tokens/s" que no eran la misma cosa. Esta pieza es cómo medir inferencia de forma que el número signifique algo.
Las 2 métricas que siente el usuario
- TTFT (Time To First Token): cuánto tarda el primer token. Es la "sensación" de velocidad en un chat.
- TPOT (Time Per Output Token): cuánto tarda cada token siguiente. Es la fluidez.
Fuente: 5 Questions To Ask Before Choosing An LLM - AI Hero
Estas dos no se promedian: se reportan por percentiles (p50, p95, p99). Un TTFT promedio de 400 ms puede esconder un p95 de 4 segundos, y son esos 4 segundos los que hacen que la gente cierre la pestaña.
Las que ve tu factura
- Throughput: tokens (o peticiones) por segundo en total. Es lo que decide cuánto hardware necesitas.
- Tokens/s por usuario: lo que el usuario percibe; sube con batching y con caché.
- Costo por 1M tokens: la traducción a dinero. → El costo real de tu feature de AI
Por qué los benchmarks públicos mienten
AI Hero lo dice sin rodeos: "existe el peligro constante de que los proveedores ajusten sus modelos a estos benchmarks. Puede pasar porque el modelo consuma los datos del benchmark durante el preentrenamiento, o por presión organizativa para mejorar la puntuación". - Source: 5 Questions To Ask Before Choosing An LLM - AI Hero
Y hay más formas de mentir sin querer:
- Hardware distinto: un "tokens/s" en una H100 no es el mismo número en una L4.
- Cuantización distinta: FP16 vs 4 bits cambian el resultado (y no siempre a favor del cuantizado).
- Prompt distinto: un benchmark de generación corta y otro de contexto larguísimo miden cosas opuestas.
- Sin warmup: la primera corrida paga compilación y carga del modelo.
- Solo el modelo: tu latencia real incluye tu servidor, tu CPU y tu red, no solo la GPU.
Cómo se mide en serio (mirando a quien lo hace bien)
Cuando vLLM compara su motor nuevo con el anterior, controla las variables: usa datasets estándar (ShareGPT para Llama 3.1 8B y 3.3 70B; VisionArena para Qwen2-VL) y aclara por qué la diferencia es atribuible a la arquitectura y no a otra cosa: "los kernels usados en V0 y V1 son casi idénticos, así que la diferencia de rendimiento se debe principalmente a las mejoras arquitectónicas". - Source: vLLM V1 - vLLM Team
Esa frase es la lección: si no puedes explicar qué variable cambiaste, tu comparación no es evidencia. Y vLLM también documenta el dato que te obliga a medir bien: con Llama-8B en una H100, la ejecución en GPU puede ser de ~5 ms, y el resto del tiempo se va en CPU. - Source: vLLM V1 - vLLM Team
Tu benchmark, con reglas
- Calienta: descarta las primeras 3-5 corridas.
- N ≥ 100 peticiones, no una.
- Reporta p50 y p95, nunca solo el promedio.
- Fija la configuración: modelo, cuantización, contexto, concurrencia, hardware.
- Mide el flujo completo (petición → primer token → último token), no solo la GPU.
- Un cambio por vez: si cambias modelo y batching, no sabes qué movió el número.
# Ejemplo de lo que quieres ver por corrida (guarda el crudo, no el resumen)
peticion | TTFT(ms) | TPOT(ms) | tokens | total(ms)
1 | 320 | 18 | 412 | 7.4
...
p50: TTFT 330 | p95: TTFT 1.980 # el p95 es el que usas para decidir
Y el cierre que lo une todo: el único benchmark que predice el comportamiento de tu producto es el que corres en tu app, con tus prompts y tus datos. Eso son evals, no un leaderboard.
5 pasos
- Define tu métrica de producto (¿te importa el primer token o el total?).
- Construye un runner reproducible con N≥100 y salida cruda.
- Reporta p50/p95 y compara configuraciones de a una.
- Escribe las evals de tu app y úsalas como árbitro final.
- Guarda los resultados con fecha y configuración; un número sin contexto no sirve mañana.
Los conceptos de fondo están en Inference Engineering: qué se optimiza y Servir en producción.
¿Mides tokens/s de alguna forma? Cuéntame en los comentarios cómo evitas engañarte (o cómo te engañaste una vez).