<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Serving on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/serving/</link><description>Recent content in Serving on lo0 — Blog Técnico</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Tue, 16 Jun 2026 02:00:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/tags/serving/index.xml" rel="self" type="application/rss+xml"/><item><title>Comparativa de motores de serving LLM en frontera de Pareto: vLLM, SGLang, TRT-LLM y Dynamo</title><link>https://blog.lo0.es/posts/comparativa-motores-serving-pareto/</link><pubDate>Tue, 16 Jun 2026 02:00:00 +0200</pubDate><guid>https://blog.lo0.es/posts/comparativa-motores-serving-pareto/</guid><description>&lt;blockquote>
&lt;p>Notación: importes en &lt;strong>euros (N €)&lt;/strong>, decimales con coma. No se usa el símbolo de dólar
(en este sitio es delimitador de fórmula). Hardware de referencia: configuración genérica
4×H100 SXM 80 GB; las cifras son ilustrativas para comparar motores, no métricas de
producción de ninguna infraestructura real.&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>Cuatro motores OSS dominan el serving LLM on-premise en 2026: &lt;strong>vLLM&lt;/strong>, &lt;strong>SGLang&lt;/strong>,
&lt;strong>NVIDIA TensorRT-LLM&lt;/strong> y &lt;strong>NVIDIA Dynamo&lt;/strong>. Ninguno es superior en todos los ejes. En
throughput bruto con prompt compartido, SGLang supera a vLLM en un 29 % en Llama-3.3-70B
FP8 sobre H100 (16.200 vs 12.500 tok/s). En latencia de decode, TRT-LLM mantiene ITL más
estable a alta concurrencia (9–12 ms P50 frente a 18–22 ms de vLLM). Dynamo no es un motor
de inferencia: es la &lt;strong>capa de orquestación&lt;/strong> sobre los tres anteriores para clústeres
multi-nodo, y reporta hasta 7× de throughput adicional en serving desagregado sobre Blackwell.
La elección correcta depende de tres variables: &lt;strong>patrón de carga&lt;/strong> (batch/interactivo),
&lt;strong>escala del despliegue&lt;/strong> (nodo único/multi-nodo) y &lt;strong>restricciones operativas&lt;/strong> (madurez
OSS, facilidad de operación). La tabla de decisión Pareto está al final del artículo.&lt;/p>
&lt;hr>
&lt;h2 id="marco-del-artículo-qué-es-y-qué-no-es-este-b8">Marco del artículo: qué es y qué no es este B8&lt;/h2>
&lt;p>Este artículo (B8 del pilar benchmarking) da por sentadas las métricas de la
&lt;a href="https://blog.lo0.es/posts/benchmarking-llm-frameworks-estado-del-arte/">introducción al benchmarking&lt;/a> y
el catálogo de herramientas de &lt;a href="https://blog.lo0.es/posts/herramientas-benchmark-llm-ficha-a-ficha/">la ficha a ficha&lt;/a>.
Aplica esos conceptos a la elección de motor. El protocolo de &lt;a href="https://blog.lo0.es/posts/guidellm-validacion-slo-bajo-carga/">GuideLLM para validación de
SLO&lt;/a> y &lt;a href="https://blog.lo0.es/posts/nvidia-genai-perf-a-fondo/">AIPerf a fondo&lt;/a>
detallan cómo ejecutar el harness; aquí se usa el resultado. Los fundamentos de
&lt;a href="https://blog.lo0.es/posts/continuous-batching-fundamentos/">continuous batching&lt;/a>,
&lt;a href="https://blog.lo0.es/posts/disaggregated-serving-prefill-decode/">serving desagregado&lt;/a>,
&lt;a href="https://blog.lo0.es/posts/backend-atencion-vllm-flashinfer/">el backend de atención&lt;/a> y
&lt;a href="https://blog.lo0.es/posts/quantization-fundamentos-inferencia/">quantización&lt;/a> se asumen conocidos.&lt;/p>
&lt;hr>
&lt;h2 id="ficha-de-cada-motor">Ficha de cada motor&lt;/h2>
&lt;h3 id="vllm">vLLM&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Atributo&lt;/th>
&lt;th>Valor&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Versión de referencia&lt;/td>
&lt;td>v0.9.x (junio 2026)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Licencia&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Mantenedor / gobernanza&lt;/td>
&lt;td>vLLM Project (Linux Foundation AI), liderado por UC Berkeley + Red Hat&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Hardware soportado&lt;/td>
&lt;td>NVIDIA (Ampere/Hopper/Blackwell), AMD ROCm, Intel Gaudi, TPU, CPU&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Repositorio&lt;/td>
&lt;td>github.com/vllm-project/vllm&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>API&lt;/td>
&lt;td>OpenAI-compatible (completions, chat, embeddings)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Origen: PagedAttention (Kwon et al., 2023). Primera implementación de continuous batching
con KV cache paginado. En 2026 es el motor más desplegado en entornos OSS y el que más
integraciones acumula (Ray Serve, Kubernetes, llm-d, Dynamo).&lt;/p>
&lt;h3 id="sglang">SGLang&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Atributo&lt;/th>
&lt;th>Valor&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Versión de referencia&lt;/td>
&lt;td>v0.4.x (junio 2026)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Licencia&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Mantenedor / gobernanza&lt;/td>
&lt;td>LMSYS Org (Berkeley, CMU, UCSD)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Hardware soportado&lt;/td>
&lt;td>NVIDIA (Ampere/Hopper/Blackwell), AMD ROCm&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Repositorio&lt;/td>
&lt;td>github.com/sgl-project/sglang&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>API&lt;/td>
&lt;td>OpenAI-compatible + SGLang runtime API&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Origen: paper SGLang 2024 (Zheng et al.). Introduce RadixAttention como generalización de
prefix caching: árbol radix de bloques KV con política LRU compartida entre todas las
peticiones en vuelo. Ventaja estructural en workloads con prefijos compartidos (system
prompts largos, few-shot, RAG).&lt;/p>
&lt;h3 id="nvidia-tensorrt-llm-trt-llm">NVIDIA TensorRT-LLM (TRT-LLM)&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Atributo&lt;/th>
&lt;th>Valor&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Versión de referencia&lt;/td>
&lt;td>v0.18.x (junio 2026)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Licencia&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Mantenedor / gobernanza&lt;/td>
&lt;td>NVIDIA (propietario de hecho, OSS de nombre)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Hardware soportado&lt;/td>
&lt;td>NVIDIA únicamente: Ampere (A100), Hopper (H100/H200/GH200), Ada (L40/L40S), Blackwell (B200/GB200)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Repositorio&lt;/td>
&lt;td>github.com/NVIDIA/TensorRT-LLM&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>API&lt;/td>
&lt;td>Python + C++ runtime; integra con Triton Inference Server&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Motor de más bajo nivel: compila grafos de inferencia con TensorRT, aplica fusión de kernels
y genera engines binarios específicos por modelo + hardware + precisión. Máximo rendimiento
en NVIDIA, sin portabilidad a otro hardware. Requiere recompilación al cambiar modelo o
configuración; tiempo de build de minutos a horas según el modelo.&lt;/p>
&lt;h3 id="nvidia-dynamo">NVIDIA Dynamo&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Atributo&lt;/th>
&lt;th>Valor&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Versión de referencia&lt;/td>
&lt;td>v1.1.1 (mayo 2026)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Licencia&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Mantenedor / gobernanza&lt;/td>
&lt;td>NVIDIA + comunidad OSS (ai-dynamo org en GitHub)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Hardware soportado&lt;/td>
&lt;td>NVIDIA (a través del motor subyacente: vLLM, SGLang o TRT-LLM)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Repositorio&lt;/td>
&lt;td>github.com/ai-dynamo/dynamo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Rol&lt;/td>
&lt;td>Capa de orquestación, NO motor de inferencia&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Dynamo &lt;strong>no ejecuta la inferencia directamente&lt;/strong>: es el planificador y enrutador que
coordina pools de workers (vLLM, SGLang, TRT-LLM) en multi-nodo. Implementado en Rust
(rendimiento) + Python (extensibilidad). Añade: serving desagregado prefill/decode entre
nodos, enrutamiento KV-aware (evita recomputar prefill si otro worker ya tiene el KV en
cache), escalado automático por SLA, KV Block Manager (KVBM) con offload a CPU/SSD/remoto
y transferencia via NIXL sobre NVLink/InfiniBand.&lt;/p>
&lt;h3 id="menciones-lmdeploy-y-hf-tgi">Menciones: LMDeploy y HF TGI&lt;/h3>
&lt;p>&lt;strong>LMDeploy&lt;/strong> (OpenMMLab/InternLM, Apache 2.0): motor con dos backends —TurboMind (C++,
máximo rendimiento en NVIDIA) y PyTorch (flexibilidad)—. Bloqueo de KV cache y persistent
batching; 4-bit inferencia hasta 2,4× más rápida que FP16 en su propio benchmark. Ecosistema
más estrecho; sin soporte AMD.&lt;/p>
&lt;p>&lt;strong>HF TGI&lt;/strong> (Hugging Face, Apache 2.0): motor de referencia para el ecosistema HuggingFace.
TGI v3.0 reduce latencia hasta 13× en prompts largos vs versiones anteriores; integra
FlashAttention + PagedAttention. Punto de entrada habitual para equipos que ya operan el
stack HF; no es el más eficiente en throughput a máxima carga.&lt;/p>
&lt;hr>
&lt;h2 id="matriz-de-capacidades">Matriz de capacidades&lt;/h2>
&lt;p>La tabla usa la notación: &lt;strong>Si&lt;/strong> = soportado y estable, &lt;strong>Beta&lt;/strong> = disponible pero no
recomendado para producción, &lt;strong>No&lt;/strong> = no disponible o solo con workaround manual.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Capacidad&lt;/th>
&lt;th>vLLM&lt;/th>
&lt;th>SGLang&lt;/th>
&lt;th>TRT-LLM&lt;/th>
&lt;th>Dynamo (vía backend)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Continuous batching&lt;/strong>&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si (delega al motor)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>PagedAttention&lt;/strong>&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>RadixAttention / prefix caching&lt;/strong>&lt;/td>
&lt;td>Si (chunked prefill + prefix)&lt;/td>
&lt;td>Si (RadixAttention nativa)&lt;/td>
&lt;td>Si (prefix caching)&lt;/td>
&lt;td>Si + KV-aware routing&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Speculative decoding&lt;/strong>&lt;/td>
&lt;td>Si (n-gram, EAGLE, DFlash, suffix)&lt;/td>
&lt;td>Si (draft+verify)&lt;/td>
&lt;td>Si (EAGLE-3, MTP)&lt;/td>
&lt;td>Si&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Quantización FP8&lt;/strong>&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Quantización MXFP4/NVFP4&lt;/strong>&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Beta&lt;/td>
&lt;td>Si (Blackwell)&lt;/td>
&lt;td>Si&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Quantización INT4 AWQ&lt;/strong>&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Quantización GPTQ&lt;/strong>&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>No nativo&lt;/td>
&lt;td>Si (vía vLLM)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Quantización INT8 (SmoothQuant)&lt;/strong>&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Structured output&lt;/strong>&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si (FSM comprimida)&lt;/td>
&lt;td>Beta&lt;/td>
&lt;td>Si&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Multi-LoRA dinámica&lt;/strong>&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Beta&lt;/td>
&lt;td>Si&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Disaggregated prefill/decode&lt;/strong>&lt;/td>
&lt;td>Beta (experimental)&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si (primera clase)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Chunked prefill&lt;/strong>&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Soporte multimodal (VLM)&lt;/strong>&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Multi-nodo tensor parallelism&lt;/strong>&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si (+ pipeline entre nodos)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>OpenAI API compatible&lt;/strong>&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si&lt;/td>
&lt;td>Si (via Triton)&lt;/td>
&lt;td>Si&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Hardware no-NVIDIA&lt;/strong>&lt;/td>
&lt;td>Si (AMD/Intel/TPU)&lt;/td>
&lt;td>Si (AMD)&lt;/td>
&lt;td>No&lt;/td>
&lt;td>No&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Fuentes de la matriz: docs.vllm.ai, docs.sglang.io, nvidia.github.io/TensorRT-LLM,
docs.nvidia.com/dynamo, github.com/ai-dynamo/dynamo (feature matrix, junio 2026).&lt;/p>
&lt;hr>
&lt;h2 id="por-qué-no-se-comparan-a-la-ligera-las-variables-que-rompen-una-comparación">Por qué no se comparan a la ligera: las variables que rompen una comparación&lt;/h2>
&lt;p>Antes de la tabla de cifras, las cuatro decisiones que invalidan cualquier benchmark cruzado:&lt;/p>
&lt;p>&lt;strong>1. Harness distinto.&lt;/strong> Un benchmark con el micro-bench nativo de cada motor (vllm bench
serve vs SGLang bench) mide el cliente, no el motor. La discrepancia puede ser hasta 7,2× a
alta concurrencia. Protocolo correcto: un único generador de carga (AIPerf o GuideLLM)
contra todos los endpoints. El motor es la variable, la herramienta es la constante.&lt;/p>
&lt;p>&lt;strong>2. ISL/OSL distintas.&lt;/strong> Input Sequence Length y Output Sequence Length determinan la ratio
prefill/decode y por tanto qué motor se favorece. Un benchmark con ISL baja (64 tokens)
favorece a motores con decode rápido; con ISL alta (2.048 tokens) y prefijos compartidos,
favorece a SGLang (RadixAttention). Fijar ISL y OSL es obligatorio para que la comparación
sea válida.&lt;/p>
&lt;p>&lt;strong>3. Precisión distinta.&lt;/strong> FP16 y FP8 no son comparables: FP8 da entre 1,5× y 2× más
throughput en Hopper. Comparar vLLM FP16 con TRT-LLM FP8 no dice nada del motor.&lt;/p>
&lt;p>&lt;strong>4. No reportar P99.&lt;/strong> El throughput máximo se alcanza en el punto donde el P99 de TTFT ya
viola el SLO. El número defendible es el goodput —throughput bajo el SLO—, no el máximo
bruto. La fórmula de la latencia de extremo a extremo:&lt;/p>
&lt;p>$$\text{latencia}&lt;em>{e2e} \approx \text{TTFT} + (N&lt;/em>{\text{out}} - 1) \times \text{TPOT}$$&lt;/p>
&lt;p>donde (N_{\text{out}}) es el número de tokens de salida, deja ver que un TTFT alto con TPOT
bajo tiene el mismo efecto que el caso inverso solo para una (N_{\text{out}}) concreta:
hay que reportar ambos por separado.&lt;/p>
&lt;p>El protocolo completo de comparación justa está en
&lt;a href="https://blog.lo0.es/posts/herramientas-benchmark-llm-ficha-a-ficha/">el artículo de herramientas&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2 id="rendimiento-en-frontera-de-pareto-cifras-ilustrativas">Rendimiento en frontera de Pareto: cifras ilustrativas&lt;/h2>
&lt;p>Configuración de referencia para todas las filas: &lt;strong>4×H100 SXM 80 GB NVLink&lt;/strong>,
modelo &lt;strong>Llama-3.1-70B-Instruct FP8&lt;/strong>, harness &lt;strong>AIPerf&lt;/strong> (ex genai-perf, sucesor multi-proceso),
dataset &lt;strong>ShareGPT&lt;/strong> (distribución realista de longitudes), ISL media ~512 tok, OSL media
~256 tok, SLO TTFT P99 &amp;lt; 500 ms. Las cifras son ilustrativas y representativas de benchmarks
publicados por la comunidad (Cerebrium, LMSYS, Spheron, Red Hat MLPerf v5.1); no son mediciones
de ninguna infraestructura real. Las cifras exactas varían con versiones de motor, flags de
compilación y distribución de carga.&lt;/p>
&lt;h3 id="throughput-vs-latencia-tabla-de-pareto">Throughput vs latencia: tabla de Pareto&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Motor&lt;/th>
&lt;th>Config&lt;/th>
&lt;th>Throughput (tok/s)&lt;/th>
&lt;th>TTFT P50 (ms)&lt;/th>
&lt;th>TTFT P99 (ms)&lt;/th>
&lt;th>ITL P50 (ms)&lt;/th>
&lt;th>Goodput (@SLO)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>vLLM v0.9&lt;/strong>&lt;/td>
&lt;td>FP8, chunked prefill&lt;/td>
&lt;td>12.500&lt;/td>
&lt;td>160&lt;/td>
&lt;td>420&lt;/td>
&lt;td>18&lt;/td>
&lt;td>~96 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>SGLang v0.4&lt;/strong>&lt;/td>
&lt;td>FP8, RadixAttention&lt;/td>
&lt;td>16.200&lt;/td>
&lt;td>140&lt;/td>
&lt;td>390&lt;/td>
&lt;td>21&lt;/td>
&lt;td>~97 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>TRT-LLM v0.18&lt;/strong>&lt;/td>
&lt;td>FP8, engine compilado&lt;/td>
&lt;td>14.800&lt;/td>
&lt;td>190&lt;/td>
&lt;td>480&lt;/td>
&lt;td>10&lt;/td>
&lt;td>~93 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>vLLM + Dynamo&lt;/strong>&lt;/td>
&lt;td>FP8, desag. P/D 2+2&lt;/td>
&lt;td>18.500&lt;/td>
&lt;td>120&lt;/td>
&lt;td>310&lt;/td>
&lt;td>19&lt;/td>
&lt;td>~98 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>SGLang + Dynamo&lt;/strong>&lt;/td>
&lt;td>FP8, desag. P/D 2+2&lt;/td>
&lt;td>21.000&lt;/td>
&lt;td>110&lt;/td>
&lt;td>280&lt;/td>
&lt;td>22&lt;/td>
&lt;td>~99 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>TRT-LLM + Dynamo&lt;/strong>&lt;/td>
&lt;td>FP8, desag. P/D 2+2&lt;/td>
&lt;td>22.500&lt;/td>
&lt;td>130&lt;/td>
&lt;td>350&lt;/td>
&lt;td>11&lt;/td>
&lt;td>~97 %&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Notas de lectura:&lt;/p>
&lt;ul>
&lt;li>&amp;ldquo;Desag. P/D 2+2&amp;rdquo; = 2 GPUs prefill + 2 GPUs decode (mismo presupuesto de 4×H100).&lt;/li>
&lt;li>El goodput cae respecto al throughput bruto cuando la cola de latencia supera el SLO de
500 ms P99. TRT-LLM sin Dynamo tiene el ITL más bajo pero el TTFT más alto a alta
concurrencia, lo que lleva su goodput a ~93 % en este SLO.&lt;/li>
&lt;li>Dynamo añade ~30–40 % de throughput efectivo sobre 4 GPUs gracias al serving desagregado
y el enrutamiento KV-aware, en el escenario con prefijos reutilizables (ShareGPT).&lt;/li>
&lt;li>En workloads sin prefijos compartidos (ISL corta, prompts únicos), la ventaja de Dynamo
se reduce al ~10–15 % sobre el motor base.&lt;/li>
&lt;/ul>
&lt;h3 id="punto-de-saturación-sweep-de-concurrencia-vllm-fp8-4h100">Punto de saturación (sweep de concurrencia, vLLM FP8, 4×H100)&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Concurrencia&lt;/th>
&lt;th>TTFT P99 (ms)&lt;/th>
&lt;th>ITL P50 (ms)&lt;/th>
&lt;th>Throughput (tok/s)&lt;/th>
&lt;th>Goodput (tok/s)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>8&lt;/td>
&lt;td>210&lt;/td>
&lt;td>14&lt;/td>
&lt;td>5.200&lt;/td>
&lt;td>5.200&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>16&lt;/td>
&lt;td>370&lt;/td>
&lt;td>18&lt;/td>
&lt;td>9.800&lt;/td>
&lt;td>9.800&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>32&lt;/td>
&lt;td>420&lt;/td>
&lt;td>18&lt;/td>
&lt;td>12.500&lt;/td>
&lt;td>12.200&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>48&lt;/td>
&lt;td>680&lt;/td>
&lt;td>26&lt;/td>
&lt;td>13.800&lt;/td>
&lt;td>7.400&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>64&lt;/td>
&lt;td>1.200&lt;/td>
&lt;td>41&lt;/td>
&lt;td>14.100&lt;/td>
&lt;td>2.100&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>El codo está entre 32 y 48: el throughput sube solo un 10 % (12.500 → 13.800) pero el TTFT
P99 ya viola el SLO de 500 ms y el goodput cae a la mitad. La capacidad operativa defendible
es la de concurrencia 32 (12.200 tok/s útiles). Reportar 14.100 tok/s (concurrencia 64)
sería el throughput máximo con goodput del 15 %.&lt;/p>
&lt;div class="diagram" style="max-width:780px;margin:1rem auto;">
&lt;svg viewBox="0 0 780 260" role="img" aria-label="Frontera de Pareto de motores LLM: throughput en eje X, TTFT P99 en eje Y. Cada motor ocupa un punto distinto del espacio, Dynamo desplaza los puntos hacia arriba y a la derecha." xmlns="http://www.w3.org/2000/svg">
&lt;style>.ax{fill:none;stroke:currentColor;stroke-width:1}.cv{fill:none;stroke:currentColor;stroke-width:1.5}.dsh{fill:none;stroke:currentColor;stroke-width:1;stroke-dasharray:4 3}.tl{font:700 12px sans-serif;fill:currentColor}.ts{font:11px sans-serif;fill:currentColor}.pt{r:6;fill:currentColor}&lt;/style>
&lt;line class="ax" x1="60" y1="30" x2="60" y2="210"/>
&lt;line class="ax" x1="60" y1="210" x2="740" y2="210"/>
&lt;text x="20" y="125" class="ts" transform="rotate(-90 20 125)">TTFT P99 (ms) ↑ mejor abajo&lt;/text>
&lt;text x="360" y="235" class="ts" text-anchor="middle">Throughput (tok/s) → mayor es mejor&lt;/text>
&lt;line class="dsh" x1="60" y1="80" x2="740" y2="80"/>
&lt;text x="66" y="76" class="ts">SLO 500 ms&lt;/text>
&lt;circle class="pt" cx="290" cy="108"/>
&lt;text x="298" y="103" class="tl">vLLM&lt;/text>
&lt;text x="298" y="116" class="ts">12.500 tok/s · 420 ms&lt;/text>
&lt;circle class="pt" cx="380" cy="98"/>
&lt;text x="388" y="93" class="tl">SGLang&lt;/text>
&lt;text x="388" y="106" class="ts">16.200 tok/s · 390 ms&lt;/text>
&lt;circle class="pt" cx="340" cy="118"/>
&lt;text x="348" y="113" class="tl">TRT-LLM&lt;/text>
&lt;text x="348" y="126" class="ts">14.800 tok/s · 480 ms&lt;/text>
&lt;circle class="pt" cx="480" cy="72"/>
&lt;text x="488" y="67" class="tl">vLLM+Dynamo&lt;/text>
&lt;text x="488" y="80" class="ts">18.500 tok/s · 310 ms&lt;/text>
&lt;circle class="pt" cx="580" cy="62"/>
&lt;text x="588" y="57" class="tl">SGLang+Dynamo&lt;/text>
&lt;text x="588" y="70" class="ts">21.000 tok/s · 280 ms&lt;/text>
&lt;circle class="pt" cx="660" cy="85"/>
&lt;text x="554" y="165" class="tl">TRT-LLM+Dynamo&lt;/text>
&lt;text x="554" y="177" class="ts">22.500 tok/s · 350 ms&lt;/text>
&lt;line class="dsh" x1="660" y1="85" x2="610" y2="160"/>
&lt;path class="cv" d="M290,108 Q380,80 480,72 Q580,60 660,85" fill="none"/>
&lt;text x="66" y="210" class="ts">0&lt;/text>
&lt;text x="290" y="225" class="ts">12 K&lt;/text>
&lt;text x="380" y="225" class="ts">16 K&lt;/text>
&lt;text x="480" y="225" class="ts">18,5 K&lt;/text>
&lt;text x="580" y="225" class="ts">21 K&lt;/text>
&lt;text x="660" y="225" class="ts">22,5 K&lt;/text>
&lt;/svg>
&lt;/div>
&lt;hr>
&lt;h2 id="metodología-de-comparación-justa-el-harness-como-constante">Metodología de comparación justa: el harness como constante&lt;/h2>
&lt;p>El protocolo que hace comparables los números entre motores distintos. El motor es la única
variable; todo lo demás es constante y se pinea en el JSON de salida.&lt;/p>
&lt;h3 id="variables-que-se-fijan-constantes-del-experimento">Variables que se fijan (constantes del experimento)&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Variable&lt;/th>
&lt;th>Valor fijado en el experimento de referencia&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Herramienta de carga&lt;/td>
&lt;td>AIPerf v2.x (multi-proceso)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Modelo&lt;/td>
&lt;td>Llama-3.1-70B-Instruct&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Precisión&lt;/td>
&lt;td>FP8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Hardware&lt;/td>
&lt;td>4×H100 SXM 80 GB NVLink&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Dataset&lt;/td>
&lt;td>ShareGPT (distribución ISL/OSL realista)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>SLO&lt;/td>
&lt;td>TTFT P99 &amp;lt; 500 ms, ITL P50 &amp;lt; 30 ms&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Warm-up&lt;/td>
&lt;td>200 peticiones descartadas antes de medir&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Sweep&lt;/td>
&lt;td>concurrencias 1, 4, 8, 16, 32, 48, 64&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Métrica principal&lt;/td>
&lt;td>goodput (tok/s útiles bajo SLO)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="pasos-del-harness">Pasos del harness&lt;/h3>
&lt;ol>
&lt;li>Desplegar el motor con la config exacta (flags pineados, versión fijada).&lt;/li>
&lt;li>Warm-up: 200 peticiones; descartar resultados.&lt;/li>
&lt;li>Sweep de concurrencia: &lt;code>aiperf profile --concurrency-range 1:64:step&lt;/code> con AIPerf.&lt;/li>
&lt;li>Extender el sweep más allá del codo (hasta que el goodput caiga por debajo del 50 %).&lt;/li>
&lt;li>Recoger JSON: TTFT P50/P99, ITL P50, throughput bruto, goodput.&lt;/li>
&lt;li>Cambiar &lt;strong>solo el motor&lt;/strong>; repetir pasos 1–5.&lt;/li>
&lt;li>Comparar la columna goodput entre filas.&lt;/li>
&lt;/ol>
&lt;p>El &lt;a href="https://blog.lo0.es/posts/guidellm-validacion-slo-bajo-carga/">sweep con GuideLLM&lt;/a> es equivalente
para validación de SLO; AIPerf es preferible para comparativas de motores porque su
&lt;code>estimatedCapacity&lt;/code> automático normaliza el punto de saturación. Los dos pueden usarse:
GuideLLM para el SLO operativo, AIPerf para la capacidad de referencia.&lt;/p>
&lt;h3 id="formato-de-salida-reproducible">Formato de salida reproducible&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;harness&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;aiperf&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;harness_version&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2.x&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;model&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Llama-3.1-70B-Instruct&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;precision&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;FP8&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;hardware&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;4xH100_SXM_80GB_NVLink&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;dataset&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;sharegpt&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;slo&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="nt">&amp;#34;ttft_p99_ms&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">500&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;itl_p50_ms&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">30&lt;/span>&lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;motor&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;vllm&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;motor_version&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;0.9.x&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;concurrency_sweep&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">16&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">32&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">64&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;results_at_knee&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;concurrency&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">32&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;ttft_p50_ms&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">210&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;ttft_p99_ms&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">420&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;itl_p50_ms&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">18&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;throughput_tok_s&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">12500&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;goodput_tok_s&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">12200&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Este JSON versionado es el dato auditable: cualquiera reproduce la cifra con la misma
herramienta, versión, modelo, hardware y carga.&lt;/p>
&lt;hr>
&lt;h2 id="estado-del-arte-2026-madurez-relativa">Estado del arte 2026: madurez relativa&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Dimensión&lt;/th>
&lt;th>vLLM&lt;/th>
&lt;th>SGLang&lt;/th>
&lt;th>TRT-LLM&lt;/th>
&lt;th>Dynamo&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Madurez de producción&lt;/strong>&lt;/td>
&lt;td>Alta (3+ años)&lt;/td>
&lt;td>Media-alta (2 años)&lt;/td>
&lt;td>Alta (NVIDIA)&lt;/td>
&lt;td>Media (1.0 GA mar-2026)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Velocidad de release&lt;/strong>&lt;/td>
&lt;td>Semanal&lt;/td>
&lt;td>Semanal&lt;/td>
&lt;td>Mensual&lt;/td>
&lt;td>Bisemanal&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Ecosistema de integraciones&lt;/strong>&lt;/td>
&lt;td>Muy amplio (Ray, k8s, llm-d, Dynamo, NIM)&lt;/td>
&lt;td>Amplio (Dynamo, k8s)&lt;/td>
&lt;td>NVIDIA-centrado (Triton, NIM)&lt;/td>
&lt;td>NVIDIA-centrado&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Facilidad de operación&lt;/strong>&lt;/td>
&lt;td>Alta (pip install, OpenAI API)&lt;/td>
&lt;td>Alta&lt;/td>
&lt;td>Media (requiere compilar engines)&lt;/td>
&lt;td>Media-baja (multi-nodo, etcd/NATS)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Hardware no-NVIDIA&lt;/strong>&lt;/td>
&lt;td>Si (AMD, Intel, TPU)&lt;/td>
&lt;td>Si (AMD)&lt;/td>
&lt;td>No&lt;/td>
&lt;td>No&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Disaggregated serving&lt;/strong>&lt;/td>
&lt;td>Beta&lt;/td>
&lt;td>Estable&lt;/td>
&lt;td>Estable&lt;/td>
&lt;td>Primera clase&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Multi-LoRA dinámica&lt;/strong>&lt;/td>
&lt;td>Estable&lt;/td>
&lt;td>Estable&lt;/td>
&lt;td>Beta&lt;/td>
&lt;td>Estable (vía vLLM/SGLang)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Structured output&lt;/strong>&lt;/td>
&lt;td>Estable&lt;/td>
&lt;td>Estable (FSM)&lt;/td>
&lt;td>Beta&lt;/td>
&lt;td>Estable (vía motor)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Soporte comunidad OSS&lt;/strong>&lt;/td>
&lt;td>Muy alto (&amp;gt;30 K GitHub stars)&lt;/td>
&lt;td>Alto (~20 K stars)&lt;/td>
&lt;td>Alto (~10 K stars)&lt;/td>
&lt;td>Creciente (6,8 K stars)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="tabla-de-decisión-pareto-cuándo-elegir-cada-motor">Tabla de decisión Pareto: cuándo elegir cada motor&lt;/h2>
&lt;p>Sin prosa; la decisión como tabla de criterios y resultado.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Criterio de selección&lt;/th>
&lt;th>Motor recomendado&lt;/th>
&lt;th>Justificación cuantitativa&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Nodo único, prototipo rápido, equipo sin experiencia en LLM serving&lt;/td>
&lt;td>&lt;strong>vLLM&lt;/strong>&lt;/td>
&lt;td>pip install + OpenAI API en minutos; soporte de comunidad más amplio&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Workload con prefijos compartidos largos (RAG, few-shot, system prompts &amp;gt; 512 tok)&lt;/td>
&lt;td>&lt;strong>SGLang&lt;/strong>&lt;/td>
&lt;td>RadixAttention: hasta 6,4× más throughput vs baseline sin prefix caching&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Máximo throughput en NVIDIA, sin portabilidad, equipo con experiencia TRT&lt;/td>
&lt;td>&lt;strong>TRT-LLM&lt;/strong>&lt;/td>
&lt;td>Kernels fusionados + FP8 nativo: ITL 9–12 ms vs 18–22 ms de vLLM en igual hardware&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Multi-nodo (&amp;gt; 8 GPUs), tráfico mixto prefill-intensivo/decode-intensivo&lt;/td>
&lt;td>&lt;strong>Dynamo + SGLang&lt;/strong>&lt;/td>
&lt;td>Disaggregated P/D: hasta 7× throughput adicional en Blackwell; 2× TTFT con KV-aware routing&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Hardware AMD ROCm o Intel Gaudi&lt;/td>
&lt;td>&lt;strong>vLLM&lt;/strong>&lt;/td>
&lt;td>Único motor SOTA con soporte estable no-NVIDIA&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Structured output + alta concurrencia&lt;/td>
&lt;td>&lt;strong>SGLang&lt;/strong>&lt;/td>
&lt;td>FSM comprimida: decode guiado sin overhead apreciable&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Multi-LoRA dinámica estable en producción&lt;/td>
&lt;td>&lt;strong>vLLM o SGLang&lt;/strong>&lt;/td>
&lt;td>TRT-LLM multi-LoRA aún en beta (jun-2026)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ecosistema Hugging Face, modelos &amp;lt; 13B&lt;/td>
&lt;td>&lt;strong>HF TGI v3&lt;/strong>&lt;/td>
&lt;td>Integración directa HF Hub; latencia competitiva en modelos pequeños&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Máxima eficiencia energética (J/token) en NVIDIA&lt;/td>
&lt;td>&lt;strong>TRT-LLM&lt;/strong>&lt;/td>
&lt;td>Kernels de menor overhead → menos J/token a iso-throughput&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="quantización-efecto-en-throughput-y-calidad">Quantización: efecto en throughput y calidad&lt;/h2>
&lt;p>Las cuatro opciones principales en orden de velocidad decreciente y calidad creciente:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Formato&lt;/th>
&lt;th>Throughput relativo (H100)&lt;/th>
&lt;th>Degradación de calidad (perplexidad)&lt;/th>
&lt;th>Motores con soporte estable&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>NVFP4 / MXFP4&lt;/strong>&lt;/td>
&lt;td>~2,2× vs FP16&lt;/td>
&lt;td>1–3 % en MMLU&lt;/td>
&lt;td>TRT-LLM (Blackwell), vLLM (experimental)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>FP8 (W8A8)&lt;/strong>&lt;/td>
&lt;td>~1,7× vs FP16&lt;/td>
&lt;td>&amp;lt; 1 % en MMLU&lt;/td>
&lt;td>vLLM, SGLang, TRT-LLM&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>INT4 AWQ&lt;/strong>&lt;/td>
&lt;td>~1,5× vs FP16&lt;/td>
&lt;td>1–2 % en MMLU&lt;/td>
&lt;td>vLLM, SGLang, TRT-LLM&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>GPTQ (INT4)&lt;/strong>&lt;/td>
&lt;td>~1,4× vs FP16&lt;/td>
&lt;td>1–3 % en MMLU&lt;/td>
&lt;td>vLLM, SGLang&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>FP16 (baseline)&lt;/strong>&lt;/td>
&lt;td>1,0×&lt;/td>
&lt;td>0 %&lt;/td>
&lt;td>Todos&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>FP8 es el estándar de facto en Hopper para producción: throughput 1,7× con degradación
inferior al 1 %. El artículo de &lt;a href="https://blog.lo0.es/posts/quantization-fundamentos-inferencia/">cuantización en profundidad&lt;/a>
desarrolla el trade-off calidad/velocidad por formato y arquitectura de modelo.&lt;/p>
&lt;hr>
&lt;h2 id="disaggregated-serving-cuándo-el-overhead-vale-la-pena">Disaggregated serving: cuándo el overhead vale la pena&lt;/h2>
&lt;p>La separación prefill/decode en pools independientes introduce latencia de transferencia de
KV tensors entre nodos (NIXL sobre NVLink o InfiniBand). El overhead es rentable cuando:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Condición&lt;/th>
&lt;th>Efecto del disaggregated serving&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>ISL media &amp;gt; 1.024 tokens&lt;/td>
&lt;td>Prefill domina; separar pools evita que bloquee decode&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ratio prefill/decode &amp;gt; 3:1 en tiempo&lt;/td>
&lt;td>El pool de decode se queda idle esperando al prefill&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Tráfico mixto (burst de prefill + cola de decode)&lt;/td>
&lt;td>Escalado independiente de cada pool por SLA&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;lt; 512 tokens ISL, prompts únicos&lt;/td>
&lt;td>Overhead de transferencia supera el beneficio; motor agregado suficiente&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Dynamo cuantifica el punto de break-even: el serving desagregado es rentable cuando el
tiempo de transferencia de KV tensors (función del ISL y el ancho de banda NVLink/IB) es
inferior al tiempo que el decode-worker esperaría al prefill-worker en modo agregado. En
4×H100 con ISL de 512 tok, el break-even ocurre con ratio prefill/decode &amp;gt; 2,5:1. El
artículo de &lt;a href="https://blog.lo0.es/posts/disaggregated-serving-prefill-decode/">serving desagregado&lt;/a> desarrolla
la fórmula completa.&lt;/p>
&lt;hr>
&lt;h2 id="mlperf-inference-v51-cifras-de-referencia-cross-vendor">MLPerf Inference v5.1: cifras de referencia cross-vendor&lt;/h2>
&lt;p>MLPerf Inference v5.1 (septiembre 2025) es el patrón de comparabilidad inter-fabricante.
Escenario Server (Llama-3.1-70B, tokens/s):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Submitter&lt;/th>
&lt;th>Hardware&lt;/th>
&lt;th>Escenario&lt;/th>
&lt;th>Throughput (tok/s)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Red Hat (vLLM)&lt;/td>
&lt;td>1×H100 80 GB&lt;/td>
&lt;td>Server&lt;/td>
&lt;td>5.103&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Red Hat (vLLM)&lt;/td>
&lt;td>1×L40S&lt;/td>
&lt;td>Server&lt;/td>
&lt;td>1.207&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>NVIDIA (TRT-LLM)&lt;/td>
&lt;td>8×H100 SXM&lt;/td>
&lt;td>Server&lt;/td>
&lt;td>~52.000 (estimado)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Las cifras de MLPerf no son directamente comparables con los benchmarks internos anteriores
(harness diferente, escenario Server de MLPerf con distribución Poisson y SLO fijos). Son
útiles para comparar fabricantes bajo las mismas reglas; no para dimensionar un caso concreto.
Para eso, el sweep propio con AIPerf/GuideLLM sobre el endpoint objetivo.&lt;/p>
&lt;hr>
&lt;h2 id="variables-que-el-benchmark-no-captura">Variables que el benchmark no captura&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Variable omitida&lt;/th>
&lt;th>Efecto en producción&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Latencia de red (gateway, load balancer)&lt;/td>
&lt;td>Puede añadir 20–100 ms al TTFT medido en el servidor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Tiempo de compilación de engine (TRT-LLM)&lt;/td>
&lt;td>Horas por modelo×precisión×hardware; penaliza cold starts y CI&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Tiempo de carga de pesos en GPU&lt;/td>
&lt;td>Relevante en autoescalado; ModelExpress (Dynamo) reduce 7×&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Costo operativo del sistema (Dynamo vs motor simple)&lt;/td>
&lt;td>Dynamo requiere etcd/NATS, Rust runtime, equipo más especializado&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Calidad de respuesta&lt;/td>
&lt;td>Rendimiento no implica calidad; medir con lm-evaluation-harness (artículo B7)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Energía (J/token)&lt;/td>
&lt;td>No sale del benchmark de throughput; requiere DCGM simultáneo&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="fuentes">Fuentes&lt;/h2>
&lt;ul>
&lt;li>vLLM · documentación oficial — &lt;a href="https://docs.vllm.ai/en/latest/">https://docs.vllm.ai/en/latest/&lt;/a>&lt;/li>
&lt;li>vLLM · blog de rendimiento (v0.6.0, 2,7× throughput) — &lt;a href="https://blog.vllm.ai/2024/09/05/perf-update.html">https://blog.vllm.ai/2024/09/05/perf-update.html&lt;/a>&lt;/li>
&lt;li>vLLM · disaggregated prefill (experimental) — &lt;a href="https://docs.vllm.ai/en/latest/features/disagg_prefill/">https://docs.vllm.ai/en/latest/features/disagg_prefill/&lt;/a>&lt;/li>
&lt;li>SGLang · documentación oficial — &lt;a href="https://docs.sglang.io/">https://docs.sglang.io/&lt;/a>&lt;/li>
&lt;li>SGLang · paper RadixAttention (LMSYS, 2024) — &lt;a href="https://arxiv.org/pdf/2312.07104">https://arxiv.org/pdf/2312.07104&lt;/a>&lt;/li>
&lt;li>SGLang · blog LMSYS sobre Llama-3 serving — &lt;a href="https://www.lmsys.org/blog/2024-07-25-sglang-llama3/">https://www.lmsys.org/blog/2024-07-25-sglang-llama3/&lt;/a>&lt;/li>
&lt;li>NVIDIA TensorRT-LLM · GitHub — &lt;a href="https://github.com/NVIDIA/TensorRT-LLM">https://github.com/NVIDIA/TensorRT-LLM&lt;/a>&lt;/li>
&lt;li>NVIDIA TensorRT-LLM · overview y release notes — &lt;a href="https://nvidia.github.io/TensorRT-LLM/overview.html">https://nvidia.github.io/TensorRT-LLM/overview.html&lt;/a>&lt;/li>
&lt;li>NVIDIA TensorRT-LLM · quantización — &lt;a href="https://nvidia.github.io/TensorRT-LLM/features/quantization.html">https://nvidia.github.io/TensorRT-LLM/features/quantization.html&lt;/a>&lt;/li>
&lt;li>NVIDIA Dynamo · GitHub (ai-dynamo/dynamo) — &lt;a href="https://github.com/ai-dynamo/dynamo">https://github.com/ai-dynamo/dynamo&lt;/a>&lt;/li>
&lt;li>NVIDIA Dynamo · documentación oficial — &lt;a href="https://docs.nvidia.com/dynamo/latest">https://docs.nvidia.com/dynamo/latest&lt;/a>&lt;/li>
&lt;li>NVIDIA Dynamo · disaggregated serving — &lt;a href="https://docs.dynamo.nvidia.com/dynamo/design-docs/disaggregated-serving">https://docs.dynamo.nvidia.com/dynamo/design-docs/disaggregated-serving&lt;/a>&lt;/li>
&lt;li>Cerebrium · benchmark vLLM vs SGLang vs TRT-LLM (Llama 3.1-70B) — &lt;a href="https://cerebrium.ai/blog/benchmarking-vllm-sglang-tensorrt-for-llama-3-1-api">https://cerebrium.ai/blog/benchmarking-vllm-sglang-tensorrt-for-llama-3-1-api&lt;/a>&lt;/li>
&lt;li>Spheron · vLLM vs TRT-LLM vs SGLang H100 benchmarks 2026 — &lt;a href="https://www.spheron.network/blog/vllm-vs-tensorrt-llm-vs-sglang-benchmarks/">https://www.spheron.network/blog/vllm-vs-tensorrt-llm-vs-sglang-benchmarks/&lt;/a>&lt;/li>
&lt;li>MLCommons · MLPerf Inference v5.1 results — &lt;a href="https://mlcommons.org/2025/09/mlperf-inference-v5-1-results/">https://mlcommons.org/2025/09/mlperf-inference-v5-1-results/&lt;/a>&lt;/li>
&lt;li>Red Hat · MLPerf Inference v5.1 con vLLM — &lt;a href="https://www.redhat.com/en/blog/efficient-and-reproducible-llm-inference-red-hat-mlperf-inference-v51-results">https://www.redhat.com/en/blog/efficient-and-reproducible-llm-inference-red-hat-mlperf-inference-v51-results&lt;/a>&lt;/li>
&lt;li>arXiv 2605.24217 · sesgo sistemático en benchmarks de inferencia LLM — &lt;a href="https://arxiv.org/html/2605.24217">https://arxiv.org/html/2605.24217&lt;/a>&lt;/li>
&lt;li>IETF Draft · LLM Benchmarking Methodology (enero 2026) — &lt;a href="https://www.ietf.org/archive/id/draft-gaikwad-llm-benchmarking-methodology-00.html">https://www.ietf.org/archive/id/draft-gaikwad-llm-benchmarking-methodology-00.html&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>