Del GPU-hora al coste por token: la métrica que compara on-prem y cloud

Notación: importes en euros (N €), decimales con coma. No se usa el símbolo de dólar (en este sitio es delimitador de fórmula).

Qué cubre este artículo

Cuarto artículo del track de FinOps (A4), y el que cierra la métrica que da sentido a todo el pilar: el coste por token. En A2 vimos cómo OpenCost asigna el coste del hierro (el pod, en €/hora); en A3, qué herramienta usar. Pero el coste del pod no es la métrica que compara on-prem con cloud ni la que entiende el negocio: esa es el coste por token (o por request). Este artículo explica cómo se calcula de verdad —spoiler: para inferencia propia no es un precio de lista, es el €/GPU-hora dividido por el throughput—, cómo se instrumenta con un gateway (LiteLLM), cómo se atribuye por equipo y producto, y cómo se compara contra el cloud europeo. Sin recomendaciones; solo la mecánica y los números.


La identidad: del GPU-hora al token

El coste por millón de tokens (CPM) es el coste del hierro dividido por lo que produce:

$$\text{coste por token} = \frac{\text{coste del hierro (€/h)}}{\text{throughput (tok/s)} \times 3600 / 10^6}$$

Esta es la fórmula del track de FinOps, y tiene una consecuencia que mucha gente no interioriza: para un modelo self-hosted, el coste de un token no existe como precio fijo. Depende de dos cosas que cambian: el coste del hierro (de OpenCost, en €/hora) y el throughput (de tu benchmark, en tok/s). El mismo modelo en el mismo nodo cuesta la mitad por token si doblas el throughput con una optimización —porque el denominador cambia, no el numerador—. El coste por token de inferencia propia es una función de tu eficiencia, no una tarifa.

Esto lo distingue radicalmente de una API externa, donde el precio por token es una tarifa fija que te cobra el proveedor. Comparar ambos exige convertir tu coste variable en un número, y ahí es donde se junta el hierro (A2) con los tokens (este artículo).


Las dos mitades del coste por token

El coste por token nace de unir dos mediciones que viven en sitios distintos:

Coste del hierro (OpenCost)€/hora del pod vLLM (por uso)Tokens (gateway LiteLLM)tokens/s por modelo y equipo÷ → coste por token€/1M tok por equipocomparar / chargebackon-prem vs cloud · por equipoSin el hierro (OpenCost) sabrías los tokens pero no su coste; sin el gateway sabrías el coste del pod pero no los tokens. Hace falta unir las dos.

La mitad del hierro la pone OpenCost (artículo A2): el coste por uso del pod de vLLM, en €/hora. La mitad de los tokens la pone el gateway, que intercepta cada petición y cuenta los tokens por modelo y por equipo. Dividiendo, sale el coste por token —y, crucialmente, por equipo, que es lo que habilita el chargeback—.


El gateway: LiteLLM a fondo

El gateway se sitúa entre la aplicación y el motor (vLLM) o el proveedor, e intercepta cada petición. LiteLLM es el de referencia OSS: hace de proxy ante 100+ modelos y rastrea el gasto por claves, usuarios y equipos, registrando el gasto de todos los modelos conocidos automáticamente (LiteLLM · Spend Tracking).

Sus mecanismos clave:

MecanismoQué hace
response_costel coste de cada respuesta, accesible en el logging (kwargs["response_cost"])
Spend logsuna fila por petición con tokens, modelo, usuario, clave y coste (SQLite/PostgreSQL)
Tagsetiquetar cada request por equipo, proyecto, entorno y tier de modelo
Budgetspresupuestos y rate limits por equipo o usuario
Custom callbacksloggers a medida para clave/usuario/modelo/tokens/coste

Con la tabla de spend logs (vía el adaptador de base de datos), tienes el detalle de cada petición para construir dashboards de coste (LiteLLM · Logging), y puedes etiquetar cada request con equipo/proyecto/entorno para el análisis por equipo, con notificaciones (Slack) y topes duros para claves que no deben superar un límite. Es, en la práctica, el medidor de tokens y el repartidor de coste de la plataforma.


