<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ai-Gateway on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/ai-gateway/</link><description>Recent content in Ai-Gateway on lo0 — Blog Técnico</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Thu, 21 May 2026 07:15:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/tags/ai-gateway/index.xml" rel="self" type="application/rss+xml"/><item><title>El cluster GPU como plataforma: cómo convertir un cluster compartido en un servicio multi-tenant que tus equipos puedan consumir</title><link>https://blog.lo0.es/posts/cluster-h100-plataforma-multi-tenant/</link><pubDate>Thu, 21 May 2026 07:15:00 +0200</pubDate><guid>https://blog.lo0.es/posts/cluster-h100-plataforma-multi-tenant/</guid><description>&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>Tener un cluster de GPUs caro y muchas cargas distintas que lo quieren usar no es un problema de &lt;strong>infraestructura&lt;/strong>: es un problema de &lt;strong>producto interno&lt;/strong>. Lo que separa &amp;ldquo;tenemos un cluster&amp;rdquo; de &amp;ldquo;tenemos una plataforma de inferencia&amp;rdquo; son cuatro capas que el mercado ha consolidado en 2026: una &lt;strong>capa de gateway&lt;/strong> que centraliza autenticación, routing y políticas (LiteLLM, Portkey, Kong AI Gateway); un &lt;strong>modelo de aislamiento GPU&lt;/strong> apropiado al perfil de los tenants (MIG hardware-isolation para multi-tenant no confiable, MPS para procesos del mismo equipo, time-slicing solo para dev); un &lt;strong>sistema de quotas y rate limiting&lt;/strong> con presupuestos por tenant/equipo/proyecto (LiteLLM lo hace en su core a nivel team/user/api-key con 429s descriptivos); y un &lt;strong>plano de observabilidad multi-tenant&lt;/strong> que permite cost attribution real (showback como paso intermedio, chargeback como destino), tracing por tenant y dashboards diferenciados. Aplicado a un cluster GPU mid-scale típico (un nodo con 4-8 H100 SXM y NVLink, un punto habitual para empezar en producción), esto se traduce en decisiones concretas: con ~640 GB de VRAM agregada en 8 GPUs y dos modelos típicos en producción (un modelo grande de 70B+ con tensor parallel y un modelo mediano replicado), el cluster sirve entre &lt;strong>decenas y bajos centenares de sesiones simultáneas&lt;/strong> según mix; el aislamiento GPU se suele resolver con &lt;strong>MIG en cargas inferiores y dedicación per-model&lt;/strong> en cargas grandes; y la métrica de éxito de la plataforma es la &lt;strong>utilización efectiva&lt;/strong>, que en producción típica está en &lt;strong>30-40%&lt;/strong> y el objetivo razonable de optimización es subirla a 60-70% sin degradar SLA.&lt;/p>
&lt;blockquote>
&lt;p>Este es el &lt;strong>quinto post de la serie MLOps para LLMs&lt;/strong>. Es el más operacionalmente orientado y atraviesa varias etapas del pipeline (Deploy + Observe + transversales). El &amp;ldquo;estás aquí&amp;rdquo; señala las dos etapas activas porque la noción de plataforma multi-tenant no vive en una sola.&lt;/p>
&lt;/blockquote>
&lt;h2 id="estás-aquí-deploy--observe-cluster-como-producto">Estás aquí: Deploy + Observe (cluster como producto)&lt;/h2>
&lt;div class="diagram" style="max-width:780px;margin:1rem auto;">
&lt;svg viewBox="0 0 780 90" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="estás aquí: Deploy + Observe">
&lt;style>.box{stroke:#444;stroke-width:1.4;rx:6}.active{fill:#7adb7a;stroke-width:3}.active2{fill:#c47aff;stroke-width:3}.idle{fill:#f4f4f4}.lbl{font:600 12px sans-serif;fill:#222}.arr{stroke:#666;stroke-width:1.4;fill:none;marker-end:url(#mt1)}.cyc{stroke:#888;stroke-width:1.2;fill:none;stroke-dasharray:4 2;marker-end:url(#mt1)}&lt;/style>
&lt;defs>&lt;marker id="mt1" 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="#666"/>&lt;/marker>&lt;/defs>
&lt;text x="390" y="20" text-anchor="middle" class="lbl">Estás aquí: DEPLOY + OBSERVE · el cluster como plataforma con tenants&lt;/text>
&lt;rect x="30" y="35" width="110" height="35" class="box idle"/>&lt;text x="85" y="58" text-anchor="middle" class="lbl">1 · Data&lt;/text>
&lt;rect x="155" y="35" width="110" height="35" class="box idle"/>&lt;text x="210" y="58" text-anchor="middle" class="lbl">2 · Tune&lt;/text>
&lt;rect x="280" y="35" width="110" height="35" class="box idle"/>&lt;text x="335" y="58" text-anchor="middle" class="lbl">3 · Eval&lt;/text>
&lt;rect x="405" y="35" width="110" height="35" class="box active"/>&lt;text x="460" y="58" text-anchor="middle" class="lbl">4 · Deploy&lt;/text>
&lt;rect x="530" y="35" width="110" height="35" class="box active2"/>&lt;text x="585" y="58" text-anchor="middle" class="lbl">5 · Observe&lt;/text>
&lt;rect x="655" y="35" width="110" height="35" class="box idle"/>&lt;text x="710" y="58" text-anchor="middle" class="lbl">6 · Retrain&lt;/text>
&lt;path class="arr" d="M140,52 L155,52"/>&lt;path class="arr" d="M265,52 L280,52"/>&lt;path class="arr" d="M390,52 L405,52"/>&lt;path class="arr" d="M515,52 L530,52"/>&lt;path class="arr" d="M640,52 L655,52"/>
&lt;path class="cyc" d="M710,72 L710,82 L85,82 L85,72"/>
&lt;/svg>
&lt;/div>
&lt;h2 id="la-pregunta-que-cambia-el-marco">La pregunta que cambia el marco&lt;/h2>
&lt;p>Cuando un equipo de plataforma adquiere hardware GPU caro y empieza a montar inferencia, la primera versión casi siempre es &lt;strong>mononosa&lt;/strong>: un modelo, un cliente, una latencia objetivo. Funciona. Cuando llega el segundo equipo pidiendo el mismo recurso, &lt;strong>la mononosa se vuelve política interna&lt;/strong>: ¿cuántas réplicas le damos? ¿Qué hacemos si chocan los SLA? ¿Quién paga los tokens del experimento del equipo B? Y cuando llega el tercero, lo que era un proyecto de SRE pasa a ser un proyecto de &lt;strong>producto interno&lt;/strong>.&lt;/p>
&lt;p>La distinción no es técnica, es de marco. &lt;strong>Un cluster es infra&lt;/strong>. &lt;strong>Una plataforma es un servicio con clientes, contratos y métricas de éxito&lt;/strong>. El cambio de marco implica:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Clientes identificables&lt;/strong> (tenants), no usuarios anónimos.&lt;/li>
&lt;li>&lt;strong>Contratos&lt;/strong> (latency SLA, throughput garantizado, modelos disponibles), no &amp;ldquo;lo que dé tiempo&amp;rdquo;.&lt;/li>
&lt;li>&lt;strong>Métricas de éxito&lt;/strong> que no son técnicas sino de producto: adopción, satisfaction, cost per query por tenant, tiempo del primer &amp;ldquo;hello world&amp;rdquo;.&lt;/li>
&lt;/ul>
&lt;p>Este post recorre cómo se opera ese cambio de marco. Lo aterriza sobre un &lt;strong>cluster mid-scale (4-8 H100 SXM con NVLink en un solo nodo)&lt;/strong>, configuración habitual cuando se empieza con inferencia LLM seria; pero los principios se generalizan a cualquier topología, desde un nodo único con dos GPUs hasta clusters multi-nodo con InfiniBand.&lt;/p>
&lt;h2 id="las-cuatro-capas-de-una-plataforma-de-inferencia-multi-tenant">Las cuatro capas de una plataforma de inferencia multi-tenant&lt;/h2>
&lt;p>La arquitectura canónica que se ha establecido en 2026 tiene &lt;strong>cuatro capas&lt;/strong> que cualquier plataforma multi-tenant seria implementa, en orden de afuera hacia adentro:&lt;/p>
&lt;div class="diagram" style="max-width:780px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 780 410" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Cuatro capas plataforma multi-tenant">
&lt;style>.title{font:700 13px sans-serif;fill:#222}.lbl{font:600 12px sans-serif;fill:#222}.sm{font:11px sans-serif;fill:#555}.tiny{font:10px sans-serif;fill:#666}.layer{stroke:#444;stroke-width:1.5;rx:6}.gw{fill:#ffe9d6}.pol{fill:#d6eaff}.iso{fill:#d9f5d6}.obs{fill:#e9d6f5}.cluster{stroke:#666;stroke-dasharray:4 2;fill:none}.tenant{stroke:#888;stroke-width:1.4;fill:#fffce6;rx:4}.arr{stroke:#666;stroke-width:1.4;fill:none;marker-end:url(#pm1)}&lt;/style>
&lt;defs>&lt;marker id="pm1" 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="#666"/>&lt;/marker>&lt;/defs>
&lt;text x="390" y="22" text-anchor="middle" class="title">Las cuatro capas de la plataforma multi-tenant&lt;/text>
&lt;rect x="40" y="50" width="100" height="40" class="tenant"/>&lt;text x="90" y="68" text-anchor="middle" class="sm">Tenant A&lt;/text>&lt;text x="90" y="82" text-anchor="middle" class="tiny">soporte chat&lt;/text>
&lt;rect x="160" y="50" width="100" height="40" class="tenant"/>&lt;text x="210" y="68" text-anchor="middle" class="sm">Tenant B&lt;/text>&lt;text x="210" y="82" text-anchor="middle" class="tiny">RAG legal&lt;/text>
&lt;rect x="280" y="50" width="100" height="40" class="tenant"/>&lt;text x="330" y="68" text-anchor="middle" class="sm">Tenant C&lt;/text>&lt;text x="330" y="82" text-anchor="middle" class="tiny">agente code&lt;/text>
&lt;rect x="400" y="50" width="100" height="40" class="tenant"/>&lt;text x="450" y="68" text-anchor="middle" class="sm">Tenant D&lt;/text>&lt;text x="450" y="82" text-anchor="middle" class="tiny">data extr.&lt;/text>
&lt;rect x="520" y="50" width="100" height="40" class="tenant"/>&lt;text x="570" y="68" text-anchor="middle" class="sm">Tenant E&lt;/text>&lt;text x="570" y="82" text-anchor="middle" class="tiny">batch ETL&lt;/text>
&lt;rect x="640" y="50" width="100" height="40" class="tenant"/>&lt;text x="690" y="68" text-anchor="middle" class="sm">notebooks&lt;/text>&lt;text x="690" y="82" text-anchor="middle" class="tiny">research&lt;/text>
&lt;rect x="40" y="120" width="700" height="60" class="layer gw"/>
&lt;text x="390" y="144" text-anchor="middle" class="lbl">Capa 1 · AI Gateway&lt;/text>
&lt;text x="55" y="166" class="sm">Auth (OIDC/API keys) · Routing por modelo · Failover · Caching · Logging · OTel emission · Rate limiting&lt;/text>
&lt;rect x="40" y="195" width="700" height="60" class="layer pol"/>
&lt;text x="390" y="219" text-anchor="middle" class="lbl">Capa 2 · Policy &amp;amp; Quota Plane&lt;/text>
&lt;text x="55" y="241" class="sm">Quotas RPS/TPM por tenant · Budgets mensuales · Whitelist modelos · Priority classes · Admission control&lt;/text>
&lt;rect x="40" y="270" width="700" height="60" class="layer iso"/>
&lt;text x="390" y="294" text-anchor="middle" class="lbl">Capa 3 · Isolation Plane&lt;/text>
&lt;text x="55" y="316" class="sm">MIG / MPS / time-slicing · Namespaces K8s · NetworkPolicies · ResourceQuotas · Priority + preemption&lt;/text>
&lt;rect x="40" y="345" width="700" height="55" class="layer obs"/>
&lt;text x="390" y="369" text-anchor="middle" class="lbl">Capa 4 · Observability Plane (multi-tenant)&lt;/text>
&lt;text x="55" y="391" class="sm">Traces con tenant_id · Métricas labeled · Cost attribution · Dashboards por tenant · Audit logs&lt;/text>
&lt;path class="arr" d="M90,90 L390,120"/>
&lt;path class="arr" d="M450,90 L390,120"/>
&lt;path class="arr" d="M690,90 L390,120"/>
&lt;/svg>
&lt;/div>
&lt;p>Cada capa resuelve un problema concreto. Vamos a una por una.&lt;/p>
&lt;h2 id="capa-1--ai-gateway-la-puerta-de-entrada-única">Capa 1 — AI Gateway: la puerta de entrada única&lt;/h2>
&lt;p>El &lt;strong>AI Gateway&lt;/strong> es el componente que tus tenants ven. Es una API HTTP/gRPC compatible con OpenAI (típicamente &lt;code>/v1/chat/completions&lt;/code>, &lt;code>/v1/embeddings&lt;/code>, &lt;code>/v1/models&lt;/code>) que &lt;strong>centraliza&lt;/strong> todo lo que pasa antes de tocar los backends de inferencia.&lt;/p>
&lt;h3 id="por-qué-centralizar">Por qué centralizar&lt;/h3>
&lt;p>Sin gateway, los tenants se conectan directamente a vLLM o al modelo que sea. Cada cambio (rotar un endpoint, añadir un modelo, cambiar credenciales, aplicar política) requiere notificar a todos los tenants. Cada tenant tiene su propia lógica de retry, su propio logging, su propio modelo de auth. Es inoperable a partir del tercer cliente.&lt;/p>
&lt;p>Con gateway, &lt;strong>el cambio se hace en un sitio&lt;/strong>. Los tenants tienen una URL estable y unas credenciales; el resto es problema del gateway.&lt;/p>
&lt;h3 id="las-tres-opciones-dominantes-2026">Las tres opciones dominantes 2026&lt;/h3>
&lt;p>&lt;strong>&lt;a href="https://docs.litellm.ai/">LiteLLM&lt;/a>&lt;/strong> es la opción &lt;strong>OSS más popular&lt;/strong>, Python-first, modelo de despliegue como proxy. Soporta &lt;strong>100+ proveedores&lt;/strong> (OpenAI, Anthropic, Bedrock, vLLM self-hosted, Ollama, etc.) detrás de una API OpenAI-compatible unificada. &lt;strong>Hierarchy nativa multi-tenant&lt;/strong> con Organizations → Teams → Users → API Keys, cada nivel con budget independiente. Versión Apache 2.0 cubre lo básico; &lt;strong>RBAC, SSO, audit logs y team-level enforcement requieren versión Enterprise paga&lt;/strong>. Despliegue en K8s con Helm chart oficial.&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://portkey.ai/">Portkey&lt;/a>&lt;/strong> es la opción &lt;strong>comercial / SaaS&lt;/strong> más madura. Single control plane que enforces budgets, quotas, permissions, compliance. &lt;strong>Real-time spending tracking&lt;/strong> con alerting. RBAC, audit, workspaces, SSO incluidos. Trade-off: dependencia de un servicio externo y modelo de pricing por requests.&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://konghq.com/blog/enterprise/llm-cost-management-ai-showback-and-chargeback">Kong AI Gateway&lt;/a>&lt;/strong> es la opción para organizaciones &lt;strong>que ya tienen Kong como API gateway&lt;/strong>. Plug-in AI sobre el gateway Kong existente, integra con su modelo de plugins, consumers y rate-limits. Si tu equipo de plataforma ya opera Kong, es la fricción más baja.&lt;/p>
&lt;h3 id="cuándo-elegir-cada-uno">Cuándo elegir cada uno&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Situación&lt;/th>
&lt;th>Gateway&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>OSS puro, self-host, equipo Python-first&lt;/td>
&lt;td>&lt;strong>LiteLLM&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Necesitas RBAC, SSO, audit log out-of-the-box, presupuesto disponible&lt;/td>
&lt;td>&lt;strong>Portkey&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ya operas Kong como API gateway corporativo&lt;/td>
&lt;td>&lt;strong>Kong AI Gateway&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Greenfield enterprise con compliance estricto&lt;/td>
&lt;td>Portkey (probablemente)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Empresa media OSS-first sin compliance regulado&lt;/td>
&lt;td>LiteLLM (típicamente)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="lo-que-el-gateway-tiene-que-hacer-mínimo">Lo que el gateway tiene que hacer mínimo&lt;/h3>
&lt;p>Independientemente de la opción, lo que cualquier deployment serio debe enforcer:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Auth y identidad&lt;/strong>: cada request lleva una API key resoluble a un tenant + usuario + equipo.&lt;/li>
&lt;li>&lt;strong>Routing por modelo&lt;/strong>: el tenant pide &lt;code>model: &amp;quot;gpt-4o&amp;quot;&lt;/code>; el gateway decide si va a OpenAI, a Azure OpenAI, a tu vLLM con Qwen3 32B (fallback más barato), según política.&lt;/li>
&lt;li>&lt;strong>Rate limiting&lt;/strong>: RPS por tenant, TPM (tokens por minuto), concurrency limits.&lt;/li>
&lt;li>&lt;strong>Caching de respuestas idénticas&lt;/strong>: 5-30% de las queries de RAG son repetidas; cachear ahorra latencia y coste.&lt;/li>
&lt;li>&lt;strong>OTel emission&lt;/strong>: cada llamada produce un span con &lt;code>gen_ai.*&lt;/code> semantic conventions y &lt;code>tenant_id&lt;/code> como atributo. Cubierto en &lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">post de Evals&lt;/a> y &lt;a href="https://blog.lo0.es/posts/mcp-observability-otel/">MCP observability&lt;/a>.&lt;/li>
&lt;li>&lt;strong>Failover&lt;/strong>: si vLLM se cae, el gateway redirige a OpenAI API. Si OpenAI rate-limita, el gateway tira a Anthropic. Política configurable.&lt;/li>
&lt;/ul>
&lt;h3 id="ejemplo-de-configuración-litellm-multi-tenant">Ejemplo de configuración LiteLLM multi-tenant&lt;/h3>
&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="c"># litellm-config.yaml — ejemplo simplificado&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_list&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">model_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">llama-3-70b&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">litellm_params&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">model&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">openai/llama-3-70b&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">api_base&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">http://vllm-llama3-70b.inference/v1&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">api_key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">os.environ/VLLM_API_KEY&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="nt">model_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">qwen3-32b&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">litellm_params&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">model&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">openai/qwen3-32b&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">api_base&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">http://vllm-qwen3-32b.inference/v1&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">api_key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">os.environ/VLLM_API_KEY&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="nt">model_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">gpt-4o&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">litellm_params&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">model&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">openai/gpt-4o&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">api_key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">os.environ/OPENAI_API_KEY&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="nt">router_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="nt">routing_strategy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">usage-based-routing-v2&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">fallbacks&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-3-70b&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">qwen3-32b, gpt-4o] &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># si vLLM cae, fallback al externo&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="nt">general_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="nt">master_key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">os.environ/LITELLM_MASTER_KEY&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">database_url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">os.environ/DATABASE_URL &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># Postgres para budgets/keys&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"># Hierarchy: Organizations → Teams → Users → API Keys&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"># Se crean vía API, no en YAML estático&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Crear un team con presupuesto:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -X POST http://litellm/team/new &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -H &lt;span class="s2">&amp;#34;Authorization: Bearer &lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">LITELLM_MASTER_KEY&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -d &lt;span class="s1">&amp;#39;{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;team_alias&amp;#34;: &amp;#34;soporte-chat&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;max_budget&amp;#34;: 500, # 500 USD/mes
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;budget_duration&amp;#34;: &amp;#34;30d&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;tpm_limit&amp;#34;: 100000, # 100K tokens/min
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;rpm_limit&amp;#34;: 1000, # 1000 requests/min
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;models&amp;#34;: [&amp;#34;llama-3-70b&amp;#34;, &amp;#34;qwen3-32b&amp;#34;] # acceso a estos
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> }&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Y la API key del team:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -X POST http://litellm/key/generate &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -H &lt;span class="s2">&amp;#34;Authorization: Bearer &lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">LITELLM_MASTER_KEY&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -d &lt;span class="s1">&amp;#39;{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;team_id&amp;#34;: &amp;#34;&amp;lt;team-id&amp;gt;&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;duration&amp;#34;: &amp;#34;30d&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;metadata&amp;#34;: {&amp;#34;environment&amp;#34;: &amp;#34;production&amp;#34;, &amp;#34;app&amp;#34;: &amp;#34;support-bot&amp;#34;}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> }&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Esa API key es lo que el tenant usa. Cada request que pase con ella consumirá del budget del team. Cuando se agote, LiteLLM devuelve &lt;strong>HTTP 429&lt;/strong> con descripción.&lt;/p>
&lt;h2 id="capa-2--policy--quota-plane-qué-puede-hacer-cada-tenant">Capa 2 — Policy &amp;amp; Quota Plane: qué puede hacer cada tenant&lt;/h2>
&lt;p>El gateway es donde se enforza. La política es &lt;strong>lo que se enforza&lt;/strong>. Cinco ejes de política multi-tenant:&lt;/p>
&lt;h3 id="quotas-técnicas">Quotas técnicas&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>TPM&lt;/strong> (tokens por minuto): el límite duro de consumo. Para un Llama 3 70B en TP=5, ~3000 tokens/s salidos sostenidos = 180K TPM agregados. Si tienes 10 tenants, asignar 18K cada uno como techo.&lt;/li>
&lt;li>&lt;strong>RPS / RPM&lt;/strong>: control de carga, no de consumo. Una sesión de 4K tokens cuenta como una request; un batch de 100 mini-completions también. Útil contra abuso.&lt;/li>
&lt;li>&lt;strong>Concurrency&lt;/strong>: cuántas requests simultáneas activas por tenant. Importante para SLA de latencia: 100 RPS con concurrency=50 se traducen en 2 segundos por request.&lt;/li>
&lt;/ul>
&lt;h3 id="budgets-económicos">Budgets económicos&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Mensual por tenant&lt;/strong>: hard cap en USD.&lt;/li>
&lt;li>&lt;strong>Diario y por hora&lt;/strong>: soft caps para evitar runaway en un solo día.&lt;/li>
&lt;li>&lt;strong>Por proyecto / API key&lt;/strong>: granularidad fina dentro de un mismo tenant.&lt;/li>
&lt;/ul>
&lt;p>LiteLLM tiene un campo &lt;code>max_budget&lt;/code> en cada nivel de la jerarquía (organization, team, user, api key). Los presupuestos se heredan/restringen hacia abajo.&lt;/p>
&lt;h3 id="whitelist-y-blacklist-de-modelos">Whitelist y blacklist de modelos&lt;/h3>
&lt;p>Tenants con cargas críticas → solo modelos estables (&lt;code>llama-3-70b&lt;/code>, &lt;code>gpt-4o&lt;/code>). Tenants de investigación → acceso también a modelos experimentales.&lt;/p>
&lt;h3 id="priority-classes">Priority classes&lt;/h3>
&lt;p>No todos los requests son iguales. Tres clases típicas:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Guaranteed&lt;/strong>: cargas con SLA, latencia respetada incluso bajo presión.&lt;/li>
&lt;li>&lt;strong>Best-effort&lt;/strong>: cargas normales sin SLA estricto.&lt;/li>
&lt;li>&lt;strong>Spot&lt;/strong>: batches que pueden esperar, evictable si llega un guaranteed.&lt;/li>
&lt;/ul>
&lt;p>El &lt;a href="https://arxiv.org/abs/2603.00356">paper Token Management in Multi-Tenant AI Inference Platforms&lt;/a> (2026) formaliza esto con un &lt;strong>modelo de token pools por priority class&lt;/strong> que se ha empezado a adoptar en producción. Mantiene &lt;strong>P99 latency garantizada&lt;/strong> para guaranteed workloads incluso bajo overload, throttling selectivo sobre spot.&lt;/p>
&lt;h3 id="admission-control">Admission control&lt;/h3>
&lt;p>Antes de aceptar una request: ¿hay capacidad? Si no, devolver 429 inmediatamente en vez de encolar y degradar a todos. Es la disciplina operacional más infravalorada — un cluster con admission control bien hecho tiene &lt;strong>latencia predecible&lt;/strong>; sin él, &lt;strong>catastrophic degradation&lt;/strong> cuando llega el pico.&lt;/p>
&lt;h3 id="el-patrón-típico-en-2026">El patrón típico en 2026&lt;/h3>
&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="c"># Política conceptual para un tenant &amp;#34;soporte-chat&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">tenant&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">soporte-chat&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">quotas&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">tpm&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">50000&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">rpm&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">500&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">max_concurrency&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">30&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">budget&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">monthly_usd&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">800&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">alert_thresholds&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="m">0.5&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0.8&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0.95&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># avisa cuando llegues&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">models_allowed&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="l">llama-3-70b&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="l">qwen3-32b&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">priority&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">guaranteed&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">fallback_on_overload&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="l">qwen3-32b &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># si guaranteed se llena, fallback&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="l">gpt-4o-mini &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># último recurso, modelo externo&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="capa-3--isolation-plane-aislar-las-cargas-físicamente">Capa 3 — Isolation Plane: aislar las cargas físicamente&lt;/h2>
&lt;p>Esta es la capa más densa técnicamente. Tienes un nodo con varias GPUs H100 SXM interconectadas por NVLink. ¿Cómo las particionas entre tenants?&lt;/p>
&lt;h3 id="tres-mecanismos-nvidia-para-compartir-gpu">Tres mecanismos NVIDIA para compartir GPU&lt;/h3>
&lt;p>&lt;strong>MIG (Multi-Instance GPU)&lt;/strong> es el aislamiento más fuerte. Particiona la GPU en hasta &lt;strong>7 instancias&lt;/strong> con &lt;strong>memoria HBM separada físicamente&lt;/strong> y &lt;strong>compute units (SMs) dedicados&lt;/strong>. Los tenants en MIG diferentes no pueden tocarse: una carga no consume memoria que otra necesita, una no degrada el throughput de otra. &lt;strong>Aislamiento hardware&lt;/strong>. Disponible en A100, H100, B100, B200.&lt;/p>
&lt;p>&lt;strong>MPS (Multi-Process Service)&lt;/strong> es soft. Múltiples procesos comparten la GPU concurrentemente, NVIDIA reparte SMs según uso. Buen rendimiento si todos los procesos son tuyos y confías en ellos. Peor para multi-tenant entre clientes que no se conocen porque un proceso ruidoso puede degradar a los otros.&lt;/p>
&lt;p>&lt;strong>Time-slicing&lt;/strong> es lo más simple: la GPU se asigna alternadamente, slot por slot, a procesos distintos. Latencia mucho peor (waits entre slots); no se recomienda para cargas de producción con SLA.&lt;/p>
&lt;h3 id="la-elección-para-multi-tenant-2026">La elección para multi-tenant 2026&lt;/h3>
&lt;p>Según el survey de adopción enterprise: &lt;strong>80% usa MIG para multi-tenant no confiable&lt;/strong> (clientes distintos que no se conocen) y &lt;strong>MPS para entornos confiados&lt;/strong> (procesos del mismo equipo) donde quieres maximizar throughput. Time-slicing solo se usa en dev/staging para que cada developer toque GPU sin coste de exclusividad.&lt;/p>
&lt;p>Limitación importante de MIG: &lt;strong>aísla compute y memoria HBM&lt;/strong>, pero &lt;strong>el camino PCIe sigue siendo compartido&lt;/strong>. Para cargas PCIe-bound (mucho tráfico host↔device), tenants en MIG distintos pueden seguir afectándose. Para inferencia LLM, el path principal es HBM, así que esto rara vez es problema. Pero conviene saberlo.&lt;/p>
&lt;h3 id="las-particiones-mig-en-h100">Las particiones MIG en H100&lt;/h3>
&lt;p>Una H100 (80GB HBM3) se puede particionar en perfiles fijos:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Perfil&lt;/th>
&lt;th>SM&lt;/th>
&lt;th>Memoria&lt;/th>
&lt;th>Instancias máx por GPU&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1g.10gb&lt;/td>
&lt;td>14&lt;/td>
&lt;td>10 GB&lt;/td>
&lt;td>7&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1g.20gb&lt;/td>
&lt;td>14&lt;/td>
&lt;td>20 GB&lt;/td>
&lt;td>4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2g.20gb&lt;/td>
&lt;td>28&lt;/td>
&lt;td>20 GB&lt;/td>
&lt;td>3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3g.40gb&lt;/td>
&lt;td>42&lt;/td>
&lt;td>40 GB&lt;/td>
&lt;td>2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>7g.80gb&lt;/td>
&lt;td>98&lt;/td>
&lt;td>80 GB&lt;/td>
&lt;td>1 (toda la GPU)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Para un cluster mid-scale con NVLink, &lt;strong>MIG tiene un problema fundamental&lt;/strong>: cuando particionas con MIG, &lt;strong>se desactiva el NVLink entre GPUs&lt;/strong>. Una H100 en MIG &lt;strong>no&lt;/strong> participa en tensor parallel multi-GPU. Si vas a servir un modelo grande con tensor parallel (Llama 3 70B con TP=4 o TP=8, por ejemplo), esas GPUs deben estar enteras, sin MIG.&lt;/p>
&lt;p>Esto define la decisión arquitectónica. Hay dos enfoques principales:&lt;/p>
&lt;h3 id="enfoque-a--modelo-grande-compartido-con-quotas-en-gateway">Enfoque A — Modelo grande compartido con quotas en gateway&lt;/h3>
&lt;p>Todas las GPUs del nodo sirven &lt;strong>un único modelo grande con tensor parallel&lt;/strong> que abarca el nodo entero. Todos los tenants comparten esa instancia. El aislamiento se hace en la capa de gateway (quotas, rate limiting) y la capa de policy (priority classes). El kernel del cluster es una sola instancia vLLM enorme con &lt;code>--max-num-seqs=128&lt;/code> o similar; vLLM internamente reparte tiempo de GPU entre las requests activas con continuous batching.&lt;/p>
&lt;p>&lt;strong>Ventajas&lt;/strong>: aprovechas todas las GPUs al máximo, NVLink activo, mejor utilización del KV cache.
&lt;strong>Desventajas&lt;/strong>: aislamiento blando — un tenant que satura no degrada a otros directamente (vLLM bachea), pero sí compite por slots del batch. Necesitas priority classes serias.&lt;/p>
&lt;h3 id="enfoque-b--dedicar-gpus-por-modelo--tenant">Enfoque B — Dedicar GPUs por modelo / tenant&lt;/h3>
&lt;p>Divides las GPUs en pools dedicados a modelos distintos. Ejemplos en un nodo de 8 GPUs:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>4 GPUs&lt;/strong>: modelo grande de 70B con TP=4.&lt;/li>
&lt;li>&lt;strong>2 GPUs&lt;/strong>: modelo mediano de 32B replicado (2 instancias independientes) para tenants con SLA estricto.&lt;/li>
&lt;li>&lt;strong>2 GPUs&lt;/strong>: cargas misceláneas (modelos más pequeños, experimentación).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Ventajas&lt;/strong>: aislamiento físico entre modelos / tenants críticos.
&lt;strong>Desventajas&lt;/strong>: peor utilización agregada; algunas GPUs idle mientras otras saturan.&lt;/p>
&lt;h3 id="enfoque-c-avanzado--mig-en-algunas-gpus--dedicar-el-resto">Enfoque C (avanzado) — MIG en algunas GPUs + dedicar el resto&lt;/h3>
&lt;p>Si tienes cargas pequeñas (modelos de 4B, 7B), puedes hacer MIG en 1-2 GPUs para servirlas y dedicar las restantes a tensor parallel del modelo grande. Combina aislamiento fuerte para cargas chicas con aprovechamiento del NVLink para el modelo grande.&lt;/p>
&lt;h3 id="la-elección-operativa-empieza-por-a-sube-a-c-si-hace-falta">La elección operativa: empieza por A, sube a C si hace falta&lt;/h3>
&lt;p>En la mayoría de despliegues, el Enfoque A (modelo grande compartido + quotas) es el punto de partida correcto. La utilización es mejor, la operación es más simple, y los aislamientos blandos del gateway funcionan para cargas razonables.&lt;/p>
&lt;p>Cuando hay un tenant con SLA estricto que no tolera competir con otros, mueves a Enfoque B para ese tenant en particular (dedicar GPUs a una instancia del modelo solo para él), manteniendo el resto del cluster compartido.&lt;/p>
&lt;p>Enfoque C es para cuando tienes 10+ tenants con perfiles muy heterogéneos.&lt;/p>
&lt;h3 id="aislamiento-a-nivel-kubernetes">Aislamiento a nivel Kubernetes&lt;/h3>
&lt;p>Independiente del aislamiento GPU, en K8s se aplica aislamiento de pod:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Namespaces por tenant&lt;/strong>: &lt;code>tenant-soporte&lt;/code>, &lt;code>tenant-legal&lt;/code>, etc.&lt;/li>
&lt;li>&lt;strong>ResourceQuotas y LimitRanges&lt;/strong>: límites de CPU/memoria por namespace.&lt;/li>
&lt;li>&lt;strong>NetworkPolicies&lt;/strong>: tenant A no puede hablar con namespaces de tenant B.&lt;/li>
&lt;li>&lt;strong>PriorityClasses K8s&lt;/strong>: clases con valor numérico que define preemption order si llega un pod más crítico.&lt;/li>
&lt;li>&lt;strong>PodDisruptionBudgets&lt;/strong>: cuántos pods de cada deployment pueden caer simultáneamente.&lt;/li>
&lt;/ul>
&lt;h2 id="capa-4--observability-plane-ver-lo-que-pasa-por-tenant">Capa 4 — Observability Plane: ver lo que pasa por tenant&lt;/h2>
&lt;p>La cuarta capa: &lt;strong>observabilidad con dimensión tenant&lt;/strong>. Sin esto, no puedes hacer cost attribution, no puedes debugear incidentes de un solo tenant, no puedes mostrar dashboards a stakeholders.&lt;/p>
&lt;h3 id="las-cuatro-propiedades-obligatorias">Las cuatro propiedades obligatorias&lt;/h3>
&lt;p>&lt;strong>1. tenant_id en todos los spans&lt;/strong>. El AI gateway resuelve la API key y atribuye un &lt;code>tenant_id&lt;/code>. Ese ID &lt;strong>se propaga&lt;/strong> vía &lt;code>params._meta&lt;/code> o headers OTel a todos los componentes downstream (vLLM, retrieval, MCP servers, tools). Cualquier span en cualquier sistema lleva ese label. Es lo que permite reconstruir traces tenant-específicos.&lt;/p>
&lt;p>&lt;strong>2. Métricas labeled por tenant&lt;/strong>. &lt;code>gen_ai.usage.input_tokens{tenant=&amp;quot;soporte-chat&amp;quot;}&lt;/code> o equivalentes. Prometheus, Grafana, agrupable por tenant.&lt;/p>
&lt;p>&lt;strong>3. Cost attribution real&lt;/strong>. La suma de tokens × cost/token por tenant da el coste. Para vLLM self-hosted, el coste es por hora de GPU + parte proporcional de tokens (puedes calcular un cost-per-1k-tokens equivalente).&lt;/p>
&lt;p>&lt;strong>4. Audit log inmutable&lt;/strong>. Cada API key usada, cada modelo invocado, cada cambio de quota, cada budget exceeded. Para compliance.&lt;/p>
&lt;h3 id="showback-vs-chargeback">Showback vs chargeback&lt;/h3>
&lt;p>Distinción importante de FinOps que ha ganado claridad en 2026:&lt;/p>
&lt;p>&lt;strong>Showback&lt;/strong>: visibilidad sin consecuencia. &amp;ldquo;Equipo de soporte, has consumido $623 este mes en LLM&amp;rdquo;. Información, no factura. Permite detectar abusos sin penalizar antes de que el equipo entienda.&lt;/p>
&lt;p>&lt;strong>Chargeback&lt;/strong>: el coste se imputa al presupuesto del equipo. Cuando se acaba, se acaba. Cambia comportamiento.&lt;/p>
&lt;p>La práctica que funciona: &lt;strong>6-18 meses en showback&lt;/strong> mientras se calibran tags, se identifican misattributions, se forma a los equipos. &lt;strong>Después chargeback&lt;/strong> cuando los números son creíbles. Lanzar chargeback el día 1 cuando los costs aún están sucios crea pelea política inmediata; lanzar showback prepara terreno para que el chargeback aterrice ordenadamente.&lt;/p>
&lt;p>&lt;a href="https://spendark.com/blog/kubernetes-cost-allocation/">Solo 14% de organizaciones tienen chargeback activo&lt;/a> según un survey reciente, lo que indica que esto sigue siendo mayoritariamente showback en producción real.&lt;/p>
&lt;h3 id="herramientas">Herramientas&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://www.kubecost.com/">Kubecost&lt;/a>&lt;/strong>: cost allocation por namespace, deployment, pod en Kubernetes. Para el coste de la GPU compartida, allocate proporcionalmente a tokens consumidos por tenant.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.finout.io/">Finout&lt;/a>&lt;/strong>: FinOps platform que combina cloud bills + LLM API costs en una vista unificada con tagging virtual.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://langfuse.com/">Langfuse&lt;/a>&lt;/strong>: ya cubierto. Cost tracking por trace, agrupable por usuario o session metadata.&lt;/li>
&lt;li>&lt;strong>LiteLLM tracking nativo&lt;/strong>: el master DB de LiteLLM mantiene running spend por team, user, API key, accesible vía API o UI.&lt;/li>
&lt;/ul>
&lt;h3 id="dashboard-mínimo-multi-tenant">Dashboard mínimo multi-tenant&lt;/h3>
&lt;p>Cualquier plataforma debería tener:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Resumen por tenant&lt;/strong>: spend mensual, RPS actual, TPM consumido, % budget gastado, sesiones activas.&lt;/li>
&lt;li>&lt;strong>Top usuarios&lt;/strong> dentro de cada tenant (para detección de abuso interno).&lt;/li>
&lt;li>&lt;strong>Latencia p95 por tenant&lt;/strong>: SLA tracking.&lt;/li>
&lt;li>&lt;strong>Errores 429 / 503&lt;/strong>: cuántas requests están siendo rate-limitadas o rechazadas por overload.&lt;/li>
&lt;li>&lt;strong>Cost trend&lt;/strong>: trayectoria mensual con proyección.&lt;/li>
&lt;li>&lt;strong>Drift por tenant&lt;/strong> (de la serie post-tracing): si un tenant empieza a tener peores resultados, alerta.&lt;/li>
&lt;/ol>
&lt;h2 id="dimensionado-en-clusters-gpu-mid-scale-decisiones-concretas">Dimensionado en clusters GPU mid-scale: decisiones concretas&lt;/h2>
&lt;p>Bajemos a hardware. Tomamos como referencia un nodo con &lt;strong>N H100 SXM (entre 4 y 8) con NVLink/NVSwitch&lt;/strong>, 80 GB HBM3 cada una. Eso da entre &lt;strong>320 GB y 640 GB de VRAM agregada&lt;/strong>. Conectividad inter-GPU 900 GB/s (NVLink 4) o 600 GB/s (NVLink 3) según generación. Ancho de banda HBM por GPU 3.35 TB/s.&lt;/p>
&lt;h3 id="decisiones-por-defecto">Decisiones por defecto&lt;/h3>
&lt;p>Empezar con &lt;strong>Enfoque A&lt;/strong>: todas las GPUs del nodo sirviendo &lt;strong>un único modelo grande de 70B en BF16 con tensor parallel = N&lt;/strong>. Capacidad real esperada (calculada para un nodo HGX estándar de 8 GPUs como ejemplo; escala aproximadamente lineal con N):&lt;/p>
&lt;ul>
&lt;li>VRAM modelo (70B BF16): ~140 GB (≈ 17.5 GB/GPU en TP=8).&lt;/li>
&lt;li>VRAM overhead vLLM + activations: ~10 GB/GPU.&lt;/li>
&lt;li>VRAM libre para KV cache: ~52 GB/GPU. En un nodo de 8 GPUs son &lt;strong>~416 GB agregados&lt;/strong>; en uno de 4 son ~210 GB.&lt;/li>
&lt;li>Con &lt;code>--kv-cache-dtype=fp8&lt;/code> y un modelo 70B GQA: ~320 KB/token.&lt;/li>
&lt;li>Capacidad agregada de cache (nodo de 8 GPUs): &lt;strong>~1.3M tokens&lt;/strong> repartibles entre sesiones simultáneas.&lt;/li>
&lt;/ul>
&lt;p>Esto se traduce en throughput y concurrencia (cifras orientativas para un nodo de 8 GPUs):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:right">Sesiones simultáneas&lt;/th>
&lt;th style="text-align:right">Contexto medio por sesión&lt;/th>
&lt;th style="text-align:right">Throughput agregado (tokens/s)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:right">32&lt;/td>
&lt;td style="text-align:right">16K&lt;/td>
&lt;td style="text-align:right">~5000&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">64&lt;/td>
&lt;td style="text-align:right">8K&lt;/td>
&lt;td style="text-align:right">~8000&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:right">128&lt;/td>
&lt;td style="text-align:right">4K&lt;/td>
&lt;td style="text-align:right">~12000&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Latencias típicas: &lt;strong>TTFT ~150ms&lt;/strong> a tráfico bajo, &lt;strong>TPOT ~15-20 ms/tok&lt;/strong>. Con concurrencia alta, TTFT sube hasta ~500ms si el queue está saturado.&lt;/p>
&lt;h3 id="esquema-de-tenants-ejemplo">Esquema de tenants ejemplo&lt;/h3>
&lt;p>Cluster con 4 tenants y un pool de research:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tenant&lt;/th>
&lt;th style="text-align:right">TPM cap&lt;/th>
&lt;th style="text-align:right">RPM cap&lt;/th>
&lt;th style="text-align:right">Concurrency&lt;/th>
&lt;th style="text-align:right">Budget&lt;/th>
&lt;th>Priority&lt;/th>
&lt;th>Modelos&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Soporte chat&lt;/td>
&lt;td style="text-align:right">80K&lt;/td>
&lt;td style="text-align:right">800&lt;/td>
&lt;td style="text-align:right">50&lt;/td>
&lt;td style="text-align:right">1500 USD/mes&lt;/td>
&lt;td>Guaranteed&lt;/td>
&lt;td>llama-3-70b, qwen3-32b&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Legal RAG&lt;/td>
&lt;td style="text-align:right">30K&lt;/td>
&lt;td style="text-align:right">200&lt;/td>
&lt;td style="text-align:right">15&lt;/td>
&lt;td style="text-align:right">600 USD/mes&lt;/td>
&lt;td>Guaranteed&lt;/td>
&lt;td>llama-3-70b&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Agente code&lt;/td>
&lt;td style="text-align:right">50K&lt;/td>
&lt;td style="text-align:right">300&lt;/td>
&lt;td style="text-align:right">25&lt;/td>
&lt;td style="text-align:right">1200 USD/mes&lt;/td>
&lt;td>Best-effort&lt;/td>
&lt;td>llama-3-70b, qwen-coder&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Data extr. batch&lt;/td>
&lt;td style="text-align:right">40K&lt;/td>
&lt;td style="text-align:right">1000&lt;/td>
&lt;td style="text-align:right">40&lt;/td>
&lt;td style="text-align:right">400 USD/mes&lt;/td>
&lt;td>Spot&lt;/td>
&lt;td>llama-3-70b, qwen3-32b&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Research / notebooks&lt;/td>
&lt;td style="text-align:right">10K&lt;/td>
&lt;td style="text-align:right">100&lt;/td>
&lt;td style="text-align:right">5&lt;/td>
&lt;td style="text-align:right">200 USD/mes&lt;/td>
&lt;td>Spot&lt;/td>
&lt;td>todos&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Suma TPM: 210K. Capacidad agregada del cluster: ~180K TPM sostenidos. &lt;strong>Está overcommit del ~15%&lt;/strong>, asumiendo que no todos los tenants llegan al techo simultáneamente. Es lo normal y deseable; si todos lo hacen al mismo tiempo, las priority classes degradan ordenadamente.&lt;/p>
&lt;h3 id="cuándo-añadir-hardware">Cuándo añadir hardware&lt;/h3>
&lt;p>Señales que indican que el nodo se ha quedado pequeño:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>TTFT p95 sostenida &amp;gt; 500 ms&lt;/strong> durante horas de pico → el queue se está acumulando.&lt;/li>
&lt;li>&lt;strong>&lt;code>vllm:num_requests_waiting&lt;/code> constantemente &amp;gt; 20&lt;/strong> → admission control empezando a rechazar.&lt;/li>
&lt;li>&lt;strong>Utilización GPU sostenida &amp;gt; 80% en horas críticas&lt;/strong> sin caer abajo en horas valle → no hay margen.&lt;/li>
&lt;li>&lt;strong>Tasa de 429 sobre los tenants guaranteed &amp;gt; 1%&lt;/strong> → la plataforma rompe SLA en producción.&lt;/li>
&lt;/ul>
&lt;p>Cuando varios de estos se cumplan, el siguiente paso natural es añadir otro nodo HGX con NVLink interno y montar &lt;strong>una segunda instancia vLLM&lt;/strong> del mismo modelo. El gateway hace load balancing entre las dos instancias. Throughput agregado se duplica; latencia se mantiene.&lt;/p>
&lt;h2 id="trampas-operativas-comunes">Trampas operativas comunes&lt;/h2>
&lt;h3 id="gateway-sin-auth-backdoor-al-cluster">Gateway sin auth: backdoor al cluster&lt;/h3>
&lt;p>Tu vLLM está en un Service ClusterIP, la app principal habla con él. Algún tenant directo descubre el endpoint y le pega directamente sin pasar por el gateway. Quotas y costs se evaden silenciosamente. &lt;strong>NetworkPolicy estricta&lt;/strong>: solo el gateway puede hablar con los Service vLLM; el resto del cluster no.&lt;/p>
&lt;h3 id="mig-y-nvlink-incompatibles">MIG y NVLink incompatibles&lt;/h3>
&lt;p>Activas MIG en una GPU pensando que tendrás aislamiento + multi-GPU; descubres que MIG desactiva NVLink. Cualquier modelo grande con TP queda inservible. &lt;strong>Decide MIG vs NVLink globalmente por cluster&lt;/strong>, no por GPU individual.&lt;/p>
&lt;h3 id="quotas-pegadas-al-techo-del-cluster">Quotas pegadas al techo del cluster&lt;/h3>
&lt;p>Sumas los TPM de todos los tenants y dan exactamente la capacidad del cluster. Cuando dos tenants pico simultáneamente, ambos esperan o uno rechaza. &lt;strong>Overcommit 10-20%&lt;/strong> es saludable (asume que no todos pican a la vez); más es peligroso.&lt;/p>
&lt;h3 id="sin-observabilidad-multi-tenant-desde-el-día-1">Sin observabilidad multi-tenant desde el día 1&lt;/h3>
&lt;p>Lanzas con quotas y aislamiento pero sin tenant_id en spans. A los 3 meses, tu CFO pregunta &amp;ldquo;¿cuánto cuesta el agente de soporte vs el de legal?&amp;rdquo; y no puedes responder. &lt;strong>OTel con tenant_id obligatorio desde la primera versión&lt;/strong>, aunque no haya dashboards aún; tener los datos vale más que tener dashboards perfectos sin datos.&lt;/p>
&lt;h3 id="showback-que-nunca-llega-a-chargeback">Showback que nunca llega a chargeback&lt;/h3>
&lt;p>Llevas 18 meses en showback, los equipos saben los números, nadie cambia comportamiento. Sin la presión del chargeback real, el incentivo se diluye. &lt;strong>Calendario explícito&lt;/strong> para la transición a chargeback, con dueño y deadline.&lt;/p>
&lt;h3 id="modelos-no-whitelisteados-consumiendo-presupuesto">Modelos no whitelisteados consumiendo presupuesto&lt;/h3>
&lt;p>Un equipo descubre que LiteLLM tiene &lt;code>gpt-4o&lt;/code> configurado. Lo usa sin permiso. El budget se quema en API externa cuando la idea era usar el self-hosted barato. &lt;strong>Whitelist explícita por team de modelos accesibles&lt;/strong>.&lt;/p>
&lt;h3 id="priority-classes-mal-calibradas">Priority classes mal calibradas&lt;/h3>
&lt;p>Todo el mundo se declara &amp;ldquo;guaranteed&amp;rdquo;. En el primer pico, no queda nada por degradar y todo sufre. &lt;strong>Priority classes solo para casos críticos&lt;/strong> con justificación. La mayoría debería ser best-effort.&lt;/p>
&lt;h3 id="sin-failover-desde-el-gateway">Sin failover desde el gateway&lt;/h3>
&lt;p>Tu vLLM se cae. El gateway no tiene fallback configurado y devuelve 503 a todos los tenants. &lt;strong>Fallback configurado&lt;/strong> a otro modelo, idealmente externo (OpenAI) para cargas guaranteed, aunque pague más por hora — la disponibilidad vale más que el coste por hora.&lt;/p>
&lt;h2 id="roadmap-operativo-de-arranque">Roadmap operativo de arranque&lt;/h2>
&lt;p>Si parte de cero con un nodo GPU vacío, el orden mínimo es el siguiente. Cada hito es un día de trabajo con margen, no apretado:&lt;/p>
&lt;p>&lt;strong>Día 1-2 — Infra base K8s&lt;/strong>. NVIDIA GPU Operator + nvidia-device-plugin + dcgm-exporter + NetworkPolicies cluster-default. Validación: un pod básico con &lt;code>nvidia.com/gpu: 1&lt;/code> se schedulea.&lt;/p>
&lt;p>&lt;strong>Día 3 — vLLM con un modelo grande y tensor parallel del nodo entero&lt;/strong>. Helm chart de vLLM Production Stack (o vLLM bare manifests). Pesos del modelo en PVC compartido (CephFS o NFS). Validación: una petición &lt;code>curl&lt;/code> contra el Service interno responde.&lt;/p>
&lt;p>&lt;strong>Día 4 — AI Gateway: LiteLLM&lt;/strong>. Helm chart, Postgres para budgets, master key, primer model_list pointing a vLLM. Validación: una petición OpenAI-compatible vía LiteLLM responde con el mismo contenido que el vLLM directo.&lt;/p>
&lt;p>&lt;strong>Día 5 — Multi-tenancy básica&lt;/strong>. Crear teams, API keys, budget, model whitelist. Probar con dos teams. Validación: el segundo team usando el modelo que no tiene whitelisteado recibe 403.&lt;/p>
&lt;p>&lt;strong>Día 6 — Observabilidad mínima&lt;/strong>. Prometheus + Grafana scraping vLLM y LiteLLM. Dashboard con TTFT, TPOT, throughput, num_requests_waiting, budget_consumed_per_team. Validación: visible en Grafana con datos reales.&lt;/p>
&lt;p>&lt;strong>Día 7-8 — Cliente piloto&lt;/strong>. Un tenant real (idealmente uno interno controlado) empieza a usar. Mide latencias reales, descubre los primeros incidentes operativos.&lt;/p>
&lt;p>&lt;strong>Día 9-10 — Tuning&lt;/strong>. Ajustar &lt;code>--max-num-seqs&lt;/code>, &lt;code>--gpu-memory-utilization&lt;/code>, priority classes, quotas según lo aprendido del piloto.&lt;/p>
&lt;p>&lt;strong>Día 11-14 — Onboarding del segundo tenant + iteración&lt;/strong>. Repeat. Cada nuevo tenant onboarded revela nuevos casos.&lt;/p>
&lt;p>A las dos semanas tienes una plataforma operacional con dos tenants reales y datos para decidir si está lista para más. La línea de avance de aquí en adelante es &lt;strong>horizontal&lt;/strong> (más tenants) hasta saturar; a partir de ahí, &lt;strong>vertical&lt;/strong> (más hardware).&lt;/p>
&lt;h2 id="lo-que-no-hemos-cubierto-próximos-posts">Lo que no hemos cubierto (próximos posts)&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Fine-tuning continuo en producción&lt;/strong> (post 6, decidido): LoRA/QLoRA/DPO, dataset curation, eval gates, A/B versioning con tráfico real entre versiones del modelo.&lt;/li>
&lt;li>&lt;strong>Constitutional AI y alignment runtime&lt;/strong>: opción que sigue en la mesa.&lt;/li>
&lt;li>&lt;strong>Edge LLMs&lt;/strong>: cuando un cluster H100 es demasiado caro para una carga concreta, modelos distillados corriendo en NPUs o GPUs consumer.&lt;/li>
&lt;li>&lt;strong>GPU networking deep dive&lt;/strong>: NCCL, InfiniBand, GPUDirect, RDMA. Para clusters multi-nodo con tensor parallel cross-host.&lt;/li>
&lt;/ul>
&lt;h2 id="referencias">Referencias&lt;/h2>
&lt;p>Multi-tenancy y aislamiento GPU:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.linuxoperatingsystem.net/multitenant-gpu-infrastructure-4-powerful-design-rules/">Multitenant GPU Infrastructure: 4 Powerful Design Rules&lt;/a> — survey de patrones enterprise.&lt;/li>
&lt;li>&lt;a href="https://www.spheron.network/blog/run-multiple-llms-one-gpu-mig-time-slicing-guide/">Run Multiple LLMs on One GPU: MIG, Time-Slicing, and MPS Guide (Spheron)&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://sagar-parmar.medium.com/a-practical-guide-to-gpu-partitioning-with-mig-on-on-prem-servers-and-kubernetes-797ccea7e1c7">A Practical Guide to GPU Partitioning with MIG (Medium)&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://www.suse.com/c/kubecon-eu-2026-nvidia-mig-suse-virtualization/">GPU Partitioning for AI Workloads: NVIDIA MIG with SUSE Virtualization (KubeCon EU 2026)&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://arxiv.org/abs/2508.20274">Predictable LLM Serving on GPU Clusters (arxiv 2508.20274)&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://arxiv.org/abs/2603.00356">Token Management in Multi-Tenant AI Inference Platforms (arxiv 2603.00356)&lt;/a> — paper de priority + admission control.&lt;/li>
&lt;/ul>
&lt;p>AI Gateways:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://docs.litellm.ai/docs/proxy/multi_tenant_architecture">LiteLLM — Multi-Tenant Architecture&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://docs.litellm.ai/docs/proxy/users">LiteLLM — Budgets and Rate Limits&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://portkey.ai/">Portkey AI Gateway&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://konghq.com/blog/enterprise/llm-cost-management-ai-showback-and-chargeback">Kong AI Gateway — LLM Cost Management&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://www.spheron.network/blog/ai-gateway-litellm-portkey-kong-gpu-cloud/">AI Gateway Setup 2026: LiteLLM, Portkey, Kong (Spheron)&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://techsy.io/en/blog/best-llm-gateway-tools">Stop Juggling LLM APIs: 8 Gateways Ranked 2026 (TECHSY)&lt;/a>.&lt;/li>
&lt;/ul>
&lt;p>FinOps multi-tenant:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.digiusher.com/blog/the-death-of-cost-allocation-why-chargeback-models-are-failing-in-the-kubernetes-and-ai-era/">The Death of Chargeback in the Kubernetes and AI Era (DigiUsher)&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://medium.com/@nicholasthoni/how-to-actually-track-kubernetes-costs-in-2026-a-practical-guide-to-showback-chargeback-and-the-6a4c23f9cf51">How to Actually Track Kubernetes Costs in 2026 (Medium)&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://konghq.com/blog/enterprise/llm-cost-management-ai-showback-and-chargeback">LLM Cost Management: AI Showback and Chargeback (Kong)&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://www.kubecost.com/">Kubecost — cost allocation&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://www.finout.io/">Finout — FinOps + AI costs&lt;/a>.&lt;/li>
&lt;/ul>
&lt;p>Cross-references:&lt;/p>
&lt;ul>
&lt;li>Posts previos serie 4: &lt;a href="https://blog.lo0.es/posts/mlops-llms-panorama-2026/">Panorama MLOps LLMs&lt;/a>, &lt;a href="https://blog.lo0.es/posts/rag-kafka-datalake-arquitectura/">RAG sobre Kafka&lt;/a>, &lt;a href="https://blog.lo0.es/posts/pipeline-llmops-seis-etapas/">Pipeline de 6 etapas&lt;/a>, &lt;a href="https://blog.lo0.es/posts/postgresql-qdrant-ingestion-microservicios/">PostgreSQL + Qdrant&lt;/a>.&lt;/li>
&lt;li>Posts relevantes de la serie inferencia: &lt;a href="https://blog.lo0.es/posts/vllm-kubernetes/">vLLM en Kubernetes&lt;/a> — el escenario de nodo HGX multi-GPU que aquí desarrollamos. &lt;a href="https://blog.lo0.es/posts/operators-llm-kubernetes/">Operators LLM K8s&lt;/a> — vLLM Production Stack y OME que el gateway puede dirigir.&lt;/li>
&lt;li>Observabilidad: &lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">Evals&lt;/a>, &lt;a href="https://blog.lo0.es/posts/mcp-observability-otel/">MCP observability&lt;/a>, &lt;a href="https://blog.lo0.es/posts/ebpf-on-device-inference-drift/">eBPF + drift&lt;/a>.&lt;/li>
&lt;/ul></description></item></channel></rss>