<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Chargeback on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/chargeback/</link><description>Recent content in Chargeback on lo0 — Blog Técnico</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Thu, 11 Jun 2026 12:20:00 +0000</lastBuildDate><atom:link href="https://blog.lo0.es/tags/chargeback/index.xml" rel="self" type="application/rss+xml"/><item><title>FinOps y multi-tenancy del cluster GPU: quién paga qué</title><link>https://blog.lo0.es/posts/finops-multi-tenancy-gpu-litellm/</link><pubDate>Thu, 11 Jun 2026 12:20:00 +0000</pubDate><guid>https://blog.lo0.es/posts/finops-multi-tenancy-gpu-litellm/</guid><description>&lt;blockquote>
&lt;p>Tercera entrega de una serie operativa sobre cómo exprimir un cluster de inferencia LLM on-premise genérico de &lt;strong>4×H100 SXM 80 GB&lt;/strong>. Las piezas hermanas son &lt;a href="https://blog.lo0.es/posts/multimodal-vlm-on-premise-vllm/">Multimodal VLM on-premise con vLLM&lt;/a> —servir modelos visión-lenguaje en el mismo cluster— y &lt;a href="https://blog.lo0.es/posts/acelerar-cold-start-carga-modelos-tensorizer/">Acelerar el cold start con Tensorizer&lt;/a> —recortar el tiempo de carga del modelo del disco a la HBM—. Este post cierra la pregunta económica que las otras dos dejan abierta: una vez que el cluster sirve varios modelos para varios equipos, &lt;strong>¿quién paga qué?&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>Un cluster GPU on-premise no tiene la propiedad que hace fácil el FinOps en cloud: &lt;strong>no llega ninguna factura mensual&lt;/strong> que diga cuánto costó cada hora de cómputo. El coste hay que &lt;strong>fabricarlo&lt;/strong> desde el capex y la energía. La unidad correcta es el &lt;strong>token&lt;/strong>, y se deriva en dos pasos. Primero el &lt;strong>€/GPU-hora&lt;/strong>: la amortización del capex repartida sobre las horas de vida útil, más la energía (potencia × PUE × precio_kWh). Para una H100 SXM con un capex supuesto de 30 000 € y 4 años de vida a 90 % de disponibilidad, sale &lt;strong>≈ 1,07 €/GPU-hora&lt;/strong> (0,95 de amortización + 0,12 de energía a 0,12 €/kWh y PUE 1,4). Segundo, el &lt;strong>€/1M tokens&lt;/strong>: dividir ese €/GPU-hora entre el throughput sostenido. A 2 000 tok/s útiles, &lt;strong>≈ 0,148 €/1M tokens&lt;/strong>; pero ese número solo vale &lt;strong>si la GPU está al 100 % de utilización útil&lt;/strong>. A 20 % de utilización el mismo token cuesta &lt;strong>4× más&lt;/strong> (0,74 €/1M), porque el capex y la energía se siguen pagando aunque la GPU esté ociosa. Esa es la tesis central: &lt;strong>el objetivo FinOps no es negociar a la baja el precio del token —no hay proveedor con quien negociar— sino subir la utilización útil&lt;/strong>, que es el único término que mueve el coste por orden de magnitud. La atribución (chargeback / showback) se materializa con &lt;strong>claves virtuales de LiteLLM&lt;/strong>: presupuesto por equipo y por usuario, rate-limit RPM/TPM, spend tracking automático y &lt;code>tags&lt;/code> para asignar gasto a centros de coste. El aislamiento entre tenants se consigue con &lt;strong>MIG&lt;/strong> (partición dura de la GPU), namespaces, &lt;code>ResourceQuota&lt;/code> y &lt;code>PriorityClass&lt;/code>. La regla de la FinOps Foundation que conviene grabar: &lt;strong>showback siempre, chargeback solo si la política contable de la organización lo soporta&lt;/strong>; ninguno de los dos es &amp;ldquo;más maduro&amp;rdquo;. Y la métrica de gobierno del cluster compartido no es el €/token sino &lt;code>DCGM_FI_DEV_GPU_UTIL&lt;/code>.&lt;/p>
&lt;h2 id="el-problema-que-el-cloud-te-oculta-y-on-premise-te-obliga-a-resolver">El problema que el cloud te oculta y on-premise te obliga a resolver&lt;/h2>
&lt;p>En cloud, el coste de una GPU es un hecho observable: AWS, GCP o Azure te cobran por GPU-hora y la factura llega desglosada. El FinOps en ese mundo consiste en &lt;strong>leer&lt;/strong> una factura que ya existe y atribuirla. On-premise no existe esa factura. La GPU se compró una vez, hace dieciocho meses, con una orden de compra que ya nadie recuerda; el recibo de la luz llega al edificio entero sin desglosar qué fracción fue del cluster; y el PUE del datacenter es un número que el equipo de instalaciones conoce pero el de IA nunca preguntó.&lt;/p>
&lt;p>El primer trabajo de FinOps on-premise, entonces, &lt;strong>no es atribuir un coste sino fabricarlo&lt;/strong>. Hay que construir, desde supuestos explícitos, el equivalente al &amp;ldquo;precio por GPU-hora&amp;rdquo; que en cloud viene dado. Y una vez fabricado, hay que entender que ese número &lt;strong>no es una propiedad del hardware&lt;/strong> —como la VRAM o el TDP— sino una &lt;strong>función de cómo se usa el hardware&lt;/strong>. Una H100 ociosa cuesta exactamente lo mismo que una H100 al 100 %: el capex ya está pagado y la energía en idle no es cero. Lo único que cambia es &lt;strong>cuántos tokens útiles produjo&lt;/strong> ese coste fijo. De ahí toda la tesis del post.&lt;/p>
&lt;h2 id="la-analogía-el-coworking-con-servicios-medidos">La analogía: el coworking con servicios medidos&lt;/h2>
&lt;p>Un coworking gestiona un espacio físico finito y lo alquila a equipos. El modelo de costes tiene exactamente la estructura del cluster GPU, y la analogía sostiene hasta el último detalle.&lt;/p>
&lt;p>&lt;strong>El puesto-hora es el capex repartido.&lt;/strong> El gestor pagó el alquiler del local, los muebles y la reforma —un desembolso único o un coste fijo mensual— y lo reparte sobre las horas-puesto disponibles del mes. Cada puesto tiene un coste base que &lt;strong>no depende de si alguien lo usa&lt;/strong>: las paredes, la mesa y la silla cuestan lo mismo vacías que ocupadas. Esto es la &lt;strong>amortización de la GPU&lt;/strong>: el capex dividido entre las horas de vida útil.&lt;/p>
&lt;p>&lt;strong>El kWh medido es la energía.&lt;/strong> Encima del puesto-hora, el coworking mide el consumo eléctrico real —el portátil enchufado, la pantalla, el aire acondicionado de esa sala— y lo factura aparte. Esto es la &lt;strong>energía de la GPU&lt;/strong>: potencia × horas × precio_kWh, multiplicada por el &lt;strong>PUE&lt;/strong> del datacenter, que es el coworking cobrándote también la fracción del aire acondicionado del edificio que enfría tu sala.&lt;/p>
&lt;p>&lt;strong>El puesto vacío lo paga quien lo reservó.&lt;/strong> Aquí está el corazón del asunto. Si un equipo reserva diez puestos para todo el mes y solo usa dos, &lt;strong>paga los diez igual&lt;/strong>. El puesto vacío sigue ocupando espacio que el gestor no puede revender, sigue amortizando muebles, sigue contando como capacidad comprometida. En el cluster: una GPU asignada a un tenant que la usa al 20 % cuesta lo mismo que si la usara al 100 %, y el 80 % ocioso es &lt;strong>capex desperdiciado&lt;/strong> que alguien está pagando.&lt;/p>
&lt;p>&lt;strong>El gestor optimiza ocupación, no tarifa.&lt;/strong> Un gestor de coworking competente no se obsesiona con bajar el precio del puesto-hora —es un coste hundido, ya pagó el local—. Se obsesiona con la &lt;strong>tasa de ocupación&lt;/strong>: cada puesto vacío es margen perdido para siempre, porque una hora-puesto no vendida no se puede almacenar. El equivalente FinOps: &lt;strong>el objetivo no es bajar el €/token, es subir la utilización&lt;/strong>, porque el €/token cae sólo como consecuencia de que la utilización sube. No hay un proveedor a quien apretar; el único margen está en no dejar GPUs ociosas.&lt;/p>
&lt;p>La analogía tiene un límite honesto que conviene nombrar: en el coworking, dos personas no pueden compartir físicamente la misma silla. En la GPU &lt;strong>sí&lt;/strong> se puede —con time-slicing, MPS o MIG (ver &lt;a href="https://blog.lo0.es/posts/compartir-gpu-time-slicing-mps-mig/">Compartir una GPU&lt;/a>)—, y esa es justamente la palanca técnica que permite subir la ocupación por encima de lo que el coworking físico permitiría. Pero la economía del coste fijo + medido es idéntica.&lt;/p>
&lt;h2 id="el-token-como-unidad-de-coste">El token como unidad de coste&lt;/h2>
&lt;p>¿Por qué el token y no la GPU-hora, o la request, o el modelo? Porque el token es la &lt;strong>única unidad que es comparable entre workloads heterogéneos&lt;/strong>. Una GPU-hora de Llama 8B y una de Llama 70B producen cantidades de &amp;ldquo;trabajo útil&amp;rdquo; radicalmente distintas; una request de RAG con respuesta de 50 tokens y una de generación de un informe de 3 000 no son comparables. El token —concretamente el par (input_tokens, output_tokens)— normaliza todo eso. Es la unidad que LiteLLM contabiliza nativamente, la que aparece en los atributos OTel &lt;code>gen_ai.usage.input_tokens&lt;/code> y &lt;code>gen_ai.usage.output_tokens&lt;/code> (ver &lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">Tracing LLM con OpenTelemetry GenAI&lt;/a>), y la que los proveedores comerciales ya usan para cobrar. Adoptar el token como moneda interna hace que el chargeback on-premise sea &lt;strong>directamente comparable&lt;/strong> con la alternativa cloud, que es justo la comparación que la dirección quiere ver.&lt;/p>
&lt;p>Las dos métricas derivadas que importan:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Tokens/€&lt;/strong> — cuántos tokens útiles compra cada euro de coste total del cluster. Sube cuando la utilización sube. Es la métrica de eficiencia económica.&lt;/li>
&lt;li>&lt;strong>Tokens/W&lt;/strong> — cuántos tokens produce cada vatio consumido. Es la métrica de eficiencia energética y, en un datacenter con potencia limitada (lo habitual on-premise), suele ser la &lt;strong>restricción dura&lt;/strong> real: no puedes meter más GPUs porque no hay más kW en el rack, así que cada vatio tiene que rendir.&lt;/li>
&lt;/ul>
&lt;h2 id="modelo-de-coste-de-una-gpu-del-capex-al-token">Modelo de coste de una GPU: del capex al €/token&lt;/h2>
&lt;p>El coste por hora de una GPU tiene dos sumandos. Pongamos todos los supuestos por escrito, porque —como en el &lt;a href="https://blog.lo0.es/posts/capacity-planning-inferencia-llm-on-premise/">capacity planning&lt;/a>— un cálculo de coste sin supuestos escritos es un cálculo desechable.&lt;/p>
&lt;h3 id="amortización-capex-repartido">Amortización (capex repartido)&lt;/h3>
&lt;p>$$\text{coste amort/h} = \frac{\text{capex}_{\text{GPU}}}{\text{horas vida útil}}$$&lt;/p>
&lt;p>donde las horas de vida útil son los años de amortización × 8 760 h/año × la &lt;strong>disponibilidad efectiva&lt;/strong> (la GPU no está disponible el 100 % del tiempo: hay mantenimiento, reinicios, ventanas de actualización). Supuestos explícitos, &lt;strong>genéricos&lt;/strong> (no son cifras de ningún proveedor ni de ninguna compra real):&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Capex por GPU&lt;/strong>: 30 000 € — supuesto razonable que incluye no solo la GPU sino su &lt;strong>parte alícuota&lt;/strong> del servidor, fuente, refrigeración, red NVLink/InfiniBand y rack. Una H100 SXM &amp;ldquo;desnuda&amp;rdquo; cuesta menos, pero el FinOps honesto reparte el coste del nodo entero entre sus GPUs.&lt;/li>
&lt;li>&lt;strong>Vida útil contable&lt;/strong>: 4 años. Es agresivo-realista para GPU de datacenter; algunos amortizan a 3, otros a 5.&lt;/li>
&lt;li>&lt;strong>Disponibilidad efectiva&lt;/strong>: 90 %.&lt;/li>
&lt;/ul>
&lt;p>$$\text{horas vida} = 4 \times 8,760 \times 0{,}90 = 31,536 \text{ h}$$&lt;/p>
&lt;p>$$\text{coste amort/h} = \frac{30,000}{31,536} \approx 0{,}95 \text{ €/GPU-hora}$$&lt;/p>
&lt;h3 id="energía-potencia--pue--precio_kwh">Energía (potencia × PUE × precio_kWh)&lt;/h3>
&lt;p>$$\text{coste energía/h} = P_{\text{GPU}} \cdot \text{PUE} \cdot \text{precio kWh}$$&lt;/p>
&lt;p>Supuestos:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Potencia de la GPU&lt;/strong>: el TDP de la H100 SXM es &lt;strong>700 W&lt;/strong> según el datasheet de NVIDIA (&lt;a href="https://resources.nvidia.com/en-us-gpu-resources/h100-datasheet-24306">H100 datasheet&lt;/a>). En carga sostenida de inferencia ronda ese valor; usamos 0,7 kW como potencia media en carga. (En idle baja mucho —60–100 W— pero el FinOps de capacidad reservada razona sobre la potencia en carga, que es la que limita el rack.)&lt;/li>
&lt;li>&lt;strong>PUE&lt;/strong> (Power Usage Effectiveness): cuántos vatios entran al datacenter por cada vatio que llega al chip. Un datacenter on-premise modesto bien gestionado está en &lt;strong>1,4&lt;/strong>; uno malo, en 2,0; los hiperescalares presumen de 1,1. Usamos &lt;strong>1,4&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>Precio del kWh&lt;/strong>: &lt;strong>0,12 €/kWh&lt;/strong> — supuesto genérico de tarifa industrial; varía enormemente por país y contrato.&lt;/li>
&lt;/ul>
&lt;p>$$\text{coste energía/h} = 0{,}7 \cdot 1{,}4 \cdot 0{,}12 \approx 0{,}1176 \approx 0{,}12 \text{ €/GPU-hora}$$&lt;/p>
&lt;h3 id="el-gpu-hora-total">El €/GPU-hora total&lt;/h3>
&lt;p>$$\boxed{\text{€/GPU-hora} = 0{,}95 + 0{,}12 \approx 1{,}07 \text{ €/GPU-hora}}$$&lt;/p>
&lt;p>Dos lecturas importantes de este número. Primero: &lt;strong>la amortización domina&lt;/strong> (89 % del coste); la energía es el 11 %. Esto invierte la intuición de mucha gente, que cree que &amp;ldquo;lo caro es la luz&amp;rdquo;. Con estos supuestos, lo caro es &lt;strong>haber comprado la GPU&lt;/strong>, y por eso dejarla ociosa duele tanto. Segundo: el número es &lt;strong>per-GPU&lt;/strong>; para el nodo de 4×H100 son ≈ 4,28 €/hora, y para el cluster genérico completo de 4 nodos (16 GPUs), ≈ 17,1 €/hora ≈ &lt;strong>150 000 €/año&lt;/strong> de coste fijo que se paga &lt;strong>se use o no se use&lt;/strong>.&lt;/p>
&lt;h3 id="de-gpu-hora-a-token">De €/GPU-hora a €/token&lt;/h3>
&lt;p>Ahora dividimos el coste horario entre los tokens que la GPU produce en una hora. Aquí entra el throughput sostenido. Supongamos —cifra de orden de magnitud, validable con &lt;code>vllm bench serve&lt;/code>— que una réplica de Llama 70B sobre 4×H100 (TP=4) sostiene &lt;strong>2 000 tokens/s útiles&lt;/strong> agregados en régimen de buena concurrencia.&lt;/p>
&lt;p>$$\text{tokens/hora} = 2,000 \times 3,600 = 7{,}2 \times 10^6 \text{ tok/h}$$&lt;/p>
&lt;p>El coste de esa réplica (4 GPUs) es $4 \times 1{,}07 = 4{,}28$ €/hora. Por tanto:&lt;/p>
&lt;p>$$\text{€/1M tokens} = \frac{4{,}28}{7{,}2} \approx 0{,}59 \text{ €/1M tokens}$$&lt;/p>
&lt;p>Por GPU individual, si tomamos una réplica más pequeña (p.ej. Llama 8B FP8 en 1 GPU a ~2 000 tok/s):&lt;/p>
&lt;p>$$\text{€/1M tokens} = \frac{1{,}07 \text{ €/h}}{7{,}2 \times 10^6 \text{ tok/h}} \times 10^6 \approx 0{,}149 \text{ €/1M tokens}$$&lt;/p>
&lt;p>Estos números son &lt;strong>el suelo teórico al 100 % de utilización&lt;/strong>. Nadie opera al 100 %. Y ahí está toda la historia.&lt;/p>
&lt;h2 id="la-utilización-es-la-palanca-con-números">La utilización es la palanca (con números)&lt;/h2>
&lt;p>El €/token de la sección anterior asume que la GPU produce 7,2 M tokens cada hora, hora tras hora. En la práctica produce eso solo en las horas pico. El resto del tiempo está parcialmente ociosa: de noche, los fines de semana, entre picos de tráfico. La &lt;strong>utilización útil&lt;/strong> $u$ es la fracción de la capacidad teórica que de verdad se convierte en tokens facturables.&lt;/p>
&lt;p>El coste horario es &lt;strong>fijo&lt;/strong> (1,07 €/GPU-hora se paga llueva o truene), pero los tokens producidos escalan con $u$:&lt;/p>
&lt;p>$$\text{€/1M tokens}(u) = \frac{\text{€/GPU-hora}}{\text{tok máx/hora} \cdot u} = \frac{1{,}07}{7{,}2 \times 10^6 \cdot u} \times 10^6 = \frac{0{,}149}{u}$$&lt;/p>
&lt;p>El contraste pedido, trabajado:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Utilización útil $u$&lt;/th>
&lt;th>Tokens/h reales&lt;/th>
&lt;th>€/1M tokens&lt;/th>
&lt;th>Multiplicador vs 80 %&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>100 %&lt;/td>
&lt;td>7,2 M&lt;/td>
&lt;td>0,149 €&lt;/td>
&lt;td>0,80×&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>80 %&lt;/strong>&lt;/td>
&lt;td>5,76 M&lt;/td>
&lt;td>&lt;strong>0,186 €&lt;/strong>&lt;/td>
&lt;td>&lt;strong>1,00× (referencia)&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>50 %&lt;/td>
&lt;td>3,6 M&lt;/td>
&lt;td>0,298 €&lt;/td>
&lt;td>1,60×&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>20 %&lt;/strong>&lt;/td>
&lt;td>1,44 M&lt;/td>
&lt;td>&lt;strong>0,744 €&lt;/strong>&lt;/td>
&lt;td>&lt;strong>4,00×&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>10 %&lt;/td>
&lt;td>0,72 M&lt;/td>
&lt;td>1,488 €&lt;/td>
&lt;td>8,00×&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Lectura directa: pasar de &lt;strong>20 % a 80 %&lt;/strong> de utilización divide el coste por token entre &lt;strong>cuatro&lt;/strong> ($0{,}744 \to 0{,}186$). Ninguna negociación de tarifa, ninguna quantization, ningún cambio de hardware da ese factor 4 tan barato. La quantization de BF16 a FP8 puede duplicar el throughput —y por tanto reduce el €/token a la mitad— pero degrada calidad y exige evals (ver &lt;a href="https://blog.lo0.es/posts/quantization-fundamentos-inferencia/">Quantization para inferencia&lt;/a>); subir la utilización del 20 al 80 % no toca la calidad de un solo token.&lt;/p>
&lt;p>Esto reformula el FinOps del cluster GPU en una sola frase: &lt;strong>el €/token no es algo que se negocia, es algo que se gana llenando las GPUs&lt;/strong>. Y subir la utilización es un problema de ingeniería que ya tiene piezas:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Autoscaling&lt;/strong> que apaga réplicas cuando el tráfico baja, para no pagar GPU ociosa (ver &lt;a href="https://blog.lo0.es/posts/autoscaling-llm-kubernetes-keda/">Autoscaling LLM en Kubernetes con KEDA&lt;/a>). Apagar una réplica de 4 GPUs ocho horas por la noche ahorra ≈ 34 € diarios de coste real; multiplicado por réplicas y por días, es la diferencia entre un cluster rentable y uno que sangra.&lt;/li>
&lt;li>&lt;strong>Compartir GPU&lt;/strong> entre workloads pequeños con MIG o time-slicing, para que dos tenants que individualmente usarían el 30 % llenen juntos una GPU al 60 % (ver &lt;a href="https://blog.lo0.es/posts/compartir-gpu-time-slicing-mps-mig/">Compartir una GPU&lt;/a>).&lt;/li>
&lt;li>&lt;strong>Batch nocturno&lt;/strong> que llena las horas-valle con trabajo no urgente (re-embeddings, evals, fine-tune ligero) en vez de dejar las GPUs apagadas o al ralentí.&lt;/li>
&lt;li>&lt;strong>Reducir el cold start&lt;/strong> para que escalar a cero y volver a arrancar sea barato y, por tanto, viable como estrategia de utilización (ver la pieza hermana &lt;a href="https://blog.lo0.es/posts/acelerar-cold-start-carga-modelos-tensorizer/">Acelerar el cold start con Tensorizer&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h2 id="el-diagrama-la-cascada-del-token-según-utilización">El diagrama: la cascada del €/token según utilización&lt;/h2>
&lt;p>El coste por token no es un número, es una cascada que se multiplica conforme la utilización cae:&lt;/p>
&lt;div class="diagram" style="max-width:760px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 760 360" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="cascada del coste por token según utilización">
&lt;text x="380" y="24" text-anchor="middle" font-size="15" font-weight="700" fill="currentColor">El €/token se fabrica y luego se infla con la utilización baja&lt;/text>
&lt;text x="380" y="48" text-anchor="middle" font-size="11" font-style="italic" fill="currentColor">coste fijo (capex + energía) → ÷ tokens producidos → €/token, que crece al caer la utilización&lt;/text>
&lt;rect x="40" y="70" width="160" height="50" rx="6" fill="#8b5cf6" stroke="currentColor" stroke-width="1.2"/>
&lt;text x="120" y="92" text-anchor="middle" font-size="11" font-weight="700" fill="#ffffff">Amortización&lt;/text>
&lt;text x="120" y="108" text-anchor="middle" font-size="11" fill="#ffffff">0,95 €/GPU-h&lt;/text>
&lt;rect x="40" y="130" width="160" height="50" rx="6" fill="#f59e0b" stroke="currentColor" stroke-width="1.2"/>
&lt;text x="120" y="152" text-anchor="middle" font-size="11" font-weight="700" fill="#ffffff">Energía × PUE&lt;/text>
&lt;text x="120" y="168" text-anchor="middle" font-size="11" fill="#ffffff">0,12 €/GPU-h&lt;/text>
&lt;path d="M200,95 L230,95 L230,150 L200,150" fill="none" stroke="currentColor" stroke-width="1.2"/>
&lt;line x1="230" y1="125" x2="265" y2="125" stroke="currentColor" stroke-width="1.4" marker-end="url(#fa)"/>
&lt;rect x="270" y="100" width="150" height="50" rx="6" fill="none" stroke="currentColor" stroke-width="1.6"/>
&lt;text x="345" y="122" text-anchor="middle" font-size="11" font-weight="700" fill="currentColor">€/GPU-hora&lt;/text>
&lt;text x="345" y="138" text-anchor="middle" font-size="11" fill="currentColor">1,07 €/h (fijo)&lt;/text>
&lt;text x="345" y="172" text-anchor="middle" font-size="10" font-style="italic" fill="currentColor">÷ tokens producidos/hora&lt;/text>
&lt;line x1="420" y1="125" x2="470" y2="125" stroke="currentColor" stroke-width="1.4" marker-end="url(#fa)"/>
&lt;rect x="475" y="100" width="245" height="50" rx="6" fill="none" stroke="currentColor" stroke-width="1.6"/>
&lt;text x="597" y="122" text-anchor="middle" font-size="11" font-weight="700" fill="currentColor">€/1M tokens = 0,149 / u&lt;/text>
&lt;text x="597" y="138" text-anchor="middle" font-size="10" fill="currentColor">depende de la utilización útil u&lt;/text>
&lt;text x="380" y="200" text-anchor="middle" font-size="12" font-weight="700" fill="currentColor">La misma GPU, distinto coste por token según u:&lt;/text>
&lt;rect x="90" y="220" width="130" height="110" rx="6" fill="#22c55e" stroke="currentColor" stroke-width="1.2"/>
&lt;text x="155" y="245" text-anchor="middle" font-size="12" font-weight="700" fill="#ffffff">u = 80%&lt;/text>
&lt;text x="155" y="280" text-anchor="middle" font-size="18" font-weight="700" fill="#ffffff">0,186 €&lt;/text>
&lt;text x="155" y="300" text-anchor="middle" font-size="10" fill="#ffffff">/1M tokens&lt;/text>
&lt;text x="155" y="318" text-anchor="middle" font-size="10" fill="#ffffff">GPU bien llena&lt;/text>
&lt;rect x="315" y="220" width="130" height="110" rx="6" fill="#f59e0b" stroke="currentColor" stroke-width="1.2"/>
&lt;text x="380" y="245" text-anchor="middle" font-size="12" font-weight="700" fill="#ffffff">u = 50%&lt;/text>
&lt;text x="380" y="280" text-anchor="middle" font-size="18" font-weight="700" fill="#ffffff">0,298 €&lt;/text>
&lt;text x="380" y="300" text-anchor="middle" font-size="10" fill="#ffffff">/1M tokens&lt;/text>
&lt;text x="380" y="318" text-anchor="middle" font-size="10" fill="#ffffff">1,6× la referencia&lt;/text>
&lt;rect x="540" y="220" width="130" height="110" rx="6" fill="#ef4444" stroke="currentColor" stroke-width="1.2"/>
&lt;text x="605" y="245" text-anchor="middle" font-size="12" font-weight="700" fill="#ffffff">u = 20%&lt;/text>
&lt;text x="605" y="280" text-anchor="middle" font-size="18" font-weight="700" fill="#ffffff">0,744 €&lt;/text>
&lt;text x="605" y="300" text-anchor="middle" font-size="10" fill="#ffffff">/1M tokens&lt;/text>
&lt;text x="605" y="318" text-anchor="middle" font-size="10" fill="#ffffff">4× la referencia&lt;/text>
&lt;defs>
&lt;marker id="fa" 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;/svg>
&lt;/div>
&lt;h2 id="atribuir-el-coste-claves-virtuales-de-litellm">Atribuir el coste: claves virtuales de LiteLLM&lt;/h2>
&lt;p>Fabricado el €/token, falta atribuirlo a quien lo consumió. La pieza que ya está delante de los motores —el &lt;a href="https://blog.lo0.es/posts/router-inferencia-llm-gateway-l7/">router de inferencia L7&lt;/a>— es también el lugar natural para contar. &lt;strong>LiteLLM Proxy&lt;/strong> materializa el chargeback con cuatro mecanismos, todos documentados:&lt;/p>
&lt;p>&lt;strong>Claves virtuales con presupuesto.&lt;/strong> Cada equipo o usuario recibe una &lt;em>virtual key&lt;/em> con un &lt;code>max_budget&lt;/code> y un &lt;code>budget_duration&lt;/code>. Se pueden definir &lt;strong>varias ventanas de presupuesto&lt;/strong> independientes (p.ej. una de 24 h y otra de 30 d) que se resetean en su propio ciclo (&lt;a href="https://docs.litellm.ai/docs/proxy/virtual_keys">Virtual Keys&lt;/a>). Cuando un equipo agota su presupuesto mensual de tokens, el proxy rechaza con error de presupuesto excedido en vez de seguir gastando GPU-horas que nadie va a poder cargar a ningún sitio.&lt;/p>
&lt;p>&lt;strong>Rate-limit RPM/TPM.&lt;/strong> Cada clave lleva límites de &lt;strong>requests por minuto&lt;/strong> (RPM) y &lt;strong>tokens por minuto&lt;/strong> (TPM) (&lt;a href="https://docs.litellm.ai/docs/proxy/users">Budgets, Rate Limits&lt;/a>). Esto no es solo protección anti-abuso: es la herramienta para que un tenant ruidoso no acapare la utilización del cluster a costa de los demás. El rate-limit es la &lt;strong>cuota de capacidad&lt;/strong>; el budget es la &lt;strong>cuota de gasto&lt;/strong>. Son ortogonales y se usan las dos.&lt;/p>
&lt;p>&lt;strong>Spend tracking automático.&lt;/strong> LiteLLM contabiliza el gasto de todos los modelos conocidos por clave, usuario y equipo, registrando la API key, el usuario, el &lt;code>team_id&lt;/code>, los &lt;code>tags&lt;/code> de la request, el end-user, el grupo de modelo y los conteos de tokens (&lt;a href="https://docs.litellm.ai/docs/proxy/cost_tracking">Spend Tracking&lt;/a>). Para los modelos self-hosted del cluster, el coste por token se configura &lt;strong>con el €/token que fabricamos arriba&lt;/strong> —ese es el enganche entre el modelo de coste y la contabilidad real—.&lt;/p>
&lt;p>&lt;strong>Tags para centros de coste.&lt;/strong> Los &lt;code>tags&lt;/code> permiten rastrear gasto y poner presupuestos por etiqueta, categorizando costes por proyecto, departamento o centro de coste (&lt;a href="https://docs.litellm.ai/docs/proxy/tag_budgets">Setting Tag Budgets&lt;/a>). Un tag se adjunta al crear la clave y &lt;strong>toda request hecha con esa clave hereda el tag automáticamente&lt;/strong>; el proxy aplica el presupuesto de la etiqueta. Así el chargeback se mapea limpiamente sobre la jerarquía contable de la organización sin que cada equipo tenga que recordar etiquetar a mano.&lt;/p>
&lt;p>Un fragmento de catálogo declarativo —encaja en el &lt;code>litellm-config&lt;/code> del &lt;a href="https://blog.lo0.es/posts/router-inferencia-llm-gateway-l7/">post del router&lt;/a>— que materializa el coste fabricado y dos tenants:&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">litellm_settings&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="c"># €/token fabricado en este post para el modelo self-hosted.&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="c"># input/output en €/token (no por 1M); 0,186 €/1M = 1.86e-7 €/token a u=80%.&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">model_cost_map&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">llama-70b-onprem&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">input_cost_per_token&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0.000000186&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">output_cost_per_token&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0.000000186&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>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># Claves virtuales por equipo (vía API /key/generate o config):&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="c"># equipo-datos: max_budget=500 €/mes, tpm_limit=200000, tags=[&amp;#34;cc-datos&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="c"># equipo-soporte: max_budget=150 €/mes, tpm_limit=60000, tags=[&amp;#34;cc-soporte&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="c"># El proxy cuenta tokens, multiplica por model_cost_map, descuenta del budget,&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="c"># y atribuye el gasto al tag → showback por centro de coste, sin tocar el motor.&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>El flujo completo de atribución, de la request al informe por equipo:&lt;/p>
&lt;div class="diagram" style="max-width:800px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 800 280" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="flujo de atribución de coste con clave virtual y tags">
&lt;text x="400" y="22" text-anchor="middle" font-size="15" font-weight="700" fill="currentColor">Flujo de atribución: de la request al showback por equipo&lt;/text>
&lt;rect x="20" y="60" width="140" height="70" rx="6" fill="none" stroke="currentColor" stroke-width="1.4"/>
&lt;text x="90" y="88" text-anchor="middle" font-size="11" font-weight="700" fill="currentColor">Request del equipo&lt;/text>
&lt;text x="90" y="106" text-anchor="middle" font-size="10" fill="currentColor">Authorization:&lt;/text>
&lt;text x="90" y="120" text-anchor="middle" font-size="10" fill="#3b82f6">Bearer sk-equipo-datos&lt;/text>
&lt;line x1="160" y1="95" x2="195" y2="95" stroke="currentColor" stroke-width="1.4" marker-end="url(#fb)"/>
&lt;rect x="200" y="50" width="170" height="90" rx="6" fill="none" stroke="#8b5cf6" stroke-width="1.8"/>
&lt;text x="285" y="74" text-anchor="middle" font-size="11" font-weight="700" fill="currentColor">LiteLLM Proxy&lt;/text>
&lt;text x="285" y="92" text-anchor="middle" font-size="9.5" fill="currentColor">1· valida clave + budget&lt;/text>
&lt;text x="285" y="106" text-anchor="middle" font-size="9.5" fill="currentColor">2· aplica RPM/TPM&lt;/text>
&lt;text x="285" y="120" text-anchor="middle" font-size="9.5" fill="currentColor">3· hereda tag cc-datos&lt;/text>
&lt;text x="285" y="134" text-anchor="middle" font-size="9.5" fill="currentColor">4· cuenta tokens&lt;/text>
&lt;line x1="370" y1="95" x2="405" y2="95" stroke="currentColor" stroke-width="1.4" marker-end="url(#fb)"/>
&lt;rect x="410" y="60" width="150" height="70" rx="6" fill="none" stroke="currentColor" stroke-width="1.4"/>
&lt;text x="485" y="88" text-anchor="middle" font-size="11" font-weight="700" fill="currentColor">Motor vLLM&lt;/text>
&lt;text x="485" y="106" text-anchor="middle" font-size="10" fill="currentColor">4×H100 · TP=4&lt;/text>
&lt;text x="485" y="120" text-anchor="middle" font-size="10" fill="currentColor">produce N tokens&lt;/text>
&lt;line x1="485" y1="130" x2="485" y2="165" stroke="currentColor" stroke-width="1.2" stroke-dasharray="4 2" marker-end="url(#fb)"/>
&lt;text x="555" y="152" text-anchor="middle" font-size="9.5" font-style="italic" fill="currentColor">usage.tokens de vuelta&lt;/text>
&lt;rect x="200" y="170" width="170" height="60" rx="6" fill="none" stroke="#22c55e" stroke-width="1.6"/>
&lt;text x="285" y="194" text-anchor="middle" font-size="11" font-weight="700" fill="currentColor">Spend tracking&lt;/text>
&lt;text x="285" y="210" text-anchor="middle" font-size="9.5" fill="currentColor">tokens × €/token (model_cost_map)&lt;/text>
&lt;text x="285" y="223" text-anchor="middle" font-size="9.5" fill="currentColor">→ descuenta budget, guarda en DB&lt;/text>
&lt;line x1="285" y1="140" x2="285" y2="170" stroke="currentColor" stroke-width="1.4" marker-end="url(#fb)"/>
&lt;line x1="370" y1="200" x2="560" y2="200" stroke="currentColor" stroke-width="1.4" marker-end="url(#fb)"/>
&lt;rect x="565" y="170" width="215" height="60" rx="6" fill="none" stroke="#f59e0b" stroke-width="1.6"/>
&lt;text x="672" y="194" text-anchor="middle" font-size="11" font-weight="700" fill="currentColor">Informe por tag / equipo&lt;/text>
&lt;text x="672" y="210" text-anchor="middle" font-size="9.5" fill="currentColor">cc-datos: 312 € · cc-soporte: 88 €&lt;/text>
&lt;text x="672" y="223" text-anchor="middle" font-size="9.5" fill="currentColor">showback (o chargeback al P&amp;amp;L)&lt;/text>
&lt;defs>
&lt;marker id="fb" 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;/svg>
&lt;/div>
&lt;h2 id="showback-vs-chargeback-la-distinción-que-la-finops-foundation-insiste">Showback vs chargeback: la distinción que la FinOps Foundation insiste&lt;/h2>
&lt;p>Las dos palabras se confunden constantemente y la diferencia es de &lt;strong>formalidad contable&lt;/strong>, no de tecnología:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Showback&lt;/strong> — dar a cada equipo &lt;strong>visibilidad&lt;/strong> de lo que consumió y su coste, sin facturarlo de verdad a su presupuesto. El informe llega, el equipo lo ve, pero el dinero no se mueve entre centros de coste.&lt;/li>
&lt;li>&lt;strong>Chargeback&lt;/strong> — &lt;strong>transferir&lt;/strong> de verdad el coste al presupuesto del equipo o producto, poniéndolo en su P&amp;amp;L. El gasto deja de ser un coste central de IT y pasa a ser un coste imputado.&lt;/li>
&lt;/ul>
&lt;p>La FinOps Foundation es explícita en dos puntos que conviene grabar (&lt;a href="https://www.finops.org/framework/capabilities/invoicing-chargeback/">Invoicing &amp;amp; Chargeback&lt;/a>, &lt;a href="https://www.cloudzero.com/blog/chargeback-vs-showback/">Chargeback vs Showback&lt;/a>). Primero: &lt;strong>el showback es requisito de cualquier práctica FinOps; el chargeback depende de la política contable de la organización&lt;/strong>. No todas las organizaciones pueden o quieren mover dinero entre departamentos por consumo de GPU; el showback siempre se puede. Segundo, y contraintuitivo: &lt;strong>ninguno de los dos es &amp;ldquo;más maduro&amp;rdquo; que el otro&lt;/strong>. La narrativa de que el chargeback es la versión &amp;ldquo;adulta&amp;rdquo; del showback es falsa según el propio framework. La recomendación práctica: empezar por showback —dar visibilidad—, luego construir la asignación de costes alineada a la jerarquía organizativa, y solo entonces, si la política contable lo soporta, activar chargeback.&lt;/p>
&lt;p>Para el cluster GPU on-premise esto significa: la máquina de LiteLLM (claves, tags, spend tracking) produce &lt;strong>siempre&lt;/strong> el showback. Convertirlo en chargeback es una decisión de la dirección financiera, no del equipo de plataforma. El equipo de plataforma garantiza que &lt;strong>los números son correctos y reproducibles&lt;/strong>; quién paga de verdad es una decisión de gobierno.&lt;/p>
&lt;h2 id="aislamiento-que-el-coste-sea-atribuible-de-verdad">Aislamiento: que el coste sea atribuible de verdad&lt;/h2>
&lt;p>El chargeback solo es honesto si el consumo es &lt;strong>aislable&lt;/strong>. Si dos tenants comparten una GPU sin partición y uno satura la HBM, el otro sufre degradación que no causó pero que contamina su atribución de coste. El aislamiento tiene dos planos.&lt;/p>
&lt;p>&lt;strong>Aislamiento duro de la GPU: MIG.&lt;/strong> Multi-Instance GPU particiona físicamente una H100 en hasta &lt;strong>7 instancias&lt;/strong> con memoria y SMs dedicados; en partición 7-way cada instancia tiene ~10 GB de HBM3 y SMs propios. MIG da el aislamiento más fuerte: el tenant A en su instancia MIG &lt;strong>no puede&lt;/strong> tocar el rendimiento del tenant B, y la atribución es trivial porque cada instancia es contable por separado (ver &lt;a href="https://blog.lo0.es/posts/compartir-gpu-time-slicing-mps-mig/">Compartir una GPU&lt;/a> para el detalle de MIG vs time-slicing vs MPS). El coste: las instancias MIG son fijas, no se redimensionan en caliente, y si quedan vacías es &lt;strong>capex fragmentado y desperdiciado&lt;/strong> —el puesto de coworking subdividido en cabinas que nadie alquila—.&lt;/p>
&lt;p>&lt;strong>Aislamiento lógico de Kubernetes.&lt;/strong> Sobre el cluster:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Namespaces por tenant&lt;/strong> — frontera de RBAC, NetworkPolicy y cuotas.&lt;/li>
&lt;li>&lt;strong>&lt;code>ResourceQuota&lt;/code>&lt;/strong> — limita cuántos &lt;code>nvidia.com/gpu&lt;/code> (o &lt;code>nvidia.com/mig-1g.10gb&lt;/code>) puede pedir un namespace. Es la cuota de capacidad GPU a nivel de scheduler: el tenant no puede reclamar más GPUs de las que su cuota le concede, lo que &lt;strong>acota su coste máximo&lt;/strong> por construcción.&lt;/li>
&lt;li>&lt;strong>&lt;code>PriorityClass&lt;/code>&lt;/strong> — define qué workloads pueden expulsar a otros bajo presión. El batch nocturno de re-embeddings corre con prioridad baja y cede ante la inferencia interactiva; así llena los valles de utilización sin arriesgar el SLO del tenant de pago. Es la pieza que hace que &amp;ldquo;subir la utilización con batch&amp;rdquo; no canibalice la calidad de servicio.&lt;/li>
&lt;/ul>
&lt;p>La combinación que funciona en el cluster genérico: &lt;strong>MIG para particionar las GPUs entre tenants que necesitan aislamiento duro y atribución limpia&lt;/strong>, &lt;code>ResourceQuota&lt;/code> por namespace para acotar el coste de cada tenant, y &lt;code>PriorityClass&lt;/code> para que el trabajo de relleno suba la utilización sin tocar a los tenants prioritarios.&lt;/p>
&lt;h2 id="aplicado-al-cluster-genérico-4h100">Aplicado al cluster genérico 4×H100&lt;/h2>
&lt;p>Bajemos todo al cluster de la serie: &lt;strong>4 nodos × 4×H100 SXM 80 GB&lt;/strong>, 16 GPUs, ≈ 17,1 €/hora de coste fijo (≈ 150 000 €/año). Tres equipos lo comparten: &lt;strong>Datos&lt;/strong> (RAG productivo, tráfico de oficina), &lt;strong>Soporte&lt;/strong> (asistente de tickets, picos diurnos) y &lt;strong>Plataforma&lt;/strong> (batch de evals y re-embeddings, sin urgencia).&lt;/p>
&lt;p>&lt;strong>Reparto del coste.&lt;/strong> El coste fijo del cluster (150 000 €/año) se reparte vía el spend tracking de LiteLLM &lt;strong>en proporción a los tokens consumidos por cada equipo&lt;/strong>, valorados al €/token fabricado. Si en un mes Datos consumió 1 700 M tokens, Soporte 480 M y Plataforma 320 M, a 0,186 €/1M el showback es ≈ 316 € / 89 € / 60 €. El residuo —el coste fijo de las GPUs que &lt;strong>nadie usó&lt;/strong> porque la utilización media fue, digamos, del 45 %— es el &lt;strong>coste de ociosidad&lt;/strong>, y la decisión de gobierno es si se reparte entre los tenants (penaliza a todos por igual) o se imputa a Plataforma como &amp;ldquo;coste de capacidad no vendida&amp;rdquo; (incentiva a Plataforma a subir la utilización). La FinOps Foundation diría: hazlo visible primero (showback del coste de ociosidad), decide el reparto después.&lt;/p>
&lt;p>&lt;strong>Cuotas por tenant.&lt;/strong> Cada equipo tiene su namespace con &lt;code>ResourceQuota&lt;/code>: Datos puede reclamar hasta 8 GPUs (2 réplicas TP=4), Soporte hasta 4, Plataforma hasta 4 pero con &lt;code>PriorityClass&lt;/code> baja —cede sus GPUs cuando Datos o Soporte las necesitan en pico—. En LiteLLM, cada equipo tiene su clave virtual con &lt;code>max_budget&lt;/code> mensual y &lt;code>tpm_limit&lt;/code> que refleja su cuota de capacidad.&lt;/p>
&lt;p>&lt;strong>MIG para aislar y atribuir.&lt;/strong> Para los modelos pequeños (embeddings, reranker, un Llama 8B de utilidad), una H100 partida en MIG 7-way da siete instancias atribuibles por separado: tres para embeddings de Datos, dos para el reranker de Soporte, dos libres para relleno. Cada instancia es un &amp;ldquo;puesto&amp;rdquo; contable independiente; el showback por tenant sale directo del scheduler.&lt;/p>
&lt;p>&lt;strong>La métrica de gobierno es la utilización, no el €/token.&lt;/strong> Aquí cerramos el círculo. El KPI que el responsable del cluster debe mirar a diario no es &amp;ldquo;cuánto cuesta el token&amp;rdquo; —ese número solo baja como consecuencia— sino &lt;strong>&lt;code>DCGM_FI_DEV_GPU_UTIL&lt;/code>&lt;/strong>, la métrica del DCGM exporter que indica qué fracción del tiempo la GPU no está ociosa (&lt;a href="https://docs.nvidia.com/datacenter/dcgm/latest/gpu-telemetry/dcgm-exporter.html">DCGM exporter&lt;/a>). Y con un matiz crítico que ya aparecía en &lt;a href="https://blog.lo0.es/posts/capacity-planning-inferencia-llm-on-premise/">capacity planning&lt;/a>: &lt;code>DCGM_FI_DEV_GPU_UTIL&lt;/code> mide &amp;ldquo;no idle&amp;rdquo;, no mide trabajo útil. Una GPU puede marcar 100 % de GPU-util con la HBM saturada y la SM occupancy baja, produciendo pocos tokens. Por eso el FinOps serio cruza tres señales: &lt;code>DCGM_FI_DEV_GPU_UTIL&lt;/code> (¿está la GPU ocupada?), &lt;code>DCGM_FI_PROF_SM_OCCUPANCY&lt;/code> y &lt;code>DCGM_FI_PROF_GR_ENGINE_ACTIVE&lt;/code> (¿está haciendo trabajo real?), y &lt;code>vllm:gpu_cache_usage_perc&lt;/code> (¿está la HBM bien aprovechada?). La métrica económica de gobierno es &lt;strong>tokens útiles por GPU-hora&lt;/strong>, y se vigila desde el panel de &lt;a href="https://blog.lo0.es/posts/observabilidad-gpu-dcgm-llm/">observabilidad GPU con DCGM&lt;/a>.&lt;/p>
&lt;p>Un detalle de montaje end-to-end —LibreChat sobre LiteLLM con RAG, que cierra el flujo de tenant a coste— se trata en el artículo (en preparación) sobre el asistente soberano end-to-end; aquí basta saber que el punto de cobro es siempre el proxy, nunca el motor.&lt;/p>
&lt;h2 id="cuatro-trampas-del-finops-gpu-on-premise">Cuatro trampas del FinOps GPU on-premise&lt;/h2>
&lt;p>&lt;strong>Trampa 1 — comparar el €/token on-premise con el de la API comercial al precio de lista.&lt;/strong> La API comercial tiene márgenes, SLA y escala que el cluster on-premise no, pero el on-premise tiene el coste de ociosidad que la API te esconde (ellos llenan sus GPUs con miles de clientes). La comparación honesta es &lt;strong>on-premise a su utilización real&lt;/strong> vs &lt;strong>API a precio real negociado&lt;/strong>, no la fantasía de on-premise al 100 %.&lt;/p>
&lt;p>&lt;strong>Trampa 2 — olvidar el coste de ociosidad en el showback.&lt;/strong> Si solo cargas a los equipos los tokens que consumieron, el coste de las GPUs ociosas desaparece del informe y nadie lo ve. Ese coste existe y alguien lo paga. Hacerlo visible es el primer paso para reducirlo.&lt;/p>
&lt;p>&lt;strong>Trampa 3 — confundir GPU-util alto con eficiencia.&lt;/strong> Una GPU al 100 % de &lt;code>DCGM_FI_DEV_GPU_UTIL&lt;/code> con la HBM saturada y poca SM occupancy gasta capex sin producir tokens proporcionales. El objetivo no es &amp;ldquo;GPU al 100 %&amp;rdquo;, es &amp;ldquo;tokens útiles por euro&amp;rdquo;. Cruzar siempre util con SM occupancy y throughput real.&lt;/p>
&lt;p>&lt;strong>Trampa 4 — chargeback antes que showback.&lt;/strong> Activar chargeback —mover dinero— antes de que los equipos confíen en que los números son correctos genera disputas que queman el programa FinOps entero. Primero visibilidad, luego confianza en los datos, luego —si la política contable lo permite— el dinero.&lt;/p>
&lt;h2 id="ver-también">Ver también&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/multimodal-vlm-on-premise-vllm/">Multimodal VLM on-premise con vLLM&lt;/a> — pieza hermana: servir modelos visión-lenguaje en el mismo cluster compartido cuyo coste aquí atribuimos.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/acelerar-cold-start-carga-modelos-tensorizer/">Acelerar el cold start con Tensorizer&lt;/a> — pieza hermana: recortar el tiempo de carga del modelo hace viable escalar a cero, que es la palanca de utilización más directa.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/capacity-planning-inferencia-llm-on-premise/">Capacity planning para inferencia LLM on-premise&lt;/a> — el throughput sostenido del que sale el €/token se calcula allí; el FinOps lo monetiza.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/compartir-gpu-time-slicing-mps-mig/">Compartir una GPU: time-slicing, MPS y MIG&lt;/a> — la partición que permite aislar tenants y subir la utilización combinando workloads pequeños.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/router-inferencia-llm-gateway-l7/">El router de inferencia LLM: la centralita L7&lt;/a> — el lugar donde vive LiteLLM y donde se cuenta y atribuye cada token.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/autoscaling-llm-kubernetes-keda/">Autoscaling LLM en Kubernetes con KEDA&lt;/a> — apagar réplicas ociosas es la palanca número uno para subir la utilización útil y bajar el €/token.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/observabilidad-gpu-dcgm-llm/">Observabilidad GPU para inferencia LLM con DCGM&lt;/a> — de dónde sale &lt;code>DCGM_FI_DEV_GPU_UTIL&lt;/code>, la métrica de gobierno del cluster compartido.&lt;/li>
&lt;/ul>
&lt;h2 id="referencias">Referencias&lt;/h2>
&lt;ul>
&lt;li>NVIDIA — &lt;em>H100 Tensor Core GPU Datasheet&lt;/em> (TDP 700 W, HBM3 3,35 TB/s): &lt;code>resources.nvidia.com/en-us-gpu-resources/h100-datasheet-24306&lt;/code>.&lt;/li>
&lt;li>LiteLLM — &lt;em>Virtual Keys&lt;/em> (&lt;code>docs.litellm.ai/docs/proxy/virtual_keys&lt;/code>), &lt;em>Budgets &amp;amp; Rate Limits&lt;/em> (&lt;code>/docs/proxy/users&lt;/code>), &lt;em>Spend Tracking&lt;/em> (&lt;code>/docs/proxy/cost_tracking&lt;/code>), &lt;em>Setting Tag Budgets&lt;/em> (&lt;code>/docs/proxy/tag_budgets&lt;/code>), &lt;em>Team Budgets&lt;/em> (&lt;code>/docs/proxy/team_budgets&lt;/code>).&lt;/li>
&lt;li>FinOps Foundation — &lt;em>Invoicing &amp;amp; Chargeback Capability&lt;/em> (&lt;code>finops.org/framework/capabilities/invoicing-chargeback/&lt;/code>) y &lt;em>Data Analysis and Showback&lt;/em> (&lt;code>finops.org/framework/previous-capabilities/analysis-showback/&lt;/code>).&lt;/li>
&lt;li>CloudZero — &lt;em>Chargeback vs. Showback: Cloud Cost Allocation Models Explained&lt;/em> (&lt;code>cloudzero.com/blog/chargeback-vs-showback/&lt;/code>).&lt;/li>
&lt;li>NVIDIA — &lt;em>DCGM Exporter&lt;/em> (&lt;code>docs.nvidia.com/datacenter/dcgm/latest/gpu-telemetry/dcgm-exporter.html&lt;/code>): &lt;code>DCGM_FI_DEV_GPU_UTIL&lt;/code>, &lt;code>DCGM_FI_PROF_SM_OCCUPANCY&lt;/code>, &lt;code>DCGM_FI_PROF_GR_ENGINE_ACTIVE&lt;/code>.&lt;/li>
&lt;/ul></description></item></channel></rss>