La trampa del self-hosted: LiteLLM no sabe lo que te cuesta un token propio

Aquí está el punto que casi nadie cablea bien. LiteLLM rastrea el coste con precios de lista de los modelos conocidos (los de las APIs: OpenAI, Anthropic, etc.). Pero para un modelo self-hosted en tu vLLM, no hay precio de lista —tú no le pagas a nadie por token—. Si no le dices nada, LiteLLM no sabe el coste real de tu token propio. La solución es el custom pricing: declararle a LiteLLM el coste por token de tu modelo self-hosted (LiteLLM · Custom Pricing).

¿Y de dónde sale ese número? De la identidad de arriba: el coste del hierro (OpenCost) dividido por el throughput (tu benchmark). Es decir, el flujo correcto es:

  1. OpenCost te da el coste del pod de vLLM: ~11 €/hora (A2).
  2. Tu benchmark te da el throughput: ~2.800 tok/s (track B).
  3. La identidad da el coste por token: 11 ÷ (2.800 × 3.600 / 10⁶) ≈ 1,09 €/1M tok.
  4. Ese 1,09 €/1M lo metes como custom pricing en LiteLLM.

Solo así el response_cost de cada petición refleja el coste real de tu inferencia, no un cero o un precio de lista ajeno. Sin este paso, tus dashboards de coste de LiteLLM mienten para los modelos propios. Es la unión explícita de los tres tracks: hierro (FinOps), throughput (benchmarking) y medición (gateway).


Configurar el custom pricing: ejemplo

En LiteLLM, el coste real de un modelo self-hosted se declara en su configuración. Un ejemplo con el coste por token derivado de la identidad (1,09 €/1M ÷ 10⁶ = 0,00000109 €/token):

# config.yaml de LiteLLM — coste real de un modelo self-hosted
model_list:
  - model_name: llama-3.1-70b-onprem
    litellm_params:
      model: openai/llama-3.1-70b           # tu endpoint vLLM
      api_base: http://vllm:8000/v1
      input_cost_per_token:  0.00000109      # €/token (de OpenCost ÷ throughput)
      output_cost_per_token: 0.00000109      # afinar si separas prefill/decode

Con eso, cada response_cost que registra LiteLLM refleja el coste real de tu hierro. La nota operativa: este número hay que actualizarlo cuando cambie el coste del nodo (nueva amortización, otro precio de energía) o el throughput (una optimización del motor). No es una constante; es el output de OpenCost y del benchmark, y se recalcula cuando cualquiera de los dos cambia. Automatizar ese recálculo —del coste del nodo y del throughput medido al custom pricing— es lo que mantiene los dashboards de coste honestos.


El coste por token cambia con el throughput: léelo sobre el sweep

Como el throughput es el denominador, el coste por token no es un punto, es una curva sobre el sweep de concurrencia. Sobre el nodo de ~11 €/hora:

ConcurrenciaThroughput (tok/s)Coste por 1M tokens
1350~8,73 €
82.100~1,46 €
163.330 (goodput)~0,92 €
243.900 bruto / 2.420 goodput~0,78 € bruto / ~1,26 € sobre goodput

Lecturas importantes: a baja concurrencia el coste por token es altísimo (el coste fijo del nodo se reparte entre pocos tokens); el coste baja al subir la ocupación. Pero ojo a la última fila: si calculas el coste sobre el throughput bruto (3.900) sales con 0,78 €, pero si lo calculas sobre el goodput (2.420, el que cumple el SLO) sales con 1,26 € —y este último es el coste real, porque las peticiones que violan el SLO no cuentan como producción útil—. El coste por token honesto se calcula sobre el goodput, no sobre el throughput de catálogo. Es la unión del track de coste con el de benchmarking: el denominador correcto es el goodput.


Coste por request: no solo por token

El coste por token es la unidad; el coste por request es lo que factura una petición completa. Una request consume tokens de entrada (prompt) + tokens de salida (generación), y ambos cuentan:

