<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Llmperf on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/llmperf/</link><description>Recent content in Llmperf on lo0 — Blog Técnico</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Sat, 13 Jun 2026 02:30:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/tags/llmperf/index.xml" rel="self" type="application/rss+xml"/><item><title>Benchmarking de inferencia LLM: frameworks, métricas y estado del arte (ficha a ficha)</title><link>https://blog.lo0.es/posts/benchmarking-llm-frameworks-estado-del-arte/</link><pubDate>Sat, 13 Jun 2026 02:30:00 +0200</pubDate><guid>https://blog.lo0.es/posts/benchmarking-llm-frameworks-estado-del-arte/</guid><description>&lt;h2 id="qué-cubre-esta-introducción">Qué cubre esta introducción&lt;/h2>
&lt;p>Tercer artículo de la serie de datos. Inventario del tooling de &lt;strong>benchmarking de
rendimiento&lt;/strong> de inferencia LLM: qué se mide, cómo difieren las herramientas por
arquitectura, y la ficha de cada framework. Sin recomendaciones; solo datos y
metodología.&lt;/p>
&lt;hr>
&lt;h2 id="métricas-de-rendimiento">Métricas de rendimiento&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Métrica&lt;/th>
&lt;th>Definición&lt;/th>
&lt;th>Unidad&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>TTFT&lt;/strong> (Time To First Token)&lt;/td>
&lt;td>latencia hasta el primer token (domina el prefill)&lt;/td>
&lt;td>ms&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>TPOT / ITL&lt;/strong> (Time Per Output Token / Inter-Token Latency)&lt;/td>
&lt;td>tiempo entre tokens de salida (domina el decode)&lt;/td>
&lt;td>ms/token&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Throughput&lt;/strong>&lt;/td>
&lt;td>tokens (o peticiones) por segundo del sistema&lt;/td>
&lt;td>tok/s, req/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Goodput&lt;/strong>&lt;/td>
&lt;td>throughput que &lt;strong>cumple el SLO&lt;/strong> (no el bruto)&lt;/td>
&lt;td>tok/s útiles&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>P50 / P95 / P99&lt;/strong>&lt;/td>
&lt;td>percentiles de latencia, no la media&lt;/td>
&lt;td>ms&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>La latencia total de una petición de salida (N) tokens se descompone:&lt;/p>
&lt;p>$$\text{latencia} \approx \text{TTFT} + (N-1)\times \text{TPOT}$$&lt;/p>
&lt;p>Por eso TTFT y TPOT se reportan &lt;strong>por separado&lt;/strong>: una misma media esconde perfiles muy
distintos (prefill caro vs decode caro).&lt;/p>
&lt;hr>
&lt;h2 id="la-diferencia-que-sesga-los-datos-mono-proceso-vs-multi-proceso">La diferencia que sesga los datos: mono-proceso vs multi-proceso&lt;/h2>
&lt;p>Las herramientas se dividen en dos clases por &lt;strong>arquitectura del cliente&lt;/strong>, y eso
determina si la medida es fiable a alta concurrencia:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Micro-bench mono-proceso&lt;/strong> (vLLM bench, SGLang bench, genai-perf): cliente Python
asyncio de un proceso. Útiles para experimentos rápidos sobre un motor concreto, pero
la arquitectura mono-proceso &lt;strong>introduce un cuello de botella en el lado cliente&lt;/strong> que
&lt;strong>sesga los datos a alta concurrencia&lt;/strong> (&lt;a href="https://kchandan.medium.com/llm-inference-benchmarking-genai-perf-and-vllm-5dd06b57428e">Medium · genAI-perf y vLLM&lt;/a>).&lt;/li>
&lt;li>&lt;strong>Carga multi-proceso&lt;/strong> (GuideLLM, AIPerf): generan carga real distribuida, evitando
ese límite del cliente. Son la clase que ha emergido para medir a escala.&lt;/li>
&lt;/ul>
&lt;div class="diagram" style="max-width:780px;margin:1rem auto;">
&lt;svg viewBox="0 0 780 210" role="img" aria-label="Dos clases de herramientas de benchmark: cliente mono-proceso que se satura a alta concurrencia frente a generador de carga multi-proceso" xmlns="http://www.w3.org/2000/svg">
&lt;style>.bx{fill:none;stroke:currentColor;stroke-width:1.3}.dsh{fill:none;stroke:currentColor;stroke-width:1.3;stroke-dasharray:5 3}.tl{font:600 12px sans-serif;fill:currentColor}.ts{font:11px sans-serif;fill:currentColor}.ar{fill:none;stroke:currentColor;stroke-width:1.3;marker-end:url(#bm)}&lt;/style>
&lt;defs>&lt;marker id="bm" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto">&lt;path d="M0,0 L10,5 L0,10 z" fill="currentColor"/>&lt;/marker>&lt;/defs>
&lt;text x="20" y="28" class="tl">Mono-proceso (vLLM bench, SGLang bench, genai-perf)&lt;/text>
&lt;rect class="bx" x="20" y="38" width="150" height="40" rx="6"/>
&lt;text x="32" y="62" class="ts">1 cliente asyncio&lt;/text>
&lt;path class="ar" d="M170,58 L215,58"/>
&lt;rect class="dsh" x="215" y="38" width="120" height="40" rx="6"/>
&lt;text x="227" y="56" class="ts">cuello cliente&lt;/text>
&lt;text x="227" y="71" class="ts">sesga a alta conc.&lt;/text>
&lt;path class="ar" d="M335,58 L380,58"/>
&lt;rect class="bx" x="380" y="38" width="110" height="40" rx="6"/>
&lt;text x="392" y="62" class="ts">motor (vLLM…)&lt;/text>
&lt;text x="20" y="118" class="tl">Multi-proceso (GuideLLM, AIPerf)&lt;/text>
&lt;rect class="bx" x="20" y="128" width="150" height="46" rx="6"/>
&lt;text x="32" y="148" class="ts">N procesos de carga&lt;/text>
&lt;text x="32" y="164" class="ts">(carga real)&lt;/text>
&lt;path class="ar" d="M170,151 L380,151"/>
&lt;rect class="bx" x="380" y="131" width="110" height="40" rx="6"/>
&lt;text x="392" y="155" class="ts">motor (vLLM…)&lt;/text>
&lt;text x="510" y="150" class="ts">mide el motor,&lt;/text>
&lt;text x="510" y="166" class="ts">no el cliente&lt;/text>
&lt;/svg>
&lt;/div>
&lt;hr>
&lt;h2 id="frameworks-ficha-a-ficha">Frameworks, ficha a ficha&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Herramienta&lt;/th>
&lt;th>Clase&lt;/th>
&lt;th>Qué mide&lt;/th>
&lt;th>Mantenedor&lt;/th>
&lt;th>Notas&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>vLLM bench&lt;/strong>&lt;/td>
&lt;td>micro mono-proceso&lt;/td>
&lt;td>TTFT, TPOT, throughput del motor vLLM&lt;/td>
&lt;td>vLLM (OSS)&lt;/td>
&lt;td>Rápido para tunear vLLM; sesga a alta concurrencia&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>SGLang bench&lt;/strong>&lt;/td>
&lt;td>micro mono-proceso&lt;/td>
&lt;td>métricas del motor SGLang&lt;/td>
&lt;td>SGLang (OSS)&lt;/td>
&lt;td>Equivalente para SGLang&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>AIPerf&lt;/strong> (ex &lt;strong>genai-perf&lt;/strong>)&lt;/td>
&lt;td>carga multi-proceso&lt;/td>
&lt;td>TTFT, ITL, throughput; perfiles&lt;/td>
&lt;td>NVIDIA (OSS)&lt;/td>
&lt;td>NVIDIA &lt;strong>jubiló genai-perf y creó AIPerf el 15-abr-2026&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>GuideLLM&lt;/strong>&lt;/td>
&lt;td>carga multi-proceso&lt;/td>
&lt;td>SLO bajo carga, sweep de concurrencia&lt;/td>
&lt;td>OSS (Red Hat/Neural Magic)&lt;/td>
&lt;td>Encuentra el punto de saturación&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>LLMPerf&lt;/strong>&lt;/td>
&lt;td>carga&lt;/td>
&lt;td>throughput y latencia a nivel inferencia&lt;/td>
&lt;td>Anyscale/Ray (OSS)&lt;/td>
&lt;td>Clásico para validación de endpoints&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>MLPerf Inference&lt;/strong>&lt;/td>
&lt;td>suite estándar&lt;/td>
&lt;td>escenarios server/offline normalizados&lt;/td>
&lt;td>MLCommons&lt;/td>
&lt;td>Comparabilidad cross-vendor; v5.x&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="estado-del-arte-2026">Estado del arte 2026&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Migración genai-perf → AIPerf&lt;/strong>: NVIDIA jubiló genai-perf el &lt;strong>15 de abril de 2026&lt;/strong> y
lo sustituyó por &lt;strong>AIPerf&lt;/strong>, multi-proceso (&lt;a href="https://arxiv.org/html/2605.24217">arXiv · Measurement Bias&lt;/a>).&lt;/li>
&lt;li>&lt;strong>Sesgo de medición documentado&lt;/strong>: dos herramientas pueden reportar resultados muy
distintos para el mismo sistema; el sesgo sistemático de medición en benchmarks de
producción está caracterizado en la literatura (&lt;a href="https://arxiv.org/html/2605.24217">arXiv 2605.24217&lt;/a>).
Corolario: &lt;strong>un benchmark sin metodología publicada no es comparable&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>MLPerf Inference v5.x&lt;/strong> (MLCommons) sigue siendo el estándar para comparabilidad
entre fabricantes; sus escenarios (server/offline) y reglas acotan el resultado.&lt;/li>
&lt;li>&lt;strong>Rendimiento ≠ calidad&lt;/strong>: estas herramientas miden velocidad/throughput, no acierto.
La calidad se mide con otra familia (lm-evaluation-harness, HELM), que es otro eje del
cuadro de mando (artículo B7).&lt;/li>
&lt;/ul>
&lt;p>Este tooling alimenta el dimensionamiento (&lt;a href="https://blog.lo0.es/posts/capacity-planning-inferencia-llm-on-premise/">capacity planning&lt;/a>)
y la medición del efecto de optimizaciones como &lt;a href="https://blog.lo0.es/posts/decode-optimizaciones-vllm/">decode&lt;/a> y
&lt;a href="https://blog.lo0.es/posts/prefill-optimizaciones-vllm/">prefill&lt;/a> en vLLM.&lt;/p>
&lt;h2 id="fuentes">Fuentes&lt;/h2>
&lt;ul>
&lt;li>Medium · LLM Inference Benchmarking — genAI-perf y vLLM — &lt;a href="https://kchandan.medium.com/llm-inference-benchmarking-genai-perf-and-vllm-5dd06b57428e">https://kchandan.medium.com/llm-inference-benchmarking-genai-perf-and-vllm-5dd06b57428e&lt;/a>&lt;/li>
&lt;li>arXiv 2605.24217 · Systemic Measurement Bias in Production LLM Inference Benchmarks — &lt;a href="https://arxiv.org/html/2605.24217">https://arxiv.org/html/2605.24217&lt;/a>&lt;/li>
&lt;li>MLCommons · MLPerf Inference — &lt;a href="https://mlcommons.org/benchmarks/inference-datacenter/">https://mlcommons.org/benchmarks/inference-datacenter/&lt;/a>&lt;/li>
&lt;li>BentoML · LLM performance benchmarks — &lt;a href="https://bentoml.com/llm/inference-optimization/llm-performance-benchmarks">https://bentoml.com/llm/inference-optimization/llm-performance-benchmarks&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>