<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Idle on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/idle/</link><description>Recent content in Idle on lo0 — Blog Técnico</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Mon, 15 Jun 2026 05:00:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/tags/idle/index.xml" rel="self" type="application/rss+xml"/><item><title>GPU idle: el coste que no aparece en ninguna factura pero lo paga todo el TCO</title><link>https://blog.lo0.es/posts/utilizacion-gpu-como-finops/</link><pubDate>Mon, 15 Jun 2026 05:00:00 +0200</pubDate><guid>https://blog.lo0.es/posts/utilizacion-gpu-como-finops/</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).&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>El coste por token de inferencia on-premise es ( \text{€/GPU-hora} \div \text{throughput} ). El throughput es función directa de la &lt;strong>ocupación útil&lt;/strong> de la GPU. En un nodo genérico de 4×H100 SXM con un coste de referencia de ~11 € por GPU-hora (amortización + energía + infraestructura), la curva de coste sobre ocupación tiene este aspecto:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Ocupación útil&lt;/th>
&lt;th>Throughput efectivo (tok/s)&lt;/th>
&lt;th>Coste por 1M tokens&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>20 %&lt;/td>
&lt;td>~700&lt;/td>
&lt;td>~43 €&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>40 %&lt;/td>
&lt;td>~1 400&lt;/td>
&lt;td>~21 €&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>70 %&lt;/td>
&lt;td>~2 500&lt;/td>
&lt;td>~12 €&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>85 % (techo práctico)&lt;/td>
&lt;td>~3 000&lt;/td>
&lt;td>~10 €&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Doblar la ocupación del 20 % al 40 % recorta el coste por token a la mitad, sin comprar más hierro.&lt;/strong> A 70 % el coste compite con proveedores cloud europeos (~2,2 €/GPU-hora en on-demand Scaleway). A 20 % on-prem es cuatro veces más caro que alquilar. La palanca no es el modelo, ni la precisión: es cuántas GPU-horas de pago producen tokens de servicio.&lt;/p>
&lt;hr>
&lt;h2 id="1--la-identidad-fundamental">1 · La identidad fundamental&lt;/h2>
&lt;p>El coste por millón de tokens (CPM) en inferencia propia no es un precio de lista. Es:&lt;/p>
&lt;p>$$
\text{CPM} = \frac{C_{\text{GPU}} \cdot N_{\text{GPU}}}{T_{\text{ef}} \times 3600 / 10^6}
$$&lt;/p>
&lt;p>donde ( C_{\text{GPU}} ) es el coste por GPU-hora (€/h), ( N_{\text{GPU}} ) el número de GPUs asignadas al servicio y ( T_{\text{ef}} ) el throughput efectivo (tok/s). Despejando la dependencia con la ocupación:&lt;/p>
&lt;p>$$
T_{\text{ef}} = T_{\text{pico}} \times \rho
$$&lt;/p>
&lt;p>siendo ( \rho \in [0,1] ) la &lt;strong>tasa de ocupación útil&lt;/strong> (fracción del tiempo en que la GPU está procesando tokens de servicio real). La identidad resultante:&lt;/p>
&lt;p>$$
\text{CPM} = \frac{C_{\text{GPU}} \cdot N_{\text{GPU}}}{T_{\text{pico}} \times \rho \times 3600 / 10^6}
$$&lt;/p>
&lt;p>La consecuencia directa: CPM es &lt;strong>inversamente proporcional a&lt;/strong> ( \rho ). Duplicar ( \rho ) divide CPM por dos. El numerador (coste del hierro) no cambia.&lt;/p>
&lt;p>Los posts &lt;a href="https://blog.lo0.es/posts/coste-por-token-y-por-request/">coste-por-token-y-por-request&lt;/a> y &lt;a href="https://blog.lo0.es/posts/capacity-planning-inferencia-llm-on-premise/">capacity-planning-inferencia-llm-on-premise&lt;/a> cubren cómo calcular ( C_{\text{GPU}} ) y el throughput pico de referencia. Este artículo se ocupa de ( \rho ): cómo medirlo, qué lo limita y cómo subirlo.&lt;/p>
&lt;hr>
&lt;h2 id="2--por-qué-la-métrica-estándar-engaña-dcgm_fi_dev_gpu_util">2 · Por qué la métrica estándar engaña: &lt;code>DCGM_FI_DEV_GPU_UTIL&lt;/code>&lt;/h2>
&lt;p>El campo &lt;code>DCGM_FI_DEV_GPU_UTIL&lt;/code> (field ID 203) aparece en &lt;code>nvidia-smi&lt;/code> como «GPU-Util». Su definición oficial en la documentación DCGM:&lt;/p>
&lt;blockquote>
&lt;p>«GPU Utilization» — porcentaje de tiempo durante el que uno o más kernels estaban ejecutándose en la GPU.&lt;/p>
&lt;/blockquote>
&lt;p>El problema para inferencia LLM: &lt;strong>la fase de decode es memory-bound&lt;/strong>. La GPU corre un kernel de lectura de pesos desde HBM token a token; por tanto &lt;code>GPU_UTIL&lt;/code> registra cercano al 100 % aunque los tensor cores estén al 15 % de su capacidad. El campo mide &lt;em>actividad&lt;/em>, no &lt;em>trabajo útil&lt;/em>.&lt;/p>
&lt;p>La distinción es crítica para FinOps: un operador que ve &lt;code>GPU_UTIL 98 %&lt;/code> asume «GPU saturada, no cabe más carga». La realidad puede ser «los tensor cores están al 20 % y el cuello de botella es la HBM», lo que abre espacio a continuous batching o bin-packing adicional.&lt;/p>
&lt;p>Las métricas que miden ocupación real son las del subsistema &lt;code>_FI_PROF_*&lt;/code>, disponibles en DCGM 3.x con el módulo de profiling activado:&lt;/p>
&lt;h3 id="tabla-de-campos-dcgm-relevantes">Tabla de campos DCGM relevantes&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Campo DCGM&lt;/th>
&lt;th>Field ID&lt;/th>
&lt;th>Qué mide&lt;/th>
&lt;th>Unidad&lt;/th>
&lt;th>Nota operativa&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_DEV_GPU_UTIL&lt;/code>&lt;/td>
&lt;td>203&lt;/td>
&lt;td>% tiempo con ≥1 kernel activo&lt;/td>
&lt;td>%&lt;/td>
&lt;td>&lt;strong>Engañoso&lt;/strong> en decode LLM&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_PROF_SM_ACTIVE&lt;/code>&lt;/td>
&lt;td>1002&lt;/td>
&lt;td>Ratio de ciclos con ≥1 warp activo por SM&lt;/td>
&lt;td>0–1&lt;/td>
&lt;td>Actividad de compute, no ocupación&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_PROF_SM_OCCUPANCY&lt;/code>&lt;/td>
&lt;td>1003&lt;/td>
&lt;td>Warps residentes / máximo teórico por SM&lt;/td>
&lt;td>0–1&lt;/td>
&lt;td>Paralelismo intra-SM real&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_PROF_PIPE_TENSOR_ACTIVE&lt;/code>&lt;/td>
&lt;td>1004&lt;/td>
&lt;td>% ciclos con tensor cores (HMMA) activos&lt;/td>
&lt;td>0–1&lt;/td>
&lt;td>La métrica de eficiencia compute real&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_PROF_DRAM_ACTIVE&lt;/code>&lt;/td>
&lt;td>1005&lt;/td>
&lt;td>% ciclos con HBM transfiriendo&lt;/td>
&lt;td>0–1&lt;/td>
&lt;td>Saturación de memoria&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_PROF_PCIE_TX_BYTES&lt;/code>&lt;/td>
&lt;td>—&lt;/td>
&lt;td>Bytes TX por PCIe&lt;/td>
&lt;td>bytes/s&lt;/td>
&lt;td>Útil en inferencia PCIe&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_DEV_FB_USED&lt;/code>&lt;/td>
&lt;td>252&lt;/td>
&lt;td>HBM usada&lt;/td>
&lt;td>MiB&lt;/td>
&lt;td>Presupuesto VRAM&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_DEV_POWER_USAGE&lt;/code>&lt;/td>
&lt;td>—&lt;/td>
&lt;td>Consumo real&lt;/td>
&lt;td>W&lt;/td>
&lt;td>Para coste energético real&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_DEV_CLOCK_THROTTLE_REASONS&lt;/code>&lt;/td>
&lt;td>—&lt;/td>
&lt;td>Bitmap causas de throttle&lt;/td>
&lt;td>bitmap&lt;/td>
&lt;td>Detecta degradación silenciosa&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Los campos &lt;code>_PROF_*&lt;/code> requieren el módulo de profiling de DCGM y permisos adecuados del driver. Se documentan exhaustivamente en la referencia de field IDs de NVIDIA DCGM y en el post hermano &lt;a href="https://blog.lo0.es/posts/observabilidad-gpu-dcgm-llm/">observabilidad-gpu-dcgm-llm&lt;/a>.&lt;/p>
&lt;h3 id="lectura-característica-en-decode-llm-llama-70b-fp8-en-h100">Lectura característica en decode LLM (Llama 70B FP8 en H100)&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Métrica&lt;/th>
&lt;th>Valor típico decode&lt;/th>
&lt;th>Interpretación&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_DEV_GPU_UTIL&lt;/code>&lt;/td>
&lt;td>95–99 %&lt;/td>
&lt;td>&lt;strong>Mentira&lt;/strong>: hay kernel activo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_PROF_SM_ACTIVE&lt;/code>&lt;/td>
&lt;td>0,45–0,65&lt;/td>
&lt;td>SMs con warps el 45–65 % del tiempo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_PROF_SM_OCCUPANCY&lt;/code>&lt;/td>
&lt;td>0,30–0,55&lt;/td>
&lt;td>Warps residentes al 30–55 % del máximo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_PROF_PIPE_TENSOR_ACTIVE&lt;/code>&lt;/td>
&lt;td>0,10–0,25&lt;/td>
&lt;td>Tensor cores activos solo el 10–25 %&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DCGM_FI_PROF_DRAM_ACTIVE&lt;/code>&lt;/td>
&lt;td>0,75–0,90&lt;/td>
&lt;td>HBM ocupada el 75–90 % del tiempo&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Lectura: el decode es &lt;strong>memory-bound&lt;/strong>. Los pesos del modelo se cargan desde HBM para cada token; la HBM está saturada pero los tensor cores esperan. Toda la «utilización» del &lt;code>nvidia-smi&lt;/code> viene de lecturas de memoria, no de cómputo.&lt;/p>
&lt;hr>
&lt;h2 id="3--mfu-y-hfu-la-ocupación-expresada-en-flops">3 · MFU y HFU: la ocupación expresada en FLOPs&lt;/h2>
&lt;p>La métrica canónica de eficiencia de cómputo es el &lt;strong>MFU (Model FLOPs Utilization)&lt;/strong>, definida en el paper PaLM (Chowdhery et al., arXiv 2204.02311, sección 4):&lt;/p>
&lt;p>$$
\text{MFU} = \frac{T_{\text{obs}} \times C_{\text{modelo}}}{P_{\text{pico}}}
$$&lt;/p>
&lt;p>donde ( T_{\text{obs}} ) es el throughput observado (tok/s) y ( P_{\text{pico}} ) es el rendimiento teórico pico del hardware (FLOP/s).&lt;/p>
&lt;p>donde ( C_{\text{modelo}} ) es el número de FLOPs por token en un forward pass completo. Para un transformer denso con ( P ) parámetros, la aproximación habitual (forward + backward = 6P FLOPs por token; solo forward = 2P):&lt;/p>
&lt;p>$$
C_{\text{modelo}} \approx 2P \quad \text{(inferencia)}
$$&lt;/p>
&lt;p>$$
C_{\text{modelo}} \approx 6P \quad \text{(entrenamiento, forward + backward)}
$$&lt;/p>
&lt;p>El &lt;strong>HFU (Hardware FLOPs Utilization)&lt;/strong> mide los FLOPs &lt;strong>realmente ejecutados&lt;/strong> en hardware, incluyendo recomputación de activaciones (gradient checkpointing). En entrenamiento con recompute:&lt;/p>
&lt;p>$$
C_{\text{hardware}} \approx 8P \quad \text{(forward × 2 + backward × 4)}
$$&lt;/p>
&lt;p>por tanto HFU &amp;gt; MFU cuando hay recompute; son idénticos sin recompute.&lt;/p>
&lt;h3 id="valores-típicos-de-mfu">Valores típicos de MFU&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Régimen&lt;/th>
&lt;th>Hardware&lt;/th>
&lt;th>MFU típico&lt;/th>
&lt;th>Régimen limitante&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Entrenamiento (large batch, BF16)&lt;/td>
&lt;td>H100 SXM&lt;/td>
&lt;td>35–50 %&lt;/td>
&lt;td>compute-bound&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Entrenamiento PaLM 540B&lt;/td>
&lt;td>TPU v4&lt;/td>
&lt;td>46,2 %&lt;/td>
&lt;td>compute-bound&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Inferencia prefill (batch grande)&lt;/td>
&lt;td>H100 SXM&lt;/td>
&lt;td>25–45 %&lt;/td>
&lt;td>compute-bound&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Inferencia decode (bs=1)&lt;/td>
&lt;td>H100 SXM&lt;/td>
&lt;td>3–8 %&lt;/td>
&lt;td>memory-bound&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Inferencia decode (continuous batching, bs=32–64)&lt;/td>
&lt;td>H100 SXM&lt;/td>
&lt;td>15–30 %&lt;/td>
&lt;td>memory-bound atenuado&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>El decode con batch size 1 tiene MFU de un solo dígito porque el hardware pasa la mayor parte del tiempo esperando que la HBM entregue pesos. Subir el batch size (continuous batching) amortiza la lectura de pesos entre más tokens simultáneos y sube el MFU.&lt;/p>
&lt;h3 id="el-modelo-roofline">El modelo Roofline&lt;/h3>
&lt;p>El roofline sitúa cada operación en el espacio (intensidad aritmética, throughput):&lt;/p>
&lt;div class="diagram" style="max-width:680px;margin:1rem auto;">
&lt;svg viewBox="0 0 680 320" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Modelo Roofline para inferencia LLM: prefill compute-bound vs decode memory-bound">
&lt;style>.ax{stroke:currentColor;stroke-width:1.4;fill:none}.lbl{font:11px sans-serif;fill:currentColor}.ttl{font:700 13px sans-serif;fill:currentColor}.roof{stroke:currentColor;stroke-width:2;fill:none}.pt{fill:currentColor}&lt;/style>
&lt;text x="340" y="22" text-anchor="middle" class="ttl">Roofline: prefill vs decode en H100 SXM&lt;/text>
&lt;line x1="60" y1="270" x2="640" y2="270" class="ax"/>
&lt;line x1="60" y1="270" x2="60" y2="30" class="ax"/>
&lt;text x="350" y="298" text-anchor="middle" class="lbl">Intensidad aritmética (FLOP/byte)&lt;/text>
&lt;text x="14" y="155" text-anchor="middle" class="lbl" transform="rotate(-90 14 155)">Throughput (TFLOP/s)&lt;/text>
&lt;line x1="60" y1="270" x2="220" y2="60" class="roof"/>
&lt;line x1="220" y1="60" x2="640" y2="60" class="roof"/>
&lt;text x="230" y="52" class="lbl">~990 TFLOP/s (H100 BF16)&lt;/text>
&lt;text x="65" y="200" class="lbl" fill="currentColor">banda mem.&lt;/text>
&lt;text x="65" y="213" class="lbl" fill="currentColor">~3,35 TB/s&lt;/text>
&lt;line x1="215" y1="50" x2="215" y2="270" stroke="currentColor" stroke-width="1" stroke-dasharray="4 3"/>
&lt;text x="200" y="284" class="lbl">~295&lt;/text>
&lt;text x="148" y="284" class="lbl">FLOP/byte ridge&lt;/text>
&lt;circle cx="130" cy="175" r="7" class="pt"/>
&lt;text x="138" y="171" class="lbl">decode bs=1&lt;/text>
&lt;text x="138" y="184" class="lbl">MFU ~5 %&lt;/text>
&lt;circle cx="185" cy="120" r="7" class="pt"/>
&lt;text x="193" y="116" class="lbl">decode bs=32&lt;/text>
&lt;text x="193" y="129" class="lbl">MFU ~20 %&lt;/text>
&lt;circle cx="300" cy="65" r="7" class="pt"/>
&lt;text x="308" y="61" class="lbl">prefill bs=128&lt;/text>
&lt;text x="308" y="74" class="lbl">MFU ~38 %&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>El decode con batch size 1 cae en la zona memory-bound de la izquierda del ridge point. Subir el batch (continuous batching) desplaza el punto hacia la derecha y arriba, acercándolo al roofline.&lt;/p>
&lt;hr>
&lt;h2 id="4--sensibilidad-del-tco-a-la-ocupación">4 · Sensibilidad del TCO a la ocupación&lt;/h2>
&lt;p>Hipótesis del ejemplo: nodo genérico con &lt;strong>4×H100 SXM 80 GB&lt;/strong>, coste total del nodo ~44 €/hora (amortización 5 años de ~220 000 €, energía ~4×700 W a ~0,12 €/kWh, más infraestructura rack/colocation; ver &lt;a href="https://blog.lo0.es/posts/coste-por-token-y-por-request/">coste-por-token-y-por-request&lt;/a> para el detalle de la identidad). Throughput pico de referencia con Llama 70B FP8 + continuous batching: ~3 500 tok/s agregado.&lt;/p>
&lt;p>$$
\text{CPM}(\rho) = \frac{44\ \text{€/h}}{3500 \times \rho \times 3600 / 10^6}
= \frac{44 \times 10^6}{3500 \times \rho \times 3600}
= \frac{3{,}49}{\rho}\ \text{€/1M tok}
$$&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Ocupación ( \rho )&lt;/th>
&lt;th>Throughput efectivo (tok/s)&lt;/th>
&lt;th>CPM on-prem&lt;/th>
&lt;th>CPM cloud on-demand (~2,2 €/GPU-h)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>20 %&lt;/td>
&lt;td>700&lt;/td>
&lt;td>&lt;strong>~17,5 €&lt;/strong>&lt;/td>
&lt;td>~6,3 €&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>40 %&lt;/td>
&lt;td>1 400&lt;/td>
&lt;td>&lt;strong>~8,7 €&lt;/strong>&lt;/td>
&lt;td>~6,3 €&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>60 %&lt;/td>
&lt;td>2 100&lt;/td>
&lt;td>&lt;strong>~5,8 €&lt;/strong>&lt;/td>
&lt;td>~6,3 €&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>70 %&lt;/td>
&lt;td>2 450&lt;/td>
&lt;td>&lt;strong>~5,0 €&lt;/strong>&lt;/td>
&lt;td>~6,3 €&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>85 %&lt;/td>
&lt;td>2 975&lt;/td>
&lt;td>&lt;strong>~4,1 €&lt;/strong>&lt;/td>
&lt;td>~6,3 €&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Punto de cruce on-prem / cloud&lt;/strong>: con este hardware de ejemplo, la ventaja de coste on-prem respecto a un cloud europeo comparable empieza en ( \rho \approx 55\text{-}60,% ). Por debajo, el idle convierte on-prem en más caro que alquilar. La columna de cloud es fija porque el cloud factura por hora usada, no por el throughput que se extrae de ella.&lt;/p>
&lt;blockquote>
&lt;p>Cifras de ejemplo con hardware genérico. Los números reales dependen del precio de la amortización, el coste de la energía local, el modelo y la precisión. La estructura de la curva —CPM inversamente proporcional a ( \rho )— es universal.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="5--métricas-de-idle-dónde-se-pierde-la-ocupación">5 · Métricas de idle: dónde se pierde la ocupación&lt;/h2>
&lt;p>Antes de aplicar palancas, hay que saber qué tipo de idle domina. Tres categorías:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tipo de idle&lt;/th>
&lt;th>Síntoma en métricas&lt;/th>
&lt;th>Causa habitual&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Idle scheduling&lt;/strong>&lt;/td>
&lt;td>&lt;code>DCGM_FI_DEV_POWER_USAGE&lt;/code> bajo, &lt;code>SM_ACTIVE&lt;/code> &amp;lt; 0,05&lt;/td>
&lt;td>No hay requests en cola; GPU esperando trabajo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Idle batching&lt;/strong>&lt;/td>
&lt;td>&lt;code>SM_ACTIVE&lt;/code> alto, &lt;code>PIPE_TENSOR_ACTIVE&lt;/code> bajo, &lt;code>DRAM_ACTIVE&lt;/code> bajo&lt;/td>
&lt;td>Batch demasiado pequeño; prefill stall entre requests&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Idle memory-bound&lt;/strong>&lt;/td>
&lt;td>&lt;code>DRAM_ACTIVE&lt;/code> alto, &lt;code>PIPE_TENSOR_ACTIVE&lt;/code> bajo&lt;/td>
&lt;td>Decode normal; HBM es el cuello; batch size insuficiente&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>El idle de scheduling es el más caro y el más directo de atacar con bin-packing. El idle de batching se ataca con continuous batching. El idle memory-bound en decode no desaparece del todo (es la física del transformador), pero se atenúa con batch size mayor.&lt;/p>
&lt;p>Las métricas de motor de inferencia que complementan el diagnóstico desde el lado del servicio se documentan en &lt;a href="https://blog.lo0.es/posts/observabilidad-gpu-dcgm-llm/">observabilidad-gpu-dcgm-llm&lt;/a> y &lt;a href="https://blog.lo0.es/posts/anatomia-metricas-dcgm-vllm-anomalias/">anatomia-metricas-dcgm-vllm-anomalias&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2 id="6--palancas-para-subir-la-ocupación">6 · Palancas para subir la ocupación&lt;/h2>
&lt;h3 id="tabla-palanca--efecto--cuándo-aplica">Tabla palanca × efecto × cuándo aplica&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Palanca&lt;/th>
&lt;th>Efecto sobre ( \rho )&lt;/th>
&lt;th>Cuándo aplica&lt;/th>
&lt;th>Complejidad operativa&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Continuous batching&lt;/strong>&lt;/td>
&lt;td>Alto: elimina idle entre requests; sube MFU decode de ~5 % a ~20 %&lt;/td>
&lt;td>Siempre en inferencia; activado por defecto en vLLM&lt;/td>
&lt;td>Baja (parámetro del motor)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Bin-packing del scheduler&lt;/strong> (kube-scheduler / Kueue)&lt;/td>
&lt;td>Alto: concentra cargas en menos nodos; libera nodos completos para apagado o rebalanceo&lt;/td>
&lt;td>Clusters con carga variable a lo largo del día&lt;/td>
&lt;td>Media (política de scheduler)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>MIG&lt;/strong> (Multi-Instance GPU)&lt;/td>
&lt;td>Medio: llena GPUs con cargas ligeras que antes vivían solas en una GPU entera&lt;/td>
&lt;td>Cargas heterogéneas: embeddings + reranker + guardrail + modelo grande&lt;/td>
&lt;td>Alta (reparticionado en caliente no disponible)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Time-slicing&lt;/strong>&lt;/td>
&lt;td>Bajo-medio: sube ocupación en dev/ráfagas; sin aislamiento&lt;/td>
&lt;td>GPUs de consumo (RTX 5090/4090); dev multi-tenant de bajo riesgo&lt;/td>
&lt;td>Baja&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>MPS&lt;/strong>&lt;/td>
&lt;td>Medio: ejecución concurrente de múltiples procesos pequeños; reduce overhead context-switch&lt;/td>
&lt;td>Muchos kernels pequeños concurrentes en GPU datacenter; confianza entre cargas&lt;/td>
&lt;td>Media&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Chunked prefill&lt;/strong>&lt;/td>
&lt;td>Medio: intercala prefill y decode; reduce TTFT spike y sube throughput&lt;/td>
&lt;td>Cargas con mix de prompts cortos y largos&lt;/td>
&lt;td>Baja (flag vLLM)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Quantización&lt;/strong> (FP16→FP8→INT4)&lt;/td>
&lt;td>Indirecto: sube throughput pico, lo que baja CPM para la misma ( \rho )&lt;/td>
&lt;td>Modelos con soporte de kernels quantizados (Hopper FP8 nativo)&lt;/td>
&lt;td>Media&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Autoscaling&lt;/strong> (KEDA)&lt;/td>
&lt;td>Mantiene ( \rho ) alta escalando réplicas según cola&lt;/td>
&lt;td>Carga variable y predecible; cluster con capacidad de spare&lt;/td>
&lt;td>Media&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>El post &lt;a href="https://blog.lo0.es/posts/compartir-gpu-time-slicing-mps-mig/">compartir-gpu-time-slicing-mps-mig&lt;/a> detalla los tres mecanismos de compartición (time-slicing, MPS, MIG) con presupuestos de VRAM.&lt;/p>
&lt;h3 id="bin-packing-con-kueue">Bin-packing con Kueue&lt;/h3>
&lt;p>Kueue (sigs.k8s.io/kueue) es el gestor de colas de jobs GPU nativo de Kubernetes. Su modelo de &lt;strong>cohorts&lt;/strong> y &lt;strong>nominal quotas&lt;/strong> permite bin-packing activo: los jobs se acumulan en cola y se lanzan solo cuando hay un nodo que puede recibirlos completo, en lugar de fragmentar la carga entre nodos parcialmente ocupados.&lt;/p>
&lt;p>El &lt;code>BestFit&lt;/code> packing en el &lt;code>ClusterQueue&lt;/code> se configura con:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">apiVersion&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">kueue.x-k8s.io/v1beta1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">kind&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ClusterQueue&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">metadata&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">gpu-prod&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">spec&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">preemption&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">reclaimWithinCohort&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Any&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">withinClusterQueue&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">LowerPriority&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">resourceGroups&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">coveredResources&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;nvidia.com/gpu&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">flavors&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">h100-sxm&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">resources&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;nvidia.com/gpu&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">nominalQuota&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">16&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>La política de preemption por prioridad asegura que los jobs de producción desplacen los de experimentación cuando hay escasez, manteniendo la ocupación de los nodos de producción alta.&lt;/p>
&lt;h3 id="mig-como-palanca-de-bin-packing-dentro-de-la-gpu">MIG como palanca de bin-packing dentro de la GPU&lt;/h3>
&lt;p>MIG permite rellenar una H100 con cargas ligeras que de otro modo vivirían solas en una GPU entera. Un perfil &lt;code>3×2g.20gb + 1×1g.10gb&lt;/code> en una H100 puede alojar simultáneamente un modelo 7B FP8 (~14 GB de pesos), dos servicios de embeddings y un guardrail INT4, todos con aislamiento de hardware. Sin MIG, cada una de esas cargas ocuparía una GPU completa con ( \rho ) individual &amp;lt; 10 %.&lt;/p>
&lt;p>Los perfiles disponibles en H100 80 GB (SXM5) según la MIG User Guide de NVIDIA:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Perfil MIG&lt;/th>
&lt;th>Compute slices&lt;/th>
&lt;th>Memoria&lt;/th>
&lt;th>Máx. instancias&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>1g.10gb&lt;/code>&lt;/td>
&lt;td>1/7 SMs&lt;/td>
&lt;td>10 GB&lt;/td>
&lt;td>7&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>1g.20gb&lt;/code>&lt;/td>
&lt;td>1/7 SMs&lt;/td>
&lt;td>20 GB&lt;/td>
&lt;td>4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>2g.20gb&lt;/code>&lt;/td>
&lt;td>2/7 SMs&lt;/td>
&lt;td>20 GB&lt;/td>
&lt;td>3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>3g.40gb&lt;/code>&lt;/td>
&lt;td>3/7 SMs&lt;/td>
&lt;td>40 GB&lt;/td>
&lt;td>2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>4g.40gb&lt;/code>&lt;/td>
&lt;td>4/7 SMs&lt;/td>
&lt;td>40 GB&lt;/td>
&lt;td>1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>7g.80gb&lt;/code>&lt;/td>
&lt;td>7/7 SMs&lt;/td>
&lt;td>80 GB&lt;/td>
&lt;td>1 (GPU entera)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>MIG no está disponible en GPUs de consumo (RTX 5090, RTX 4090). Time-slicing es la única opción de compartición en ese hardware.&lt;/p>
&lt;hr>
&lt;h2 id="7--continuous-batching-el-efecto-sobre-mfu">7 · Continuous batching: el efecto sobre MFU&lt;/h2>
&lt;p>El continuous batching (también llamado iteration-level scheduling o in-flight batching) es el mecanismo que mayor impacto tiene sobre la ocupación en inferencia. La idea: en lugar de esperar a que un batch completo termine para lanzar el siguiente, el motor evalúa el pipeline tras cada token y sustituye las secuencias completadas por nuevas requests de la cola de espera.&lt;/p>
&lt;p>Efecto cuantificado en vLLM:&lt;/p>
&lt;ul>
&lt;li>Sin batching (bs=1, estático): MFU decode ~3–8 %; GPU en idle entre requests.&lt;/li>
&lt;li>Con continuous batching (bs dinámico 16–64): MFU decode ~15–30 %; la GPU casi nunca espera.&lt;/li>
&lt;li>En cargas de prefill puro con batch grande (bs=128+): MFU prefill 25–45 %; se acerca al roofline compute.&lt;/li>
&lt;/ul>
&lt;p>El parámetro &lt;code>--max-num-seqs&lt;/code> de vLLM controla el número máximo de secuencias en el batch concurrente. Aumentarlo sube la ocupación hasta que la HBM se convierte en cuello de botella (ver &lt;code>DCGM_FI_PROF_DRAM_ACTIVE&lt;/code> &amp;gt; 90 % sostenido).&lt;/p>
&lt;hr>
&lt;h2 id="8--hardware-y-escala-qué-aplica-a-qué">8 · Hardware y escala: qué aplica a qué&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Hardware&lt;/th>
&lt;th>MIG&lt;/th>
&lt;th>MPS&lt;/th>
&lt;th>Time-slicing&lt;/th>
&lt;th>Continuous batching&lt;/th>
&lt;th>Nota&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>H100 SXM / H200&lt;/td>
&lt;td>Sí (7 inst.)&lt;/td>
&lt;td>Sí&lt;/td>
&lt;td>Sí&lt;/td>
&lt;td>Sí&lt;/td>
&lt;td>Referencia on-prem datacenter&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A100 SXM/PCIe&lt;/td>
&lt;td>Sí (7 inst.)&lt;/td>
&lt;td>Sí&lt;/td>
&lt;td>Sí&lt;/td>
&lt;td>Sí&lt;/td>
&lt;td>Generación anterior; HBM2e&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>L40S / L40&lt;/td>
&lt;td>No&lt;/td>
&lt;td>Sí&lt;/td>
&lt;td>Sí&lt;/td>
&lt;td>Sí&lt;/td>
&lt;td>Ada Lovelace; sin MIG; buen precio/VRAM&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RTX 5090&lt;/td>
&lt;td>No&lt;/td>
&lt;td>Sí (limitado)&lt;/td>
&lt;td>Sí&lt;/td>
&lt;td>Sí&lt;/td>
&lt;td>Consumo; sin MIG; no escala en producción&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RTX 4090&lt;/td>
&lt;td>No&lt;/td>
&lt;td>Sí (limitado)&lt;/td>
&lt;td>Sí&lt;/td>
&lt;td>Sí&lt;/td>
&lt;td>Consumo; 24 GB VRAM; sin MIG&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>La RTX 5090 y RTX 4090 ilustran el caso de &lt;strong>hardware que no escala&lt;/strong> para multi-tenant con aislamiento: no soportan MIG, la VRAM es escasa para modelos &amp;gt; 7B con KV-cache amplio, y el TDP (600 W / 450 W) es alto respecto al throughput. Para inferencia en producción a escala, el 4×H100 SXM es el nodo de referencia de esta serie.&lt;/p>
&lt;hr>
&lt;h2 id="9--flujo-de-diagnóstico-finops-del-cpm-alto-a-la-causa">9 · Flujo de diagnóstico FinOps: del CPM alto a la causa&lt;/h2>
&lt;div class="diagram" style="max-width:720px;margin:1rem auto;">
&lt;svg viewBox="0 0 720 380" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Flujo de diagnóstico FinOps desde CPM alto hasta palanca correcta">
&lt;style>.bx{fill:none;stroke:currentColor;stroke-width:1.3}.dec{fill:none;stroke:currentColor;stroke-width:1.3}.tl{font:600 11px sans-serif;fill:currentColor}.ts{font:10px sans-serif;fill:currentColor}.ar{fill:none;stroke:currentColor;stroke-width:1.2;marker-end:url(#fm)}&lt;/style>
&lt;defs>&lt;marker id="fm" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto">&lt;path d="M0,0 L10,5 L0,10 z" fill="currentColor"/>&lt;/marker>&lt;/defs>
&lt;rect class="bx" x="270" y="10" width="180" height="42" rx="6"/>
&lt;text x="360" y="28" text-anchor="middle" class="tl">CPM alto detectado&lt;/text>
&lt;text x="360" y="44" text-anchor="middle" class="ts">OpenCost + LiteLLM&lt;/text>
&lt;path class="ar" d="M360,52 L360,80"/>
&lt;polygon class="dec" points="360,80 440,110 360,140 280,110"/>
&lt;text x="360" y="105" text-anchor="middle" class="tl">POWER_USAGE&lt;/text>
&lt;text x="360" y="120" text-anchor="middle" class="ts">bajo?&lt;/text>
&lt;path class="ar" d="M440,110 L530,110"/>
&lt;text x="537" y="114" class="ts">Sí → idle scheduling&lt;/text>
&lt;rect class="bx" x="530" y="128" width="170" height="34" rx="5"/>
&lt;text x="615" y="142" text-anchor="middle" class="ts">Bin-packing / Kueue&lt;/text>
&lt;text x="615" y="155" text-anchor="middle" class="ts">Autoscaling down&lt;/text>
&lt;path class="ar" d="M360,140 L360,168"/>
&lt;text x="270" y="114" class="ts">No&lt;/text>
&lt;polygon class="dec" points="360,168 450,198 360,228 270,198"/>
&lt;text x="360" y="193" text-anchor="middle" class="tl">PIPE_TENSOR_ACTIVE&lt;/text>
&lt;text x="360" y="208" text-anchor="middle" class="ts">bajo (&amp;lt;0,10)?&lt;/text>
&lt;path class="ar" d="M450,198 L530,198"/>
&lt;text x="537" y="202" class="ts">Sí → idle batching&lt;/text>
&lt;rect class="bx" x="530" y="216" width="170" height="34" rx="5"/>
&lt;text x="615" y="230" text-anchor="middle" class="ts">Continuous batching&lt;/text>
&lt;text x="615" y="243" text-anchor="middle" class="ts">Subir --max-num-seqs&lt;/text>
&lt;path class="ar" d="M360,228 L360,256"/>
&lt;text x="270" y="202" class="ts">No&lt;/text>
&lt;polygon class="dec" points="360,256 450,286 360,316 270,286"/>
&lt;text x="360" y="280" text-anchor="middle" class="tl">DRAM_ACTIVE alto&lt;/text>
&lt;text x="360" y="296" text-anchor="middle" class="ts">y batch ya grande?&lt;/text>
&lt;path class="ar" d="M450,286 L530,286"/>
&lt;text x="537" y="290" class="ts">Sí → memory-bound&lt;/text>
&lt;rect class="bx" x="530" y="304" width="170" height="34" rx="5"/>
&lt;text x="615" y="318" text-anchor="middle" class="ts">Quantización FP8/INT4&lt;/text>
&lt;text x="615" y="331" text-anchor="middle" class="ts">Modelo menor / TP&lt;/text>
&lt;path class="ar" d="M360,316 L360,344"/>
&lt;text x="270" y="290" class="ts">No&lt;/text>
&lt;rect class="bx" x="270" y="344" width="180" height="30" rx="5"/>
&lt;text x="360" y="364" text-anchor="middle" class="ts">MIG / MPS / bin-pack multi-modelo&lt;/text>
&lt;/svg>
&lt;/div>
&lt;hr>
&lt;h2 id="10--ejemplo-numérico-impacto-del-continuous-batching-sobre-el-cpm">10 · Ejemplo numérico: impacto del continuous batching sobre el CPM&lt;/h2>
&lt;p>Punto de partida: Llama 70B FP8 en 4×H100 SXM, carga de 8 requests/s con 512 tokens de salida media, sin continuous batching (bs estático = 8):&lt;/p>
&lt;ul>
&lt;li>Throughput observado: ~900 tok/s (decode dominante).&lt;/li>
&lt;li>( \rho_{\text{efectiva}} \approx 900 / 3500 \approx 0{,}26 ).&lt;/li>
&lt;li>CPM: ( 44 / (900 \times 3600 / 10^6) \approx 13{,}6\ \text{€} ).&lt;/li>
&lt;/ul>
&lt;p>Misma carga, activando continuous batching con &lt;code>--max-num-seqs 64&lt;/code>:&lt;/p>
&lt;ul>
&lt;li>Throughput observado: ~2 300 tok/s (batch dinámico rellena las gaps).&lt;/li>
&lt;li>( \rho_{\text{efectiva}} \approx 2300 / 3500 \approx 0{,}66 ).&lt;/li>
&lt;li>CPM: ( 44 / (2300 \times 3600 / 10^6) \approx 5{,}3\ \text{€} ).&lt;/li>
&lt;/ul>
&lt;p>Reducción de CPM: del 13,6 € al 5,3 €, &lt;strong>–61 %&lt;/strong>, sin ningún cambio de hardware y sin tocar el modelo.&lt;/p>
&lt;p>Los parámetros de vLLM relevantes para subir el throughput efectivo:&lt;/p>
&lt;pre tabindex="0">&lt;code>--max-num-seqs 64 # batch concurrente máximo
--max-num-batched-tokens 16384 # tokens totales por iteración
--enable-chunked-prefill # intercala prefill y decode
&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 id="ver-también">Ver también&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/coste-por-token-y-por-request/">coste-por-token-y-por-request&lt;/a> — la identidad CPM = €/GPU-hora ÷ throughput con los datos de LiteLLM y OpenCost.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/observabilidad-gpu-dcgm-llm/">observabilidad-gpu-dcgm-llm&lt;/a> — las doce métricas DCGM y cinco vLLM que componen la cabina de pilotaje.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/anatomia-metricas-dcgm-vllm-anomalias/">anatomia-metricas-dcgm-vllm-anomalias&lt;/a> — profundización en las métricas DCGM con anomalías documentadas en producción.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/compartir-gpu-time-slicing-mps-mig/">compartir-gpu-time-slicing-mps-mig&lt;/a> — time-slicing, MPS y MIG con presupuestos de VRAM trabajados.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/capacity-planning-inferencia-llm-on-premise/">capacity-planning-inferencia-llm-on-premise&lt;/a> — dimensionamiento del cluster a partir del throughput pico y la ocupación objetivo.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/opencost-cost-allocation-kubernetes/">opencost-cost-allocation-kubernetes&lt;/a> — cómo OpenCost calcula el ( C_{\text{GPU}} ) que entra en la identidad del CPM.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/cloud-gpu-commitment-spot-neoclouds/">Cloud GPU: comparativa de precios, compromiso y neoclouds soberanos&lt;/a> — el €/GPU-hora alternativo cuando la ocupación on-premise no justifica el CAPEX: precios spot y reserved de los neoclouds europeos.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/tco-on-premise-gpu-cluster/">TCO del cluster GPU on-premise: amortización, energía e infraestructura&lt;/a> — de dónde sale el ( C_{\text{GPU}} ) de la identidad cuando el hierro es propio: CAPEX, amortización, energía y operación.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="fuentes">Fuentes&lt;/h2>
&lt;ul>
&lt;li>NVIDIA — &lt;em>DCGM Field Identifiers reference (v3.1)&lt;/em>, lista completa de &lt;code>DCGM_FI_*&lt;/code> con field IDs y definiciones. &lt;a href="https://docs.nvidia.com/datacenter/dcgm/3.1/dcgm-api/dcgm-api-field-ids.html">https://docs.nvidia.com/datacenter/dcgm/3.1/dcgm-api/dcgm-api-field-ids.html&lt;/a>&lt;/li>
&lt;li>NVIDIA — &lt;em>GPU Profiling Metrics (Run:ai / DCGM)&lt;/em>, definiciones de &lt;code>DCGM_FI_PROF_SM_ACTIVE&lt;/code> (1002), &lt;code>SM_OCCUPANCY&lt;/code> (1003), &lt;code>PIPE_TENSOR_ACTIVE&lt;/code> (1004). &lt;a href="https://run-ai-docs.nvidia.com/self-hosted/platform-management/monitor-performance/gpu-profiling-metrics">https://run-ai-docs.nvidia.com/self-hosted/platform-management/monitor-performance/gpu-profiling-metrics&lt;/a>&lt;/li>
&lt;li>Chowdhery et al. — &lt;em>PaLM: Scaling Language Modeling with Pathways&lt;/em> (MFU definition, sección 4). arXiv 2204.02311. &lt;a href="https://arxiv.org/abs/2204.02311">https://arxiv.org/abs/2204.02311&lt;/a>&lt;/li>
&lt;li>NVIDIA — &lt;em>Multi-Instance GPU (MIG) User Guide&lt;/em> (perfiles H100 SXM5, particionado, aislamiento). &lt;a href="https://docs.nvidia.com/datacenter/tesla/mig-user-guide/">https://docs.nvidia.com/datacenter/tesla/mig-user-guide/&lt;/a>&lt;/li>
&lt;li>NVIDIA — &lt;em>Supported MIG Profiles&lt;/em> (catálogo completo H100 80 GB). &lt;a href="https://docs.nvidia.com/datacenter/tesla/mig-user-guide/supported-mig-profiles.html">https://docs.nvidia.com/datacenter/tesla/mig-user-guide/supported-mig-profiles.html&lt;/a>&lt;/li>
&lt;li>NVIDIA — &lt;em>Time-Slicing GPUs in Kubernetes&lt;/em> (GPU Operator 24.9.0). &lt;a href="https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/24.9.0/gpu-sharing.html">https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/24.9.0/gpu-sharing.html&lt;/a>&lt;/li>
&lt;li>NVIDIA — &lt;em>Multi-Process Service (MPS) Overview&lt;/em> (kernel concurrency, SM allocation). &lt;a href="https://docs.nvidia.com/deploy/mps/latest/index.html">https://docs.nvidia.com/deploy/mps/latest/index.html&lt;/a>&lt;/li>
&lt;li>Kueue — &lt;em>Overview&lt;/em> (sigs.k8s.io/kueue, bin-packing, cohorts, quotas). &lt;a href="https://kueue.sigs.k8s.io/docs/overview/">https://kueue.sigs.k8s.io/docs/overview/&lt;/a>&lt;/li>
&lt;li>vLLM Blog — &lt;em>vLLM v0.6.0: 2.7x Throughput Improvement and 5x Latency Reduction&lt;/em> (continuous batching, chunked prefill). &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>GMI Cloud — &lt;em>NVIDIA H100 GPU Pricing: 2026 Rent vs. Buy Cost Analysis&lt;/em>. &lt;a href="https://www.gmicloud.ai/en/blog/nvidia-h100-gpu-pricing-2026-rent-vs-buy-cost-analysis">https://www.gmicloud.ai/en/blog/nvidia-h100-gpu-pricing-2026-rent-vs-buy-cost-analysis&lt;/a>&lt;/li>
&lt;li>Saxena et al. — &lt;em>LLM Inference Unveiled: Survey and Roofline Model Insights&lt;/em>. arXiv 2402.16363. &lt;a href="https://arxiv.org/abs/2402.16363">https://arxiv.org/abs/2402.16363&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>