$$\text{coste por request} = (\text{tokens entrada} + \text{tokens salida}) \times \text{coste por token}$$

Con matices: en muchos motores el prefill (entrada) y el decode (salida) tienen costes distintos por token (el decode es memory-bound y más caro por token), así que un modelo de coste fino distingue ambos. Para la mayoría de casos, un coste por token medio ponderado vale; para optimizar, conviene separar prefill y decode. LiteLLM registra los tokens de entrada y salida por separado en sus spend logs, así que el dato está disponible para afinar.

El coste por request es el que conecta con el producto: si una feature consume de media 1.500 tokens (1.200 de prompt + 300 de salida) y el coste es 1,09 €/1M, cada uso cuesta ~0,0016 € —la base para fijar el margen, como se vio en la intro de FinOps—.


Coste por modelo y por tier

Una plataforma no sirve un solo modelo. El coste por token varía por modelo y por configuración, y el gateway los distingue. Un 8B y un 70B en el mismo nodo tienen costes por token muy distintos: el 8B da mucho más throughput (más tokens/s) con la misma GPU-hora, así que su coste por token es una fracción del 70B. La consecuencia para el diseño: enrutar cada petición al modelo más barato que cumpla la calidad es una palanca directa de coste —servir un 70B donde basta un 8B es pagar de más por token—.

Modelo (ejemplo, mismo nodo)Throughput relativoCoste por token relativo
8Baltobajo
70B FP8mediomedio
70B FP16bajoalto

El gateway, con su custom pricing por modelo, hace visible esta diferencia y permite el routing por coste: clasificar la petición y mandarla al tier adecuado. Conecta con el router L7 del track de serving: el gateway no solo mide el coste, puede decidir en función de él. Y la cuantización (FP16→FP8) aparece otra vez como palanca: el mismo modelo en FP8 sube throughput y baja el coste por token, moviendo el dato sin cambiar de modelo.


Atribución: del coste al equipo y al producto

La razón de poner un gateway no es solo medir el coste total, es repartirlo. Etiquetando cada request con equipo, producto y entorno, LiteLLM construye el reparto por dimensión de negocio:

request + tagsequipo · productospend logstokens · coste · claveagregación€/equipo · €/productochargeback+ presupuestosTopes duros por clave y alertas de presupuesto (Slack) cierran el bucle: medir → atribuir → gobernar.Es el lado de tokens del chargeback; el lado de hierro lo pone OpenCost. Juntos: coste por token por equipo.

Con presupuestos por equipo y topes duros por clave, el gateway no solo informa: gobierna. Un equipo que se pasa de presupuesto recibe alerta; una clave con tope duro no puede gastar más. Es la fase Operate del FinOps aplicada al token.

Ejemplo de informe combinado

Juntando el hierro (OpenCost) y los tokens (gateway), el informe mensual de coste por token por equipo sobre el nodo de ejemplo:

EquipoTokens/mesCoste por token aplicadoCoste imputado
A · chat-prod240M1,09 €/1M (70B FP8)~262 €
B · batch90M0,40 €/1M (8B)~36 €
C · experimentación15M1,09 €/1M (70B)~16 € + idle

Lo que revela: A consume mucho pero a coste eficiente (FP8, alta utilización); B usa un modelo barato (8B) para su carga; C consume poco pero, como vimos en A2, arrastra el coste de idle de su GPU infrautilizada. El informe por token más el de hierro de OpenCost dan la imagen completa: quién gasta, en qué modelo, con qué eficiencia. Es el chargeback que ninguna de las dos mitades produciría sola. Y la cifra por equipo es la que se lleva a la conversación de presupuesto: no “el cluster cuesta X”, sino “tu equipo consumió Y millones de tokens a Z €/millón”.


Gobernar el gasto: presupuestos, topes y alertas

Medir sin gobernar es un panel; el valor está en cerrar el bucle. LiteLLM permite tres niveles de control sobre el gasto:

ControlQué haceCuándo
Presupuesto blandoalerta (Slack) al superar un umbralseguimiento de equipos
Rate limitlimita peticiones/tokens por minutoevitar picos de coste
Tope duro (hard cap)la clave no puede gastar másclaves que nunca deben pasarse

El patrón sano: presupuestos blandos con alerta para los equipos (que ajusten su consumo), rate limits para suavizar picos, y topes duros solo en claves críticas (un servicio que no debe dispararse). Con esto, el coste por token deja de ser un dato a posteriori y se convierte en un control en tiempo real: la fase Operate del FinOps, aplicada a la inferencia.


Comparación on-prem vs cloud europeo (el porqué de todo)

El coste por token existe para responder una pregunta: ¿sale más barato servir en mi hierro o alquilar? Con la identidad y datos europeos:

OpciónCoste por 1M tokensNotas
On-prem amortizado (8×H100, 2.800 tok/s)~1,09 €tu hierro, tu soberanía
Cloud europeo Scaleway (8×H100, on-demand)~2,17 €UE, sin operar hierro
API externa (modelo propietario)tarifa del proveedorsin soberanía del dato

El coste por token es lo que hace comparable lo incomparable: tu coste variable (hierro ÷ throughput) frente a la tarifa fija de un proveedor. Y deja ver la palanca: si una optimización sube tu throughput de 2.800 a 4.200 tok/s, tu coste on-prem baja a ~0,73 €/1M —ampliando la ventaja sobre el alquiler—. Por eso el benchmarking (track B) es, indirectamente, la herramienta que más mueve el coste por token: cada mejora de goodput se traduce en este número.


Del coste por token al precio del producto

El coste por token cierra el círculo con el negocio cuando se convierte en coste por unidad de producto. La cadena: coste por token (de la identidad) × tokens por uso de una feature = coste marginal de esa feature. Con eso, tres decisiones de negocio quedan respaldadas por datos:

  1. Fijar precio. Si servir una feature cuesta 0,0016 € por uso, el precio al cliente tiene que cubrirlo con margen; el coste por token es el suelo del pricing.
  2. Detectar features ruinosas. Una feature que consume muchos tokens (prompts largos, mucha salida) puede costar más de lo que aporta; el coste por request lo revela antes de escalar.
  3. Comparar build vs buy a nivel de producto. El coste por token on-prem frente a la tarifa de una API, para esa carga concreta, decide si conviene servir en propio o consumir externo.

Esta es la razón última de todo el track de FinOps: no es contabilidad de infraestructura, es la base cuantitativa de las decisiones de producto y de arquitectura. Un coste por token medido y atribuido convierte “¿esto es rentable?” de una intuición en un cálculo.


Comparación detallada: on-prem, cloud europeo y API

Ampliando la comparación con escenarios, para el mismo trabajo (1M tokens):

OpciónCoste/1M tokSoberaníaCuándo encaja
On-prem amortizado, alta utilización~0,7–1,1 €total (UE)volumen alto y sostenido
On-prem amortizado, baja utilización~2–4 €total (UE)malo: el idle dispara el coste
Cloud europeo (Scaleway, on-demand)~2,2 €UEvolumen variable, sin operar hierro
Cloud europeo (reserved/comprometido)~1,5–1,8 €UEvolumen medio comprometido
API externa propietariatarifa del proveedorno UEprototipo / sin requisito de soberanía

La tabla deja ver dos cosas. Primero, el on-prem solo gana si la utilización es alta —a baja ocupación, el idle lo hace más caro que el cloud—, lo que conecta el coste por token con el scheduling y la utilización (el idle de A2). Segundo, la API externa, por competitiva que sea su tarifa, pierde la soberanía del dato —un eje que para datos RGPD no es negociable—. El coste por token es la métrica que pone los tres primeros en la misma escala; la soberanía es la restricción que descarta el último para según qué datos.


Caché de prompts y el coste efectivo

Un matiz que afina el coste por token real: el prefix caching. Cuando muchas peticiones comparten el mismo prefijo (un system prompt largo, un contexto repetido), el motor cachea su cómputo de prefill y no lo recalcula en cada petición. Eso significa que los tokens de entrada cacheados cuestan casi cero la segunda vez y siguientes, así que el coste efectivo por token de una carga con alto hit rate de caché es menor que el coste nominal. Las APIs externas ya lo reflejan con un precio reducido para tokens cacheados; en self-hosted, el efecto está en que el throughput sube (menos prefill que recomputar), lo que por la identidad baja el coste por token.

La implicación para el modelo de coste: si tu carga tiene prefijos compartidos (RAG sobre el mismo corpus, agentes con el mismo system prompt), el coste por token real es inferior al que da el cálculo ingenuo, y conviene medir el hit rate de prefix caching para no sobreestimar el coste. Y al revés: una carga de prompts únicos e irrepetibles no se beneficia de la caché, y su coste por token es el nominal completo. El coste por token, una vez más, no es una constante: depende del modelo, la precisión, la utilización, el goodput y del patrón de reutilización de la carga. Medirlo sobre tu tráfico real, no sobre un benchmark sintético sin caché, es lo que da el número que de verdad pagas.


Estado del arte 2026

  • El gateway como estándar: LiteLLM (y alternativas) se consolidan como la capa que mide tokens, atribuye coste y gobierna presupuestos en el stack LLM.
  • FOCUS para tokens: capas sobre el gateway generan logs compatibles con FOCUS, integrando el coste de IA con el resto del gasto cloud (intro de FinOps).
  • Custom pricing como puente: la conexión OpenCost→gateway vía custom pricing es la forma estándar de dar coste real a los modelos self-hosted.
  • Coste por token como KPI de negocio: cada vez más, el coste por token (y por producto) es la métrica que el negocio exige, no el coste del pod.

Límites y trampas (data-driven)

  1. Custom pricing olvidado. Sin declararle a LiteLLM el coste real de tu token self-hosted, el response_cost de tus modelos propios es cero o un precio ajeno. Cierra el puente OpenCost→gateway.
  2. Throughput estático. El coste por token cambia con el throughput; si optimizas el motor pero no actualizas el custom pricing, el coste reportado se desfasa.
  3. Olvidar el prefill/decode. Un coste medio por token vale para reportar; para optimizar, separa entrada y salida.
  4. Medir sin gobernar. Spend logs sin presupuestos ni topes son un panel bonito; el valor está en cerrar el bucle con alertas y caps.
  5. Comparar tarifas con costes sin igualar supuestos. Tu 1,09 €/1M asume una utilización y un throughput; la tarifa del proveedor, no. Fija los supuestos antes de comparar.

Con el coste por token resuelto, el track de FinOps tiene su métrica central; los artículos siguientes (A5 chargeback multi-tenant, A8 modelo TCO) construyen sobre ella. La cadena completa —hierro (OpenCost) ÷ throughput (benchmark) = coste por token, medido y atribuido por el gateway— es lo que convierte el coste de la IA en un número defendible, en euros y por equipo.

Cierre

El coste por token es la métrica que reconcilia los tres tracks de la serie en un solo número, y su lección de fondo es contraintuitiva: para inferencia propia, el coste de un token no es un precio, es el reflejo de tu eficiencia. Sale de dividir el coste del hierro (OpenCost) por el throughput útil (el goodput de tu benchmark), y se hace visible y gobernable con un gateway (LiteLLM) que cuenta los tokens, los atribuye por equipo y aplica presupuestos. El error que invalida todo el ejercicio es dejar el custom pricing a cero y creerse que la inferencia propia es “gratis”; el acierto es cerrar el puente OpenCost→gateway y mantener el número actualizado cuando cambie el coste del nodo o el throughput. Hecho así, el coste por token responde con datos a la única pregunta que el negocio repite —¿sale a cuenta servir esto en mi hierro?— y lo hace en euros, por equipo y por producto, comparable contra el cloud europeo y contra cualquier API. Para una propuesta de arquitectura soberana, es la columna del cuadro de mando que traduce toda la ingeniería de coste en la frase que cierra una reunión de presupuesto: este es el coste por token, así se mide, y aquí está el banco para reproducirlo.

Ver también

Fuentes