<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Nvidia on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/nvidia/</link><description>Recent content in Nvidia on lo0 — Blog Técnico</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Tue, 02 Jun 2026 04:30:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/tags/nvidia/index.xml" rel="self" type="application/rss+xml"/><item><title>Entornos mixtos NVIDIA + Intel para inferencia LLM: del cluster H100 central al NUC en la sucursal</title><link>https://blog.lo0.es/posts/entornos-mixtos-nvidia-intel-servidores-nucs/</link><pubDate>Tue, 02 Jun 2026 04:30:00 +0200</pubDate><guid>https://blog.lo0.es/posts/entornos-mixtos-nvidia-intel-servidores-nucs/</guid><description>&lt;blockquote>
&lt;p>Este post complementa los de &lt;a href="https://blog.lo0.es/posts/capacity-planning-inferencia-llm-on-premise/">Capacity planning para inferencia LLM on-premise&lt;/a> (que asumía cluster NVIDIA puro), &lt;a href="https://blog.lo0.es/posts/siete-capas-stack-inferencia-llm-on-premise/">Siete capas del stack&lt;/a> (que tampoco entraba en heterogeneidad de hardware) y &lt;a href="https://blog.lo0.es/posts/router-inferencia-llm-gateway-l7/">El router de inferencia LLM&lt;/a> (donde el routing por capability cobra todo su sentido cuando hay hardware mixto). Es la pieza que faltaba para hablar de &amp;ldquo;soberanía de hardware&amp;rdquo; sin reducirla a &amp;ldquo;qué fabricante elegir&amp;rdquo;.&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>Un cluster productivo de inferencia LLM en 2026 puede dejar de ser monolítico NVIDIA si acepta heterogeneidad como decisión arquitectónica. La motivación no es teoría sino &lt;strong>tres ventajas operativas medibles&lt;/strong>. (1) &lt;strong>Coste&lt;/strong>: un Intel Xeon 6 con AMX (Advanced Matrix Extensions) entrega 7B INT4 a ~80 tok/s sirviendo embeddings y reranker a una fracción del coste de dedicar una H100 a esa tarea; el &lt;a href="https://blog.lo0.es/posts/capacity-planning-inferencia-llm-on-premise/">capacity planning&lt;/a> cierra mejor con Intel CPU manejando lo barato e NVIDIA H100 el LLM grande. (2) &lt;strong>Soberanía y diversificación de cadena de suministro&lt;/strong>: NVIDIA tiene ~94 % del mercado de AI accelerators (noviembre 2025), single-vendor dependency con todos sus riesgos; Intel fabrica en Europa (Leixlip operativa, Magdeburg planeada) frente a NVIDIA design-only con foundry TSMC, lo que para una organización española/europea con exigencia ENS / NIS2 / EU AI Act es un argumento de hedge real. (3) &lt;strong>Edge&lt;/strong>: un Intel NUC con CPU Lunar Lake (NPU 48 TOPS) o Panther Lake (NPU 50 TOPS + Xe3 120 TOPS = 180 TOPS plataforma) corre modelos 7B INT4 a velocidad usable, lo que abre el patrón &amp;ldquo;sucursal con inferencia local + DC central para casos complejos&amp;rdquo;. Hardware Intel relevante en junio 2026: &lt;strong>Intel Gaudi 3&lt;/strong> (128 GB HBM2e, 1835 TFLOPS BF16/FP8, 3.67 TB/s; competidor directo a H100 — Intel reclama +20 % en Llama 2 70B pero Signal65 publicó H200 9× sobre Gaudi 3 en Llama 3.1 405B, hay que citar ambos; Falcon Shores &lt;strong>cancelado&lt;/strong> enero 2025, Jaguar Shores 2026 como apuesta de reinicio, &lt;strong>Gaudi 4 confirmado que no existirá&lt;/strong>); &lt;strong>Intel Xeon 6 con AMX&lt;/strong> (hasta 288 cores E-core en Sierra Forest o 86 P-core en Granite Rapids, 1024 FLOPS BF16/ciclo/core con AMX, Intel reclama 2.7× tok/s vs EPYC 9965 en vLLM CPU backend); &lt;strong>Intel Arc Pro B60&lt;/strong> (Battlemage, 24 GB GDDR6, 456 GB/s, 197 TOPS INT8, lanzado septiembre 2025 — variante dual-GPU 48 GB y rack &amp;ldquo;Battlematrix&amp;rdquo; con 8× = 192 GB VRAM); &lt;strong>Intel NUC con NPU&lt;/strong> (Lunar Lake 48 TOPS, Arrow Lake similar, Panther Lake 50 TOPS CES 2026; realista para 7-13B INT4, no para los 30-70B que Intel afirma en su marketing). Software: &lt;strong>OpenVINO 2025.3&lt;/strong> con GenAI API y vLLM-OpenVINO; &lt;strong>IPEX-LLM&lt;/strong> con integraciones a llama.cpp, vLLM, HF, LangChain; &lt;strong>vLLM CPU backend&lt;/strong> con AMX; &lt;strong>llama.cpp SYCL&lt;/strong> (mejor que Vulkan en Arc). Cuatro patrones canónicos: embeddings + reranker en Intel al lado del LLM en NVIDIA; guardrails + PII redact en NUC near edge; speculative drafter en NUC cerca del usuario y target en H100; dev workstations NUC. Observabilidad unificada vía DCGM + habana-metric-exporter + intel-gpu-exporter + Intel PCM federados en Prometheus. Pitfalls: tokenizer mismatch entre engines, latencia round-trip edge↔central, FP8 Hopper ≠ INT8 AMX en calidad, sincronización de versiones. Aplicado a un cluster genérico: DC central 4×H100 SXM + sidecar Xeon 6 AMX + 6-12 NUCs Intel en sucursales. &lt;strong>Disclaimer crítico&lt;/strong>: a junio 2026 no hay casos públicos verificables de despliegue mixto NVIDIA + Intel en banca o gobierno europeo; el patrón es &lt;strong>arquitectura emergente&lt;/strong> y recomendable, no práctica establecida con histórico industrial.&lt;/p>
&lt;h2 id="estás-aquí-deploy-con-heterogeneidad-como-decisión">Estás aquí: DEPLOY (con heterogeneidad como decisión)&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 con hardware heterogéneo">
&lt;style>.box{stroke:#444;stroke-width:1.4;rx:6}.active{fill:#7ad88f;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(#mxm)}.cyc{stroke:#888;stroke-width:1.2;fill:none;stroke-dasharray:4 2;marker-end:url(#mxm)}&lt;/style>
&lt;defs>&lt;marker id="mxm" 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 · hardware heterogéneo NVIDIA + Intel como decisión arquitectónica&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 idle"/>&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-analogía-la-fábrica-con-varias-máquinas-distintas">La analogía: la fábrica con varias máquinas distintas&lt;/h2>
&lt;p>Una fábrica seria tiene &lt;strong>varias máquinas con propósitos distintos&lt;/strong>, no una sola máquina universal. Una prensa hidráulica de 200 toneladas para troquelado pesado; un torno de banco para piezas de revolución; una impresora 3D para prototipos rápidos; un robot de pick-and-place para SMD. Cada máquina hace lo que hace &lt;strong>mejor que las demás en su nicho&lt;/strong>, y el gerente de planta dimensiona el mix según el portfolio real de productos, no según moda. Comprar tres prensas hidráulicas porque &amp;ldquo;son las más impresionantes&amp;rdquo; cuando el 60 % del trabajo son piezas de revolución es derrochar capital — el torno es más barato, más rápido para su nicho y libera la prensa para lo que de verdad la necesita.&lt;/p>
&lt;p>Un cluster de inferencia LLM con NVIDIA H100 dedicada a hacer &lt;strong>embeddings de un corpus RAG&lt;/strong> está usando una prensa hidráulica para taladrar pernos. La H100 es magnífica para LLM 70B en BF16 con concurrencia 40+; para embeddings de un documento de 800 tokens en bge-m3, lo que necesitas es un Intel Xeon 6 con AMX a una fracción del coste y consumo eléctrico. Un cluster que quiera servir guardrails ligeros (Llama Guard 4 8B) en cada request, con presupuesto de 50 ms, tampoco necesita ese guardrail en una H100 — un Intel NUC con NPU 48 TOPS cubre el caso con margen.&lt;/p>
&lt;p>La fábrica heterogénea no es elegancia teórica: es &lt;strong>maximizar utilización útil del capital fijo&lt;/strong>. El cluster heterogéneo de inferencia LLM tampoco lo es.&lt;/p>
&lt;h2 id="tres-razones-operativas-para-la-heterogeneidad">Tres razones operativas para la heterogeneidad&lt;/h2>
&lt;h3 id="razón-1--coste">Razón 1 — coste&lt;/h3>
&lt;p>Una H100 SXM 80 GB en operación 24/7 consume ~700 W (medición real al wall ~697 W con vLLM Llama 3.1 405B batch=4) y representa entre 25 000 € y 35 000 € de hardware amortizado. Un Intel Xeon 6 con AMX (Granite Rapids 86 cores o Sierra Forest 288 cores E) consume 350-500 W para el socket y cuesta una fracción. La operativa: la H100 está reservada para el LLM grande (Llama 70B BF16 o FP8, donde su HBM3 y FP8 tensor cores valen su peso); el Xeon AMX absorbe embeddings (bge-m3, e5-large), reranker (bge-reranker-v2-m3), modelos pequeños (Llama 3.2 1B / 3B INT4) y batch processing offline. Es la misma lógica del &lt;a href="https://blog.lo0.es/posts/capacity-planning-inferencia-llm-on-premise/">capacity planning&lt;/a> llevada un paso más allá: en vez de presupuestar VRAM de KV cache solo en H100, presupuestar cada workload en el silicio donde su arithmetic intensity case mejor.&lt;/p>
&lt;h3 id="razón-2--soberanía-y-diversificación-de-la-cadena-de-suministro">Razón 2 — soberanía y diversificación de la cadena de suministro&lt;/h3>
&lt;p>A noviembre 2025, NVIDIA tiene aproximadamente &lt;strong>94 % del mercado de AI accelerators&lt;/strong>. Esa concentración es riesgo. Para una organización con exigencia ENS / NIS2 / EU AI Act, depender de un único proveedor con foundry concentrada en Taiwán (TSMC) introduce vulnerabilidades de cadena de suministro que regulaciones recientes (NIS2, supply chain provisions) están empezando a exigir documentar y mitigar. &lt;strong>Intel diversifica&lt;/strong>: tiene fabs propias en Europa (Leixlip operativa en Irlanda; Magdeburg planeada en Alemania, con financiación EU Chips Act), lo que para un cliente público español o europeo es argumento contractual real, no marketing.&lt;/p>
&lt;p>Disclaimer obligatorio: &lt;strong>el roadmap Intel post-Falcon Shores es inestable&lt;/strong>. Intel canceló Falcon Shores en enero 2025 y relegó Gaudi 4 a &amp;ldquo;no existirá&amp;rdquo;; la apuesta de re-arranque es Jaguar Shores en 2026 como plataforma rack-scale, todavía sin specs públicas confirmadas. La diversificación es estratégicamente correcta, &lt;strong>pero asumir continuidad de roadmap Intel al nivel del de NVIDIA en 2026 sería ingenuo&lt;/strong>. La estrategia operativa: Intel para cargas donde el lock-in es menor (CPU para embeddings, NUC para edge ligero — sustituibles por AMD/Apple/SiFive si Intel pivot otra vez), NVIDIA para el LLM grande donde la madurez del software stack todavía no tiene rival.&lt;/p>
&lt;h3 id="razón-3--edge">Razón 3 — edge&lt;/h3>
&lt;p>El patrón de &amp;ldquo;todo viaja al DC central&amp;rdquo; rompe en tres casos: latencia (sucursal a 100+ ms del DC, inaceptable para chat), soberanía de datos (prompts con datos personales / clasificados que no deben salir del perímetro local), y operación offline (sucursal con conectividad intermitente). El Intel NUC con CPU moderna (Lunar Lake / Arrow Lake / Panther Lake) trae &lt;strong>NPU 48-50 TOPS + iGPU Xe2/Xe3 100-180 TOPS&lt;/strong> en un equipo de 0.5-1.5 L de volumen y 30-65 W de consumo. Modelos 7B INT4 corren a velocidad usable; con quantization más agresiva (Q3_K) cabe Llama 13B. Para sucursales con RAG sobre corpus local + LLM 7B + guardrails, el NUC es perfecto.&lt;/p>
&lt;h2 id="hardware-intel-relevante-junio-2026">Hardware Intel relevante (junio 2026)&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Pieza&lt;/th>
&lt;th>Memoria&lt;/th>
&lt;th>Performance clave&lt;/th>
&lt;th>Lanzamiento&lt;/th>
&lt;th>Estado&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Intel Gaudi 3&lt;/td>
&lt;td>128 GB HBM2e, 3.67 TB/s&lt;/td>
&lt;td>1835 TFLOPS BF16/FP8; 1200 GB/s networking&lt;/td>
&lt;td>abr-2024&lt;/td>
&lt;td>Activo; sucesor Jaguar Shores 2026 (no Gaudi 4)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel Xeon 6 (Granite Rapids)&lt;/td>
&lt;td>DDR5 + MRDIMM&lt;/td>
&lt;td>86 P-cores, AMX 1024 FLOPS BF16/ciclo/core&lt;/td>
&lt;td>2024-2025&lt;/td>
&lt;td>Activo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel Xeon 6 (Sierra Forest)&lt;/td>
&lt;td>DDR5&lt;/td>
&lt;td>288 E-cores&lt;/td>
&lt;td>2024&lt;/td>
&lt;td>Activo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel Arc Pro B60 (Battlemage)&lt;/td>
&lt;td>24 GB GDDR6, 456 GB/s&lt;/td>
&lt;td>197 TOPS INT8; 12.28 TFLOPS FP32&lt;/td>
&lt;td>sep-2025&lt;/td>
&lt;td>Activo; variante dual 48 GB, rack 8× = 192 GB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel Data Center GPU Max&lt;/td>
&lt;td>128 GB HBM&lt;/td>
&lt;td>sucesor de Ponte Vecchio&lt;/td>
&lt;td>descontinuado&lt;/td>
&lt;td>&lt;strong>Descontinuado&lt;/strong> ene-2026&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel NUC (Lunar Lake)&lt;/td>
&lt;td>DDR5x&lt;/td>
&lt;td>NPU 48 TOPS + Xe2 67 TOPS = 120 TOPS plataforma&lt;/td>
&lt;td>2024&lt;/td>
&lt;td>Activo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel NUC (Arrow Lake)&lt;/td>
&lt;td>DDR5&lt;/td>
&lt;td>NPU 13 TOPS + Xe iGPU&lt;/td>
&lt;td>2024&lt;/td>
&lt;td>Activo (menos NPU que Lunar)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel NUC (Panther Lake)&lt;/td>
&lt;td>DDR5x&lt;/td>
&lt;td>NPU 50 TOPS + Xe3 120 TOPS = 180 TOPS plataforma&lt;/td>
&lt;td>CES ene-2026&lt;/td>
&lt;td>En despliegue&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="intel-gaudi-3--la-nota-crítica-sobre-el-marketing">Intel Gaudi 3 — la nota crítica sobre el marketing&lt;/h3>
&lt;p>Intel publica que Gaudi 3 entrega &lt;strong>+20 % throughput vs H100 en Llama 2 70B inferencia&lt;/strong> y &lt;strong>2× price/performance&lt;/strong>. La cifra aparece en whitepaper oficial y en presentaciones de lanzamiento. Sin embargo, &lt;strong>Signal65 (firma independiente)&lt;/strong> publicó en 2025 que &lt;strong>H200 supera a Gaudi 3 por factor 9× en Llama 3.1 405B&lt;/strong>. La discrepancia es relevante: ambos números pueden ser ciertos para sus benchmarks específicos (Llama 2 70B FP16 vs Llama 3.1 405B FP8) pero la conclusión operativa cambia radicalmente según con cuál te quedes.&lt;/p>
&lt;p>Recomendación de este post: tratar Gaudi 3 como &lt;strong>opción válida para Llama-class 70B en BF16/FP8&lt;/strong> donde Intel reclama paridad o ventaja, no para modelos de frontera 200B+ donde NVIDIA mantiene márgen claro. Y considerar el riesgo de roadmap: Gaudi 4 no existirá; el sucesor de la línea es Jaguar Shores 2026 con arquitectura rack-scale completamente nueva — discontinuidad, no evolución.&lt;/p>
&lt;h3 id="intel-xeon-6-con-amx--el-caballo-de-batalla-cpu">Intel Xeon 6 con AMX — el caballo de batalla CPU&lt;/h3>
&lt;p>Las &lt;strong>Advanced Matrix Extensions (AMX)&lt;/strong> son la pieza no obvia. Cada core P-core de Granite Rapids ejecuta hasta &lt;strong>1024 FLOPS BF16 por ciclo&lt;/strong> vía AMX, lo que convierte un Xeon 6 con 64-86 cores en un acelerador de matriz respetable para modelos pequeños/medianos. Cifras reales reportadas: &lt;strong>Llama 3.2 INT4 a ~57 tok/s con AMX vs 28 tok/s sin AMX&lt;/strong> (factor 2× clean). En servir 7B INT4 con vLLM CPU backend + AMX, Intel reclama &lt;strong>2.7× tok/s vs EPYC 9965&lt;/strong>, cifra con sesgo de Intel pero corroborada cualitativamente por LMSYS en su despliegue DeepSeek R1 671B sobre Xeon 6 + SGLang.&lt;/p>
&lt;p>Caso de uso operativo: &lt;strong>embeddings y reranker&lt;/strong> en un sidecar Xeon 6 al lado del cluster H100. Modelos como &lt;code>bge-m3&lt;/code> (embedding multilingüe) o &lt;code>bge-reranker-v2-m3&lt;/code> corren a throughput aceptable en CPU AMX; no merecen H100 dedicada. Liberar la H100 para el LLM 70B aumenta el RPS efectivo del cluster sin comprar más GPUs.&lt;/p>
&lt;h3 id="intel-arc-pro-b60-y-battlematrix">Intel Arc Pro B60 y Battlematrix&lt;/h3>
&lt;p>Lanzada en septiembre 2025, la Arc Pro B60 (Battlemage) trae &lt;strong>24 GB GDDR6 con 456 GB/s de bandwidth&lt;/strong> y &lt;strong>197 TOPS INT8&lt;/strong> a 200 W. Variante de Maxsun con dual-GPU 48 GB. La configuración rack &amp;ldquo;Battlematrix&amp;rdquo; combina 8 unidades = &lt;strong>192 GB VRAM agregada&lt;/strong> — el punto interesante: a un coste muy inferior a una H100 SXM 80 GB, lo que la hace candidata para LLM 30-70B INT4-INT8 servidos vía OpenVINO o llama.cpp SYCL.&lt;/p>
&lt;p>Phoronix verificó que en SYCL la Arc Pro B70 alcanza &lt;strong>paridad con Radeon PRO W7900&lt;/strong> (generación anterior AMD) en DeepSeek R1 Llama 8B &lt;code>pp512&lt;/code>. Vulkan backend pierde fuerte (~1/4 del rendimiento de SYCL); para Arc Pro siempre SYCL.&lt;/p>
&lt;h3 id="intel-nuc-con-npu--el-edge-node">Intel NUC con NPU — el edge node&lt;/h3>
&lt;p>Los Intel NUC con CPU Lunar Lake (Core Ultra Series 2) traen NPU 4 con &lt;strong>48 TOPS&lt;/strong> y total plataforma &lt;strong>120 TOPS&lt;/strong> sumando iGPU Xe2 y CPU AVX. Panther Lake (CES enero 2026) sube a NPU 5 = 50 TOPS + Xe3 120 TOPS = &lt;strong>180 TOPS plataforma&lt;/strong>.&lt;/p>
&lt;p>Intel afirma que Panther Lake &amp;ldquo;ejecuta modelos 30-70B locales&amp;rdquo;. Comprobación realista: &lt;strong>es marketing&lt;/strong>. El 30-70B INT4 cabe en RAM (DDR5x 32-64 GB) pero la velocidad sostenida con quant Q4_K_M en un NUC ronda 2-8 tok/s; cómodo para uso ocasional, no para servir tráfico. &lt;strong>El sweet spot real del NUC es 7B INT4 a 20-40 tok/s&lt;/strong> sobre iGPU/NPU, perfecto para sucursal de cliente con consultas casuales.&lt;/p>
&lt;h2 id="software-intel--la-pila-relevante">Software Intel — la pila relevante&lt;/h2>
&lt;p>&lt;strong>OpenVINO 2025.3&lt;/strong> (junio 2026) es la pieza central. Soporta deploy con un comando vía OVMS CLI con descarga automática desde HF Hub; integra &lt;code>OpenVINO GenAI&lt;/code> con API C++/Python para pipelines generativas; expone API compatible con vLLM v1 (&lt;code>vLLM-OpenVINO&lt;/code>). Soporte de modelos GGUF: DeepSeek Distill, Qwen 2/2.5, Llama 3. Optimizaciones: Sage Attention (primer token con prompts largos), KV-cache compression por canal.&lt;/p>
&lt;p>&lt;strong>Intel Extension for PyTorch (IPEX)&lt;/strong> — versión XPU 2.8.10+xpu — añade backends Intel a PyTorch. &lt;strong>IPEX-LLM&lt;/strong> es el subproyecto que integra con llama.cpp, Ollama, HuggingFace, LangChain, LlamaIndex, vLLM y DeepSpeed. Mayo 2025: corrió DeepSeek V3/R1 671B y Qwen3MoE 235B en 1-2 Arc A770/B580 con FlashMoE.&lt;/p>
&lt;p>&lt;strong>vLLM CPU backend&lt;/strong> — el branch CPU de vLLM con optimizaciones AMX. Para 7B INT4 en Xeon 4ª gen con AMX: 12-50 tok/s; con Xeon Gold 6530 + INT4: ~80 tok/s. Cifras académicas (arXiv 2410.04466).&lt;/p>
&lt;p>&lt;strong>llama.cpp SYCL&lt;/strong> — el backend recomendado para Arc; Vulkan funciona pero ronda 1/4 del rendimiento SYCL en Arc B580. SYCL alcanza paridad con AMD generación anterior.&lt;/p>
&lt;p>&lt;strong>Habana SynapseAI&lt;/strong> — stack de Gaudi 3. PyTorch bridge &lt;code>habana_frameworks.torch&lt;/code> registra device &lt;code>hpu&lt;/code>; integración con &lt;code>torch.compile&lt;/code>. &lt;strong>No&lt;/strong> es port completo a oneAPI sino integración parcial via oneMKL. Implica que el ecosistema Gaudi mantiene cierta separación del oneAPI general de Intel — relevante de cara al hipotético Jaguar Shores y unificación futura.&lt;/p>
&lt;h2 id="los-cuatro-patrones-canónicos">Los cuatro patrones canónicos&lt;/h2>
&lt;div class="diagram" style="max-width:820px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 820 340" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="cuatro patrones canónicos NVIDIA + Intel">
&lt;style>.b{stroke:#333;stroke-width:1.4;rx:6}.e{fill:#dfe9f5;stroke:#356}.g{fill:#eef0d0;stroke:#7a3}.s{fill:#f4e3cf;stroke:#a63}.d{fill:#ead8f5;stroke:#634}.title{font:600 13px sans-serif;fill:#222}.h{font:700 12px sans-serif;fill:#222}.l{font:11px sans-serif;fill:#222}.n{font:italic 10px sans-serif;fill:#444}&lt;/style>
&lt;text x="410" y="20" text-anchor="middle" class="title">Cuatro patrones canónicos de uso mixto NVIDIA + Intel&lt;/text>
&lt;rect x="20" y="40" width="380" height="120" class="b e"/>
&lt;text x="30" y="62" class="h">1 · EMBEDDINGS + RERANKER EN INTEL&lt;/text>
&lt;text x="30" y="82" class="l">Sidecar Xeon 6 AMX (o Arc Pro B60) sirve bge-m3 +&lt;/text>
&lt;text x="30" y="98" class="l">bge-reranker-v2-m3 al lado del H100 con LLM 70B.&lt;/text>
&lt;text x="30" y="118" class="n">Libera H100 del trabajo barato; mejora RPS efectivo&lt;/text>
&lt;text x="30" y="132" class="n">sin comprar GPU adicional. Pattern más maduro.&lt;/text>
&lt;rect x="420" y="40" width="380" height="120" class="b g"/>
&lt;text x="430" y="62" class="h">2 · GUARDRAILS + PII EN NUC NEAR EDGE&lt;/text>
&lt;text x="430" y="82" class="l">NUC Lunar/Panther Lake en sucursal ejecuta&lt;/text>
&lt;text x="430" y="98" class="l">Llama Guard 4 + Presidio antes del round-trip.&lt;/text>
&lt;text x="430" y="118" class="n">PII jamás sale del perímetro local;&lt;/text>
&lt;text x="430" y="132" class="n">latencia 50-150ms en lugar de 200-500ms.&lt;/text>
&lt;rect x="20" y="170" width="380" height="120" class="b s"/>
&lt;text x="30" y="192" class="h">3 · SPECULATIVE DRAFTER EN NUC&lt;/text>
&lt;text x="30" y="212" class="l">Llama 3.2 1B INT4 en NUC cerca del usuario;&lt;/text>
&lt;text x="30" y="228" class="l">target Llama 70B en H100 central acepta/rechaza.&lt;/text>
&lt;text x="30" y="248" class="n">TTFT cae ~50% si tasa de aceptación &amp;gt; 60%.&lt;/text>
&lt;text x="30" y="262" class="n">Requiere drafter idéntico tokenizer-wise.&lt;/text>
&lt;rect x="420" y="170" width="380" height="120" class="b d"/>
&lt;text x="430" y="192" class="h">4 · DEV WORKSTATIONS NUC&lt;/text>
&lt;text x="430" y="212" class="l">Dev/CI corre tests sobre Llama 3.2 3B en NUC;&lt;/text>
&lt;text x="430" y="228" class="l">prod despliega tras green CI a cluster H100.&lt;/text>
&lt;text x="430" y="248" class="n">Iteración 10× más barata; valida lógica end-to-end&lt;/text>
&lt;text x="430" y="262" class="n">sin gastar GPU productiva.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;h3 id="patrón-1--embeddings--reranker-en-intel">Patrón 1 — embeddings + reranker en Intel&lt;/h3>
&lt;p>El más maduro y el más fácil de adoptar. En un sistema RAG típico, cada request del usuario invoca:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Embedding del query&lt;/strong> (50 ms en H100, 80 ms en Xeon AMX, 30 ms en Arc Pro B60).&lt;/li>
&lt;li>&lt;strong>Búsqueda vectorial&lt;/strong> (Qdrant / Milvus / Chroma; latencia ~10-30 ms).&lt;/li>
&lt;li>&lt;strong>Reranker sobre top-k candidatos&lt;/strong> (60 ms en H100, 100-150 ms en Xeon AMX).&lt;/li>
&lt;li>&lt;strong>LLM&lt;/strong> sobre prompt aumentado (200-500 ms TTFT, 30-50 ms/token).&lt;/li>
&lt;/ol>
&lt;p>Los pasos 1 y 3 son &lt;strong>memory-bound + relativamente pequeños&lt;/strong> (modelos 100M-1B): Xeon 6 con AMX (Arc Pro B60 más rápida pero ya GPU dedicada) hace el trabajo a un coste de hardware una fracción del de una H100 dedicada. El paso 4 sigue en NVIDIA porque ahí es donde su arquitectura tensor + HBM3 + FP8 vale lo que cuesta.&lt;/p>
&lt;p>&lt;strong>Implicación operativa&lt;/strong>: un Xeon 6 sidecar (~40 cores, ~10-15 k€) sirviendo embeddings + reranker libera el equivalente de 1-2 H100 de carga &amp;ldquo;barata&amp;rdquo;, recuperando esa capacidad para el LLM grande. ROI en sizing claro.&lt;/p>
&lt;h3 id="patrón-2--guardrails--pii-redact-en-nuc-near-edge">Patrón 2 — guardrails + PII redact en NUC near edge&lt;/h3>
&lt;p>Una sucursal bancaria, un consultorio médico o una oficina jurídica genera prompts con &lt;strong>datos personales o clasificados&lt;/strong>. Mandar esos prompts al DC central (aunque sea on-premise corporativo) puede chocar con políticas de retención local o con compliance específico (GDPR, secreto profesional).&lt;/p>
&lt;p>Patrón: el &lt;strong>NUC en la sucursal&lt;/strong> ejecuta dos pasos críticos antes del round-trip:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>PII redact&lt;/strong> con Presidio (CPU-only, rápido) o Llama Guard 4 8B en NPU + iGPU del NUC. Reemplaza nombres, NIFs, números de cuenta por placeholders.&lt;/li>
&lt;li>&lt;strong>Guardrails ligeros&lt;/strong> (PromptGuard 2 86M, Llama Guard 4 8B) en NPU + iGPU. Filtra prompt injection, jailbreak, contenido prohibido.&lt;/li>
&lt;/ol>
&lt;p>Solo después, el prompt redacted viaja al DC central para que el LLM grande responda. La respuesta se devuelve al NUC, que &lt;strong>re-hidrata&lt;/strong> los placeholders con los valores reales antes de mostrarla al usuario. Los datos sensibles nunca abandonan la sucursal.&lt;/p>
&lt;p>Costes: NUC Panther Lake ~1500-2500 €/unidad, escalable a docenas de sucursales sin coste de GPU central adicional. Latencia: 50-150 ms del paso edge antes del round-trip de 200-500 ms del DC.&lt;/p>
&lt;h3 id="patrón-3--speculative-decoding-drafter-en-nuc">Patrón 3 — speculative decoding drafter en NUC&lt;/h3>
&lt;p>&lt;a href="https://blog.lo0.es/posts/speculative-decoding-fundamentos/">Speculative decoding&lt;/a> usa un &lt;strong>drafter pequeño&lt;/strong> que propone γ tokens y un &lt;strong>target grande&lt;/strong> que los acepta/rechaza en un único forward pass. Si el drafter está geográficamente cerca del usuario (NUC en sucursal) y el target en el DC central, la latencia percibida del cliente cae aún más.&lt;/p>
&lt;p>&lt;strong>Setup&lt;/strong>: drafter Llama 3.2 1B INT4 en NUC + target Llama 3.1 70B FP8 en H100 central. El NUC genera γ=4 tokens en ~50 ms locales; el target los verifica en una pasada (40-80 ms incluyendo round-trip); si tasa de aceptación &amp;gt; 60 %, &lt;strong>TTFT efectivo cae ~50 %&lt;/strong> vs Llama 70B sin speculative.&lt;/p>
&lt;p>Restricción importante: &lt;strong>drafter y target deben compartir tokenizer&lt;/strong>. Llama 3.2 1B y Llama 3.1 70B tienen tokenizer compatible. Mezclar Llama drafter con Qwen target rompe el patrón.&lt;/p>
&lt;h3 id="patrón-4--dev-workstations-nuc">Patrón 4 — dev workstations NUC&lt;/h3>
&lt;p>El dev / CI iterando sobre prompts, evals, retrieval logic, no necesita GPU productiva para validar correctness. Un NUC con Llama 3.2 3B INT4 corre los tests funcionales end-to-end (incluyendo embeddings + retrieval + LLM + guardrails) en una décima parte del coste de iterar sobre una H100. &lt;strong>Solo el último smoke test pre-prod usa el cluster productivo&lt;/strong>.&lt;/p>
&lt;p>Patrón maduro en organizaciones con muchos desarrolladores y GPU productiva escasa. La iteración 10× más rápida y barata se traduce en velocidad de feature delivery.&lt;/p>
&lt;h2 id="observabilidad-unificada-en-cluster-heterogéneo">Observabilidad unificada en cluster heterogéneo&lt;/h2>
&lt;p>El &lt;a href="https://blog.lo0.es/posts/observabilidad-gpu-dcgm-llm/">post de observabilidad GPU&lt;/a> cubría DCGM Exporter para NVIDIA. En cluster mixto hace falta más:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Pieza hardware&lt;/th>
&lt;th>Exporter&lt;/th>
&lt;th>Métricas clave&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>NVIDIA H100/A100&lt;/td>
&lt;td>&lt;code>nvidia/dcgm-exporter&lt;/code>&lt;/td>
&lt;td>DCGM_FI_DEV_* + DCGM_FI_PROF_*&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel Gaudi 3&lt;/td>
&lt;td>&lt;code>HabanaAI/habana-metric-exporter&lt;/code>&lt;/td>
&lt;td>habana_hpu_utilization, habana_hbm_used&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel Arc Pro&lt;/td>
&lt;td>&lt;code>intel/intel-gpu-exporter&lt;/code> (no oficial; existen alternativas)&lt;/td>
&lt;td>xe_engine_utilization, xe_memory_used&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel Xeon CPU + AMX&lt;/td>
&lt;td>&lt;code>prometheus/node-exporter&lt;/code> + Intel PCM&lt;/td>
&lt;td>cpu_amx_utilization (vía PCM)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Intel NUC (NPU+iGPU)&lt;/td>
&lt;td>&lt;code>intel/intel-gpu-exporter&lt;/code> + custom NPU exporter&lt;/td>
&lt;td>npu_utilization, xe_iGPU&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Todos federados en un único Prometheus + Grafana. Las dashboards se organizan por &lt;strong>familia de hardware&lt;/strong> (NVIDIA, Intel server, Intel edge) más una vista agregada &amp;ldquo;cluster heterogéneo&amp;rdquo; con SLO por tenant que combina los cuatro.&lt;/p>
&lt;p>Cardinalidad: ~1.5-2× la del cluster NVIDIA puro. Manejable con Thanos / Mimir para retención larga.&lt;/p>
&lt;h2 id="routing-por-capability--del-router-l7-al-heterogéneo">Routing por capability — del router L7 al heterogéneo&lt;/h2>
&lt;p>El &lt;a href="https://blog.lo0.es/posts/router-inferencia-llm-gateway-l7/">router de inferencia LLM&lt;/a> deja de ser un selector de versiones del mismo modelo para convertirse en un &lt;strong>dispatcher por capability&lt;/strong>:&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">models&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;llama-70b-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">endpoint&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;vllm-llama70b.inference.svc:8000&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">backend&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">nvidia-h100&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">capabilities&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">chat, tool_use, json_mode]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;embedding-multilingual&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">endpoint&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;ipex-bge-m3.inference.svc:8080&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">backend&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">intel-xeon-amx&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">capabilities&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">embeddings]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;reranker-multilingual&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">endpoint&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;ipex-bge-reranker.inference.svc:8080&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">backend&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">intel-xeon-amx&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">capabilities&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">reranking]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;guardrail-prompt-injection&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">endpoint&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;openvino-llama-guard.edge-suc01.local:8080&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">backend&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">intel-nuc-edge&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">capabilities&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">guardrails, redact-pii]&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">region&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sucursal-01&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;llama-3b-draft&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">endpoint&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;openvino-llama-3b.edge-suc01.local:8080&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">backend&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">intel-nuc-edge&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">capabilities&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">speculative-drafter]&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">region&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sucursal-01&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">target_model&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;llama-70b-chat&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>El router resuelve &lt;code>model=embedding-multilingual&lt;/code> → Intel Xeon; &lt;code>model=llama-70b-chat&lt;/code> → H100; &lt;code>model=guardrail-prompt-injection&lt;/code> con &lt;code>region=sucursal-01&lt;/code> → NUC local. Si el NUC de la sucursal cae, &lt;strong>failover&lt;/strong> a una réplica equivalente en el DC central, asumiendo el coste de latencia.&lt;/p>
&lt;p>LiteLLM Proxy, NVIDIA Dynamo y Envoy AI Gateway soportan este routing por capability. La pieza no obvia: el router debe conocer el &lt;strong>tokenizer compatible&lt;/strong> entre drafter y target para el patrón 3, lo que se modela en metadata adicional del catálogo.&lt;/p>
&lt;h2 id="pitfalls-específicos">Pitfalls específicos&lt;/h2>
&lt;p>&lt;strong>Tokenizer mismatch entre engines.&lt;/strong> OpenVINO con un GGUF de Llama 3.2 y vLLM con el mismo Llama 3.2 nominal pueden usar tokenizers ligeramente distintos (chat template, special tokens). Validar identidad de tokens con &lt;code>tokenizer.encode(&amp;quot;hola&amp;quot;)&lt;/code> en ambos lados antes de asumir intercambiabilidad. Para speculative decoding, &lt;strong>un solo token diferente rompe el patrón&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Latencia round-trip edge ↔ central.&lt;/strong> El patrón 2 y 3 asumen que el NUC y el DC están en la misma WAN corporativa con latencia controlada. Si la sucursal está sobre 4G/5G con jitter de 100-200 ms, el speculative drafter no compensa nada — al revés, añade latencia. Medir antes de prometer.&lt;/p>
&lt;p>&lt;strong>FP8 Hopper ≠ INT8 AMX en calidad de salida.&lt;/strong> El operador asume que una request que en H100 corre FP8 y en Xeon AMX corre INT8 producirá la misma salida. &lt;strong>No es cierto&lt;/strong>: las dos quantizaciones tienen perfiles de degradación distintos. Si el sistema espera idempotencia (e.g., evals con golden output), validar offline que la versión Intel reproduce el comportamiento esperado dentro de tolerancia.&lt;/p>
&lt;p>&lt;strong>Sincronización de versiones de modelo entre sitios.&lt;/strong> El modelo en el DC central se actualiza, pero los NUCs de las sucursales mantienen la versión vieja del drafter o del guardrail durante semanas. Resultado: comportamiento divergente entre sucursales sin diagnóstico fácil. Política: &lt;strong>modelo central y modelo edge avanzan juntos&lt;/strong> o con ventana documentada; el &lt;a href="https://blog.lo0.es/posts/canary-blue-green-shadow-modelos-llm/">canary&lt;/a> se extiende a la flota de NUCs.&lt;/p>
&lt;p>&lt;strong>Roadmap Intel inestable.&lt;/strong> Falcon Shores cancelado, Gaudi 4 no existirá, Jaguar Shores 2026 todavía sin specs públicas confirmadas. Comprar Gaudi 3 hoy es razonable si el caso de uso justifica los 18-24 meses de amortización; comprometer arquitectura a 5+ años sobre Intel accelerator es apuesta más arriesgada que la equivalente NVIDIA — al menos hasta que Jaguar Shores se materialice con software stack maduro.&lt;/p>
&lt;p>&lt;strong>Vacío de despliegues productivos públicos.&lt;/strong> A junio 2026, los despliegues Gaudi 3 confirmados son IBM Cloud, Dell AI Factory y un puñado de early adopters (Bharti Airtel, Bosch, Naver). &lt;strong>No hay caso público verificable de cluster mixto NVIDIA + Intel en banca o gobierno europeo&lt;/strong>. Este patrón es &lt;strong>arquitectura emergente recomendada&lt;/strong>, no práctica con histórico industrial. El primer adoptante asume coste de validación que un segundo adoptante evita.&lt;/p>
&lt;h2 id="aplicado-a-un-cluster-on-premise-genérico">Aplicado a un cluster on-premise genérico&lt;/h2>
&lt;p>Para una organización con un cluster genérico de inferencia LLM heterogéneo:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>DC central&lt;/strong>: 4 nodos × 4×H100 SXM 80 GB con NVLink intra-nodo = 16 H100. Sirve LLM grandes (Llama 70B, Mixtral 8×22B, Qwen 72B) en BF16 o FP8.&lt;/li>
&lt;li>&lt;strong>Sidecar Xeon 6&lt;/strong>: 2-4 servidores Xeon 6 (Granite Rapids 64-86 cores) con AMX, 512 GB DDR5, en el mismo rack que el cluster H100. Sirve embeddings (bge-m3), reranker (bge-reranker-v2-m3), modelos pequeños (Llama 3.2 1B/3B) en vLLM CPU backend con AMX.&lt;/li>
&lt;li>&lt;strong>Sidecar Arc Pro&lt;/strong> (opcional): 1-2 servidores con 4-8× Arc Pro B60 24 GB cada uno (Battlematrix), para modelos 13-30B INT8 vía OpenVINO. Útil si el coste por LLM mediano debe bajar de la H100.&lt;/li>
&lt;li>&lt;strong>NUCs edge en sucursales&lt;/strong>: 1-2 NUCs Panther Lake por sucursal, con NPU 50 TOPS + Xe3 120 TOPS, sirviendo Llama Guard 4 + Presidio + drafter Llama 3.2 1B INT4 vía OpenVINO. Conectividad WAN corporativa con latencia &amp;lt; 80 ms hacia el DC.&lt;/li>
&lt;/ul>
&lt;p>Volumen estimado: cluster central ~120 kW de pico GPU + ~10-15 kW de sidecars Intel. Edge: ~50 W por NUC, despreciable comparado con coste de oficinas.&lt;/p>
&lt;p>Observabilidad: Prometheus federado en el DC + scrape pull desde los NUCs (vía VPN corporativa). Dashboards &amp;ldquo;GPU NVIDIA fleet&amp;rdquo;, &amp;ldquo;Intel server fleet&amp;rdquo;, &amp;ldquo;Intel edge fleet&amp;rdquo; más una vista &amp;ldquo;SLO consolidado&amp;rdquo;.&lt;/p>
&lt;p>Router: LiteLLM Proxy o NVIDIA Dynamo en el DC, con catálogo de modelos extendido para incluir backends Intel y regiones (sucursal-01, sucursal-02, &amp;hellip;). Failover edge→central documentado.&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>Benchmarks reproducibles&lt;/strong> de Llama 70B en Gaudi 3 vs H100 SXM en hardware equivalente — el material que falta para tomar decisiones con datos propios, no de Intel ni de Signal65.&lt;/li>
&lt;li>&lt;strong>AMD ROCm en el mix&lt;/strong>: cómo entran MI300X / MI355X en este patrón heterogéneo y qué cambia el catálogo del router.&lt;/li>
&lt;li>&lt;strong>Apple Silicon como edge&lt;/strong>: M3/M4 Max con Neural Engine ~38 TOPS + GPU 40-core, hardware equivalente al NUC Panther Lake pero con software stack distinto (MLX).&lt;/li>
&lt;li>&lt;strong>Optimización de coste energético&lt;/strong>: cómo &lt;code>nvidia-smi -pl 500W&lt;/code> + Intel TDP cap en Xeon 6 reduce factura un 25-30 % con 15-20 % de pérdida de throughput.&lt;/li>
&lt;li>&lt;strong>CI/CD de modelos para flota edge&lt;/strong>: cómo el rolling update de un Llama Guard llega a 50 NUCs de sucursales sin que ninguna pierda servicio.&lt;/li>
&lt;/ul>
&lt;h2 id="ver-también">Ver también&lt;/h2>
&lt;ul>
&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 sizing que esta heterogeneidad permite optimizar tarea por tarea, no para todo en H100.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/siete-capas-stack-inferencia-llm-on-premise/">Siete capas del stack de inferencia LLM on-premise&lt;/a> — las siete capas aplican igual sobre hardware heterogéneo; los backends son intercambiables si el contrato OpenAI-compatible se respeta.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/router-inferencia-llm-gateway-l7/">El router de inferencia LLM&lt;/a> — el router por capability es la pieza central del patrón heterogéneo.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/observabilidad-gpu-dcgm-llm/">Observabilidad GPU para inferencia LLM&lt;/a> — extiende a Gaudi, Arc, Xeon AMX y NPU edge.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/quantization-fundamentos-inferencia/">Quantization para inferencia LLM&lt;/a> — FP8 Hopper, INT8 AMX, INT4 GGUF — la base de por qué los hardware mixtos exigen validación cruzada.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/speculative-decoding-fundamentos/">Speculative decoding&lt;/a> — el patrón 3 del post; cómo el drafter near edge cierra latencia.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">Guardrails y safety en LLMs&lt;/a> y &lt;a href="https://blog.lo0.es/posts/llm-guard-fundamentos/">LLM Guard&lt;/a> — los modelos que viven en el NUC del patrón 2.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/catalogo-herramientas-oss-llmops/">Catálogo OSS para LLMOps&lt;/a> — fichas de OpenVINO, IPEX-LLM, vLLM CPU backend.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/oss-vs-hyperscalers-llmops/">OSS vs hyperscalers&lt;/a> — el análisis paralelo de lock-in que sostiene el argumento de diversificación.&lt;/li>
&lt;/ul>
&lt;h2 id="referencias">Referencias&lt;/h2>
&lt;p>&lt;strong>Intel Gaudi 3&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Intel — &lt;em>Gaudi 3 AI Accelerator White Paper&lt;/em>. &lt;a href="https://cdrdv2-public.intel.com/817486/gaudi-3-ai-accelerator-white-paper.pdf">https://cdrdv2-public.intel.com/817486/gaudi-3-ai-accelerator-white-paper.pdf&lt;/a>&lt;/li>
&lt;li>Intel — Hot Chips 2024 Gaudi 3 deep dive. &lt;a href="https://hc2024.hotchips.org/assets/program/conference/day1/60_HC2024.Intel.RomanKaplan.Gaudi3-0826.pdf">https://hc2024.hotchips.org/assets/program/conference/day1/60_HC2024.Intel.RomanKaplan.Gaudi3-0826.pdf&lt;/a>&lt;/li>
&lt;li>Signal65 / DataCenterDynamics — &lt;em>NVIDIA H200 outperforms Intel Gaudi 3 by factor of 9× across first Llama 3.1 405B benchmark test&lt;/em>. &lt;a href="https://www.datacenterdynamics.com/en/news/nvidia-h200-outperforms-intel-gaudi-3-by-factor-of-nine-across-first-llama-31-405b-benchmark-test-exclusive/">https://www.datacenterdynamics.com/en/news/nvidia-h200-outperforms-intel-gaudi-3-by-factor-of-nine-across-first-llama-31-405b-benchmark-test-exclusive/&lt;/a>&lt;/li>
&lt;li>IEEE Spectrum — &lt;em>Intel Gaudi 3 review&lt;/em>. &lt;a href="https://spectrum.ieee.org/intel-gaudi-3">https://spectrum.ieee.org/intel-gaudi-3&lt;/a>&lt;/li>
&lt;li>Tom&amp;rsquo;s Hardware — &lt;em>Intel cancels Falcon Shores GPU; Jaguar Shores to be successor&lt;/em>. &lt;a href="https://www.tomshardware.com/tech-industry/artificial-intelligence/intel-cancels-falcon-shores-gpu-for-ai-workloads-jaguar-shores-to-be-successor">https://www.tomshardware.com/tech-industry/artificial-intelligence/intel-cancels-falcon-shores-gpu-for-ai-workloads-jaguar-shores-to-be-successor&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Intel Xeon 6 + AMX&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Intel — &lt;em>Xeon 6 (Granite Rapids) Product Brief&lt;/em>. &lt;a href="https://www.intel.com/content/dam/www/central-libraries/us/en/documents/2025-02/xeon-6-granite-rapids-product-brief.pdf">https://www.intel.com/content/dam/www/central-libraries/us/en/documents/2025-02/xeon-6-granite-rapids-product-brief.pdf&lt;/a>&lt;/li>
&lt;li>OpenMetal — &lt;em>Intel AMX AI Inference Performance&lt;/em>. &lt;a href="https://openmetal.io/resources/blog/intel-amx-ai-inference-performance/">https://openmetal.io/resources/blog/intel-amx-ai-inference-performance/&lt;/a>&lt;/li>
&lt;li>LMSYS — &lt;em>Intel Xeon 6 + SGLang for DeepSeek R1 671B&lt;/em>. &lt;a href="https://www.lmsys.org/blog/2025-07-14-intel-xeon-optimization/">https://www.lmsys.org/blog/2025-07-14-intel-xeon-optimization/&lt;/a>&lt;/li>
&lt;li>arXiv 2410.04466 — &lt;em>CPU-LLM benchmarks with AMX&lt;/em>.&lt;/li>
&lt;li>Intel community blog — &lt;em>Accelerating vLLM Inference on Intel Xeon 6 Processor&lt;/em>.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Intel Arc Pro Battlemage&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Intel — &lt;em>Arc Pro B60 Graphics Specifications&lt;/em>. &lt;a href="https://www.intel.com/content/www/us/en/products/sku/243916/intel-arc-pro-b60-graphics/specifications.html">https://www.intel.com/content/www/us/en/products/sku/243916/intel-arc-pro-b60-graphics/specifications.html&lt;/a>&lt;/li>
&lt;li>StorageReview — &lt;em>Intel Arc Pro B60 Battlematrix Preview: 192GB VRAM for On-Premise AI&lt;/em>. &lt;a href="https://www.storagereview.com/review/intel-arc-pro-b60-battlematrix-preview-192gb-of-vram-for-on-premise-ai">https://www.storagereview.com/review/intel-arc-pro-b60-battlematrix-preview-192gb-of-vram-for-on-premise-ai&lt;/a>&lt;/li>
&lt;li>Phoronix — &lt;em>Intel Arc Pro B-series review&lt;/em>. &lt;a href="https://www.phoronix.com/review/intel-arc-pro-b-series">https://www.phoronix.com/review/intel-arc-pro-b-series&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Intel NUC / NPU&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>HotHardware — &lt;em>Intel CES 2026 Panther Lake is a Go&lt;/em>. &lt;a href="https://hothardware.com/news/intel-ces-2026-panther-lake-is-a-go">https://hothardware.com/news/intel-ces-2026-panther-lake-is-a-go&lt;/a>&lt;/li>
&lt;li>TechPowerUp — &lt;em>Intel Panther Lake Technical Deep Dive&lt;/em>.&lt;/li>
&lt;li>arXiv 2412.11053 — &lt;em>NITRO: LLM inference on laptop NPU&lt;/em>.&lt;/li>
&lt;li>Intel — &lt;em>AI PC brings larger LLM development to your desk&lt;/em>.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Software&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>OpenVINO — &lt;em>Release Notes 2025.3&lt;/em>. &lt;a href="https://www.intel.com/content/www/us/en/developer/articles/release-notes/openvino/2025-3.html">https://www.intel.com/content/www/us/en/developer/articles/release-notes/openvino/2025-3.html&lt;/a>&lt;/li>
&lt;li>HuggingFace — &lt;em>Deploy with OpenVINO&lt;/em>. &lt;a href="https://huggingface.co/blog/deploy-with-openvino">https://huggingface.co/blog/deploy-with-openvino&lt;/a>&lt;/li>
&lt;li>Intel — &lt;em>Intel Extension for PyTorch XPU 2.8.10&lt;/em>. &lt;a href="https://intel.github.io/intel-extension-for-pytorch/xpu/latest/tutorials/releases.html">https://intel.github.io/intel-extension-for-pytorch/xpu/latest/tutorials/releases.html&lt;/a>&lt;/li>
&lt;li>IPEX-LLM — &lt;code>github.com/intel/ipex-llm&lt;/code>.&lt;/li>
&lt;li>Habana — &lt;em>SynapseAI PyTorch Theory of Operations&lt;/em>. &lt;a href="https://docs.habana.ai/en/latest/PyTorch/PyTorch_Gaudi_Theory_of_Operations.html">https://docs.habana.ai/en/latest/PyTorch/PyTorch_Gaudi_Theory_of_Operations.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Market context&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>MLCommons — &lt;em>MLPerf Inference v6.0 benchmark results&lt;/em>. &lt;a href="https://www.spheron.network/blog/mlperf-inference-v6-benchmark-results-2026/">https://www.spheron.network/blog/mlperf-inference-v6-benchmark-results-2026/&lt;/a>&lt;/li>
&lt;li>Intel newsroom — &lt;em>Gaudi 3 Expanded Availability&lt;/em>. &lt;a href="https://newsroom.intel.com/artificial-intelligence/intel-gaudi-3-expands-availability-drive-ai-innovation-scale">https://newsroom.intel.com/artificial-intelligence/intel-gaudi-3-expands-availability-drive-ai-innovation-scale&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Sources: las URLs completas están enlazadas en línea sobre cada referencia.&lt;/p></description></item><item><title>Observabilidad GPU para inferencia LLM: las doce métricas DCGM y vLLM que dictan la salud de tu producción</title><link>https://blog.lo0.es/posts/observabilidad-gpu-dcgm-llm/</link><pubDate>Mon, 01 Jun 2026 15:30:00 +0200</pubDate><guid>https://blog.lo0.es/posts/observabilidad-gpu-dcgm-llm/</guid><description>&lt;blockquote>
&lt;p>Este post complementa los de &lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">Tracing LLM con OpenTelemetry GenAI&lt;/a> (la capa de tracing por encima de las métricas), &lt;a href="https://blog.lo0.es/posts/capacity-planning-inferencia-llm-on-premise/">Capacity planning&lt;/a> (qué se dimensionó y qué se debe vigilar) y &lt;a href="https://blog.lo0.es/posts/continuous-batching-fundamentos/">Continuous batching&lt;/a> (el mecanismo que explica varias de las métricas del motor).&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>La observabilidad de un cluster de inferencia LLM se construye sobre &lt;strong>dos fuentes complementarias&lt;/strong>: las métricas del hardware GPU expuestas por &lt;strong>DCGM (Data Center GPU Manager) Exporter&lt;/strong> —parte del NVIDIA GPU Operator— y las métricas del &lt;strong>motor de inferencia&lt;/strong> (vLLM, SGLang, TensorRT-LLM) expuestas en &lt;code>/metrics&lt;/code> Prometheus-compatibles. Ninguna de las dos basta sola. La métrica clásica de &lt;code>nvidia-smi&lt;/code> llamada &lt;em>GPU utilization&lt;/em> es engañosa para LLMs: marca alto cuando hay &lt;strong>cualquier kernel&lt;/strong> ejecutándose, sin distinguir tensor cores ardiendo de SMs esperando por HBM. La cabina de pilotaje completa tiene &lt;strong>doce métricas DCGM en cuatro familias&lt;/strong> (compute: &lt;code>DCGM_FI_PROF_SM_OCCUPANCY&lt;/code>, &lt;code>DCGM_FI_PROF_PIPE_TENSOR_ACTIVE&lt;/code>, &lt;code>DCGM_FI_PROF_DRAM_ACTIVE&lt;/code>; memoria: &lt;code>DCGM_FI_DEV_FB_USED&lt;/code>, &lt;code>DCGM_FI_DEV_FB_FREE&lt;/code>, &lt;code>DCGM_FI_DEV_NVLINK_BANDWIDTH_TOTAL&lt;/code>; térmico-energético: &lt;code>DCGM_FI_DEV_GPU_TEMP&lt;/code>, &lt;code>DCGM_FI_DEV_POWER_USAGE&lt;/code>, &lt;code>DCGM_FI_DEV_CLOCK_THROTTLE_REASONS&lt;/code>; salud: &lt;code>DCGM_FI_DEV_XID_ERRORS&lt;/code>, &lt;code>DCGM_FI_DEV_ECC_DBE_VOL_TOTAL&lt;/code>, &lt;code>DCGM_FI_DEV_RETIRED_DBE&lt;/code>) y &lt;strong>cinco métricas del motor vLLM&lt;/strong> (&lt;code>vllm:num_requests_running&lt;/code>, &lt;code>vllm:num_requests_waiting&lt;/code>, &lt;code>vllm:gpu_cache_usage_perc&lt;/code>, &lt;code>vllm:time_to_first_token_seconds&lt;/code>, &lt;code>vllm:time_per_output_token_seconds&lt;/code>). Cada una tiene un umbral verde/ámbar/rojo defendible, una PromQL para alerta, y al menos una falsa lectura habitual que confunde al operador junior. Las &lt;strong>seis alertas críticas&lt;/strong> que cualquier cluster productivo debe disparar son: HBM &amp;gt; 92 %, throttle por térmico o por power, XID error, ECC double-bit, KV cache pool &amp;gt; 95 %, y TTFT P95 fuera de SLO durante 5 minutos. El objetivo de tener este panel: que el operador de turno diagnostique el origen de una degradación en &lt;strong>menos de cinco minutos&lt;/strong>, sin abrir consola SSH a las GPUs. Cuando esto se cumple, el cluster ha pasado a operación profesional; mientras no, se opera por intuición.&lt;/p>
&lt;h2 id="estás-aquí-observe-la-otra-mitad-del-tracing">Estás aquí: OBSERVE (la otra mitad del tracing)&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í: Observe">
&lt;style>.box{stroke:#444;stroke-width:1.4;rx:6}.active{fill:#c9a8e9;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(#obm)}.cyc{stroke:#888;stroke-width:1.2;fill:none;stroke-dasharray:4 2;marker-end:url(#obm)}&lt;/style>
&lt;defs>&lt;marker id="obm" 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í: OBSERVE · métricas (DCGM + motor) complementan al tracing&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 idle"/>&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 active"/>&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;p>El tracing —ya cubierto en &lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">Tracing LLM con OpenTelemetry GenAI&lt;/a>— responde &lt;em>qué pasó en esta request concreta&lt;/em>. Las métricas responden &lt;em>qué está pasando en el cluster en agregado&lt;/em>. Son complementarias: una alerta del lado de métricas te dice &amp;ldquo;el clúster está degradando&amp;rdquo;, el tracing te dice &amp;ldquo;y esta es la traza concreta que te lo demuestra&amp;rdquo;. Un cluster sin tracing pero con métricas opera; un cluster sin métricas pero con tracing &lt;strong>no opera, debuggea&lt;/strong>.&lt;/p>
&lt;h2 id="la-analogía-la-cabina-de-un-avión-moderno">La analogía: la cabina de un avión moderno&lt;/h2>
&lt;p>En un avión comercial moderno, el panel de instrumentos del piloto tiene más de 70 indicadores activos. Si solo hubiese uno —el altímetro, por ejemplo— el avión volaría hacia el suelo en el primer momento de baja visibilidad. Hace falta el altímetro &lt;strong>y&lt;/strong> el indicador de actitud, &lt;strong>y&lt;/strong> el de velocidad, &lt;strong>y&lt;/strong> el de viraje, &lt;strong>y&lt;/strong> el de combustible, &lt;strong>y&lt;/strong> los de presión de aceite de cada motor, &lt;strong>y&lt;/strong> las temperaturas de salida de turbina. Cada uno responde una pregunta distinta. Y todos juntos cubren la pregunta operacional: &lt;em>¿está el avión sano, está donde debe, y va donde queremos?&lt;/em>&lt;/p>
&lt;p>La observabilidad de un cluster de inferencia LLM funciona igual. Una sola métrica —&amp;ldquo;GPU utilization 99 %&amp;quot;— no responde nada útil. Es como mirar solo el cuentakilómetros del coche para diagnosticar por qué hace ruido el motor. La cabina completa es &lt;strong>doce instrumentos del lado de hardware más cinco del lado del motor de inferencia&lt;/strong>, organizados en familias que responden preguntas distintas:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Compute y eficiencia&lt;/strong>: &lt;em>¿están los tensor cores haciendo el trabajo que esperamos o están esperando?&lt;/em>&lt;/li>
&lt;li>&lt;strong>Memoria&lt;/strong>: &lt;em>¿queda VRAM para nuevas requests o estamos al borde del OOM?&lt;/em>&lt;/li>
&lt;li>&lt;strong>Térmico y energético&lt;/strong>: &lt;em>¿el hardware está sano o está limitando el throughput silenciosamente?&lt;/em>&lt;/li>
&lt;li>&lt;strong>Salud y errores&lt;/strong>: &lt;em>¿hay degradación del hardware en curso (ECC, XID, NVLink)?&lt;/em>&lt;/li>
&lt;li>&lt;strong>Motor de inferencia&lt;/strong>: &lt;em>¿la cola crece, el KV pool está saturado, el SLO se está cumpliendo?&lt;/em>&lt;/li>
&lt;/ul>
&lt;p>Las cuatro primeras responden a &amp;ldquo;¿la GPU está bien?&amp;rdquo;. La quinta responde a &amp;ldquo;¿está dando el servicio que prometimos?&amp;rdquo;. Las dos preguntas son distintas y ambas deben tener respuesta a un golpe de vista.&lt;/p>
&lt;h2 id="por-qué-nvidia-smi-gpu-util-engaña-en-llms">Por qué &lt;code>nvidia-smi&lt;/code> &lt;code>GPU-Util&lt;/code> engaña en LLMs&lt;/h2>
&lt;p>La métrica clásica que aparece en &lt;code>nvidia-smi&lt;/code> como &lt;code>GPU-Util&lt;/code> corresponde a &lt;code>DCGM_FI_DEV_GPU_UTIL&lt;/code>. Su definición oficial: &amp;ldquo;porcentaje del tiempo durante el cual uno o más kernels estuvieron ejecutándose en la GPU&amp;rdquo;. El problema en LLMs: la fase de decode es &lt;strong>memory-bound&lt;/strong>, no compute-bound. Cuando el motor de inferencia hace decode token a token, la GPU pasa el 90 % del tiempo esperando que la HBM termine de entregar los pesos del modelo y el KV cache. Hay un kernel corriendo (lectura de HBM); por tanto &lt;code>GPU-Util&lt;/code> reporta valores cercanos al 100 %. Pero los tensor cores están parados — el cuello de botella es la memoria, no el compute.&lt;/p>
&lt;p>Resultado práctico: el operador ve &amp;ldquo;GPU-Util 99 %&amp;rdquo; en Grafana y asume &amp;ldquo;GPU saturada, no se puede meter más carga&amp;rdquo;. Pero la realidad puede ser &amp;ldquo;compute al 25 %, HBM saturada al 95 %&amp;rdquo;, lo que cambia las decisiones operativas (quantization, batch size, paralelismo). La métrica clásica miente por simplificación.&lt;/p>
&lt;p>Lo correcto es mirar las &lt;strong>tres métricas de profiling DCGM&lt;/strong> del subsistema &lt;code>_FI_PROF_*&lt;/code>:&lt;/p>
&lt;ul>
&lt;li>&lt;code>DCGM_FI_PROF_SM_OCCUPANCY&lt;/code> — ratio de warps activos sobre máximos por SM. &lt;em>¿Hay trabajo paralelo?&lt;/em>&lt;/li>
&lt;li>&lt;code>DCGM_FI_PROF_PIPE_TENSOR_ACTIVE&lt;/code> — % de ciclos con tensor cores efectivamente activos. &lt;em>¿Está el compute trabajando?&lt;/em>&lt;/li>
&lt;li>&lt;code>DCGM_FI_PROF_DRAM_ACTIVE&lt;/code> — % de ciclos con la HBM transfiriendo. &lt;em>¿Está la memoria saturada?&lt;/em>&lt;/li>
&lt;/ul>
&lt;p>Una decode-bound GPU típica de Llama 70B en H100 muestra: SM occupancy 35–55 %, tensor active 15–30 %, DRAM active 80–95 %. Esa es la &amp;ldquo;GPU saturada&amp;rdquo; real para LLMs. Las tres juntas distinguen los regímenes; cada una sola no dice nada accionable.&lt;/p>
&lt;h2 id="cómo-se-montan-en-producción">Cómo se montan en producción&lt;/h2>
&lt;p>La parte de plataforma se cubre en &lt;a href="https://blog.lo0.es/posts/cinco-niveles-madurez-plataforma-llm-on-premise/">Cinco niveles de madurez&lt;/a> (nivel 4 — GPU plane) y &lt;a href="https://blog.lo0.es/posts/siete-fases-despliegue-plataforma-llm-on-premise/">Siete fases de despliegue&lt;/a> (fase F5). Para el observador, las piezas clave son:&lt;/p>
&lt;p>&lt;strong>NVIDIA GPU Operator.&lt;/strong> Manifiestos Helm que despliegan en cada nodo GPU: drivers, container toolkit, MIG manager y &lt;strong>DCGM Exporter&lt;/strong>. Este último expone &lt;code>/metrics&lt;/code> en formato Prometheus con todos los &lt;code>DCGM_FI_*&lt;/code> listados arriba. Se scrapea desde el Prometheus interno del cluster.&lt;/p>
&lt;p>&lt;strong>Motor de inferencia.&lt;/strong> vLLM expone &lt;code>/metrics&lt;/code> en el puerto 8000 (default) con métricas &lt;code>vllm:*&lt;/code>. SGLang lo expone también con prefijo &lt;code>sglang:&lt;/code>. TensorRT-LLM lo expone vía Triton Inference Server con prefijo &lt;code>nv_inference:&lt;/code>. La convención básica de nombres es similar entre los tres motores; los umbrales y queries de este post asumen vLLM, pero se traducen.&lt;/p>
&lt;p>&lt;strong>ServiceMonitor / PodMonitor.&lt;/strong> Recurso del operador de Prometheus que indica qué scrapear. Ejemplo mínimo:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">apiVersion&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">monitoring.coreos.com/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">kind&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">PodMonitor&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">metadata&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">vllm-inference&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">spec&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">selector&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">matchLabels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>{&lt;span class="w"> &lt;/span>&lt;span class="nt">app&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">vllm }&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">podMetricsEndpoints&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">port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">metrics&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">interval&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">15s&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Dashboards.&lt;/strong> El operador de NVIDIA publica dashboards Grafana de referencia para DCGM en &lt;code>nvidia/dcgm-exporter&lt;/code> (repo oficial). vLLM publica uno en &lt;code>vllm-project/vllm&lt;/code> (carpeta &lt;code>examples/&lt;/code>). Ambos sirven como base; cada equipo añade los paneles propios de su SLO.&lt;/p>
&lt;h2 id="las-doce-métricas-dcgm-organizadas-por-familia">Las doce métricas DCGM organizadas por familia&lt;/h2>
&lt;div class="diagram" style="max-width:820px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 820 360" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="doce métricas DCGM en cuatro familias">
&lt;style>.b{stroke:#333;stroke-width:1.4;rx:6}.fc{fill:#dfe9f5;stroke:#356}.fm{fill:#eef0d0;stroke:#7a3}.ft{fill:#f4e3cf;stroke:#a63}.fs{fill:#f6e2e2;stroke:#a33}.title{font:600 13px sans-serif;fill:#222}.fam{font:700 11px sans-serif;fill:#222}.met{font:10px monospace;fill:#222}.note{font:italic 10px sans-serif;fill:#555}&lt;/style>
&lt;text x="410" y="20" text-anchor="middle" class="title">Cabina DCGM: 12 métricas en 4 familias&lt;/text>
&lt;rect x="20" y="40" width="195" height="290" class="b fc"/>
&lt;text x="117" y="60" text-anchor="middle" class="fam">COMPUTE&lt;/text>
&lt;text x="30" y="90" class="met">DCGM_FI_PROF_&lt;/text>&lt;text x="30" y="105" class="met">SM_OCCUPANCY&lt;/text>
&lt;text x="30" y="135" class="met">DCGM_FI_PROF_&lt;/text>&lt;text x="30" y="150" class="met">PIPE_TENSOR_ACTIVE&lt;/text>
&lt;text x="30" y="180" class="met">DCGM_FI_PROF_&lt;/text>&lt;text x="30" y="195" class="met">DRAM_ACTIVE&lt;/text>
&lt;text x="30" y="240" text-anchor="start" class="note">¿Compute trabaja o&lt;/text>
&lt;text x="30" y="254" text-anchor="start" class="note">espera por HBM?&lt;/text>
&lt;rect x="220" y="40" width="195" height="290" class="b fm"/>
&lt;text x="317" y="60" text-anchor="middle" class="fam">MEMORIA&lt;/text>
&lt;text x="230" y="90" class="met">DCGM_FI_DEV_&lt;/text>&lt;text x="230" y="105" class="met">FB_USED&lt;/text>
&lt;text x="230" y="135" class="met">DCGM_FI_DEV_&lt;/text>&lt;text x="230" y="150" class="met">FB_FREE&lt;/text>
&lt;text x="230" y="180" class="met">DCGM_FI_DEV_NVLINK_&lt;/text>&lt;text x="230" y="195" class="met">BANDWIDTH_TOTAL&lt;/text>
&lt;text x="230" y="240" class="note">¿Queda VRAM para&lt;/text>
&lt;text x="230" y="254" class="note">nuevas requests?&lt;/text>
&lt;rect x="420" y="40" width="195" height="290" class="b ft"/>
&lt;text x="517" y="60" text-anchor="middle" class="fam">TÉRMICO · ENERGÉTICO&lt;/text>
&lt;text x="430" y="90" class="met">DCGM_FI_DEV_&lt;/text>&lt;text x="430" y="105" class="met">GPU_TEMP&lt;/text>
&lt;text x="430" y="135" class="met">DCGM_FI_DEV_&lt;/text>&lt;text x="430" y="150" class="met">POWER_USAGE&lt;/text>
&lt;text x="430" y="180" class="met">DCGM_FI_DEV_CLOCK_&lt;/text>&lt;text x="430" y="195" class="met">THROTTLE_REASONS&lt;/text>
&lt;text x="430" y="240" class="note">¿Hardware sano o&lt;/text>
&lt;text x="430" y="254" class="note">limitando silenciosamente?&lt;/text>
&lt;rect x="620" y="40" width="180" height="290" class="b fs"/>
&lt;text x="710" y="60" text-anchor="middle" class="fam">SALUD&lt;/text>
&lt;text x="630" y="90" class="met">DCGM_FI_DEV_&lt;/text>&lt;text x="630" y="105" class="met">XID_ERRORS&lt;/text>
&lt;text x="630" y="135" class="met">DCGM_FI_DEV_&lt;/text>&lt;text x="630" y="150" class="met">ECC_DBE_VOL_TOTAL&lt;/text>
&lt;text x="630" y="180" class="met">DCGM_FI_DEV_&lt;/text>&lt;text x="630" y="195" class="met">RETIRED_DBE&lt;/text>
&lt;text x="630" y="240" class="note">¿Hay degradación&lt;/text>
&lt;text x="630" y="254" class="note">del silicio en curso?&lt;/text>
&lt;text x="410" y="350" text-anchor="middle" class="note">Cada familia responde una pregunta distinta · ninguna basta sola&lt;/text>
&lt;/svg>
&lt;/div>
&lt;h3 id="familia-1--compute">Familia 1 — Compute&lt;/h3>
&lt;p>&lt;strong>&lt;code>DCGM_FI_PROF_SM_OCCUPANCY&lt;/code>&lt;/strong> — Ratio de warps activos por SM sobre el máximo posible. Valor entre 0 y 1.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Verde&lt;/strong>: 0.30–0.70 (régimen típico LLM en decode).&lt;/li>
&lt;li>&lt;strong>Ámbar&lt;/strong>: &amp;lt; 0.20 sostenido (batch demasiado pequeño, GPU infrautilizada en paralelismo).&lt;/li>
&lt;li>&lt;strong>Rojo&lt;/strong>: 0.95 sostenido con DRAM_ACTIVE bajo (kernel patológico saturando SMs).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>&lt;code>DCGM_FI_PROF_PIPE_TENSOR_ACTIVE&lt;/code>&lt;/strong> — % de ciclos con tensor cores ejecutando. La métrica clave de &amp;ldquo;¿el compute está produciendo?&amp;rdquo;.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Verde en prefill&lt;/strong>: 50–80 %.&lt;/li>
&lt;li>&lt;strong>Verde en decode&lt;/strong>: 15–30 % (decode es memory-bound, no es síntoma de problema).&lt;/li>
&lt;li>&lt;strong>Rojo&lt;/strong>: &amp;lt; 5 % sostenido en prefill o el motor no usa los tensor cores (mala config, formato incompatible).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>&lt;code>DCGM_FI_PROF_DRAM_ACTIVE&lt;/code>&lt;/strong> — % de ciclos con HBM transfiriendo datos. Métrica clave para detectar saturación de memoria.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Verde en decode&lt;/strong>: 60–85 %.&lt;/li>
&lt;li>&lt;strong>Ámbar&lt;/strong>: &amp;gt; 90 % sostenido (HBM cuello de botella firme — explica la TPOT alta).&lt;/li>
&lt;li>&lt;strong>Rojo&lt;/strong>: &amp;gt; 95 % sostenido con KV cache pool &amp;lt; 70 % (algo está pidiendo HBM que no es el motor; investigar leaks).&lt;/li>
&lt;/ul>
&lt;h3 id="familia-2--memoria">Familia 2 — Memoria&lt;/h3>
&lt;p>&lt;strong>&lt;code>DCGM_FI_DEV_FB_USED&lt;/code>&lt;/strong> — Frame Buffer (HBM) usado en MiB.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Verde&lt;/strong>: 70–85 % del total.&lt;/li>
&lt;li>&lt;strong>Ámbar&lt;/strong>: 86–92 %.&lt;/li>
&lt;li>&lt;strong>Rojo&lt;/strong>: &amp;gt; 92 % (riesgo de OOM en el siguiente paged-attention allocation).&lt;/li>
&lt;/ul>
&lt;p>PromQL para porcentaje sobre cluster: &lt;code>100 * sum(DCGM_FI_DEV_FB_USED) / sum(DCGM_FI_DEV_FB_TOTAL)&lt;/code>.&lt;/p>
&lt;p>&lt;strong>&lt;code>DCGM_FI_DEV_FB_FREE&lt;/code>&lt;/strong> — Frame Buffer libre. Complementaria de la anterior; útil para alertas absolutas (&lt;code>&amp;lt; 4096 MiB libres&lt;/code>).&lt;/p>
&lt;p>&lt;strong>&lt;code>DCGM_FI_DEV_NVLINK_BANDWIDTH_TOTAL&lt;/code>&lt;/strong> — Bandwidth NVLink agregado en MB/s. Para topologías TP (tensor parallel) que cruzan GPUs vía NVLink, esta métrica revela si el reparto de paralelismo está saturando el bus.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Verde&lt;/strong>: variable según topología. En 4×H100 SXM con NVLink 4.0, capacidad teórica 450 GB/s por GPU. Régimen TP=4 típico: 50–150 GB/s sostenido.&lt;/li>
&lt;li>&lt;strong>Rojo&lt;/strong>: &amp;gt; 90 % capacidad sostenido (revisar si el modelo cabría con TP menor o pipeline parallel).&lt;/li>
&lt;/ul>
&lt;h3 id="familia-3--térmico-y-energético">Familia 3 — Térmico y energético&lt;/h3>
&lt;p>&lt;strong>&lt;code>DCGM_FI_DEV_GPU_TEMP&lt;/code>&lt;/strong> — Temperatura del die en °C.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Verde&lt;/strong>: &amp;lt; 75 °C.&lt;/li>
&lt;li>&lt;strong>Ámbar&lt;/strong>: 75–82 °C.&lt;/li>
&lt;li>&lt;strong>Rojo&lt;/strong>: &amp;gt; 83 °C (cerca del thermal throttle automático de H100; revisar ventilación, caudal de aire, temperatura de entrada al rack).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>&lt;code>DCGM_FI_DEV_POWER_USAGE&lt;/code>&lt;/strong> — Consumo en watts. Para H100 SXM, TDP nominal 700 W. Útil para tres cosas: detectar workload inusualmente bajo (sospechar idle o stall), facturar coste energético real, y disparar alertas si el draw se acerca al límite de la PDU.&lt;/p>
&lt;p>&lt;strong>&lt;code>DCGM_FI_DEV_CLOCK_THROTTLE_REASONS&lt;/code>&lt;/strong> — Bitmap codificado con las razones de throttle activas. Es la métrica que &lt;strong>silenciosamente explica&lt;/strong> las degradaciones de TPOT.&lt;/p>
&lt;p>Bits relevantes:&lt;/p>
&lt;ul>
&lt;li>&lt;code>0x0000000000000001&lt;/code> — Idle (no es problema).&lt;/li>
&lt;li>&lt;code>0x0000000000000002&lt;/code> — App clocks setting.&lt;/li>
&lt;li>&lt;code>0x0000000000000004&lt;/code> — SW Power Cap (límite de software, p. ej. por &lt;code>nvidia-smi -pl&lt;/code>).&lt;/li>
&lt;li>&lt;code>0x0000000000000008&lt;/code> — HW Slowdown.&lt;/li>
&lt;li>&lt;code>0x0000000000000010&lt;/code> — Sync Boost (NVIDIA Sync).&lt;/li>
&lt;li>&lt;code>0x0000000000000020&lt;/code> — SW Thermal Slowdown (límite térmico de software).&lt;/li>
&lt;li>&lt;code>0x0000000000000040&lt;/code> — HW Thermal Slowdown (límite térmico de hardware — emergencia).&lt;/li>
&lt;li>&lt;code>0x0000000000000080&lt;/code> — HW Power Brake Slowdown (caída de tensión PSU).&lt;/li>
&lt;li>&lt;code>0x0000000000000100&lt;/code> — Display Clock Setting.&lt;/li>
&lt;/ul>
&lt;p>Cualquier throttle salvo &lt;code>Idle&lt;/code> con valor &amp;gt; 0 sostenido &lt;strong>es alerta&lt;/strong>. La degradación de TPOT con &lt;code>DRAM_ACTIVE&lt;/code> ya alto y throttle térmico activo es el clásico &amp;ldquo;el rack está mal ventilado, no es problema del motor&amp;rdquo;.&lt;/p>
&lt;h3 id="familia-4--salud">Familia 4 — Salud&lt;/h3>
&lt;p>&lt;strong>&lt;code>DCGM_FI_DEV_XID_ERRORS&lt;/code>&lt;/strong> — Contador acumulado de XID errors del driver. Los XID son códigos de evento crítico que NVIDIA documenta exhaustivamente (XID 13: graphics engine exception; XID 31: GPU memory page fault; XID 43: reset channel verif error; XID 79: GPU has fallen off the bus; XID 95: uncontained ECC error; etc.). &lt;strong>Cualquier incremento es alerta inmediata&lt;/strong>: muchos XID requieren reset del nodo o RMA de la GPU.&lt;/p>
&lt;p>&lt;strong>&lt;code>DCGM_FI_DEV_ECC_DBE_VOL_TOTAL&lt;/code>&lt;/strong> — Errores ECC double-bit volátiles (no corregibles). A diferencia de los single-bit (que ECC corrige silenciosamente y se contabilizan en &lt;code>DCGM_FI_DEV_ECC_SBE_*&lt;/code>), los double-bit &lt;strong>corrompen datos&lt;/strong>. Cualquier valor &amp;gt; 0 es alerta crítica: la GPU debe ser drenada y revisada.&lt;/p>
&lt;p>&lt;strong>&lt;code>DCGM_FI_DEV_RETIRED_DBE&lt;/code>&lt;/strong> — Páginas físicas de HBM retiradas por double-bit errors acumulados. NVIDIA retira páginas defectuosas automáticamente para prevenir corrupción futura. Más de 4–8 páginas retiradas en una GPU sugiere degradación del silicio: documentar y planificar reemplazo en próxima ventana de mantenimiento.&lt;/p>
&lt;h2 id="las-cinco-métricas-del-motor-de-inferencia-vllm">Las cinco métricas del motor de inferencia (vLLM)&lt;/h2>
&lt;p>Las métricas DCGM responden &amp;ldquo;¿está sana la GPU?&amp;rdquo;. Las del motor responden &amp;ldquo;¿está el servicio cumpliendo el SLO?&amp;rdquo;. Sin ellas, sabes que el hardware funciona pero no sabes si los clientes están contentos.&lt;/p>
&lt;p>&lt;strong>&lt;code>vllm:num_requests_running&lt;/code>&lt;/strong> — Requests actualmente en el batch. Si llega al &lt;code>--max-num-seqs&lt;/code> configurado y no baja, el motor está saturado en concurrencia (revisar VRAM y rebalancear vía autoscaler — ver &lt;a href="https://blog.lo0.es/posts/autoscaling-llm-kubernetes-keda/">Autoscaling LLM en Kubernetes&lt;/a>).&lt;/p>
&lt;p>&lt;strong>&lt;code>vllm:num_requests_waiting&lt;/code>&lt;/strong> — Requests en cola, sin entrar al batch. Cualquier valor &amp;gt; 0 sostenido durante minutos indica que el cluster no escala con la carga. &lt;strong>Esta es la métrica primaria para HPA&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>&lt;code>vllm:gpu_cache_usage_perc&lt;/code>&lt;/strong> — % del KV cache pool usado.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Verde&lt;/strong>: 50–80 %.&lt;/li>
&lt;li>&lt;strong>Ámbar&lt;/strong>: 80–92 %.&lt;/li>
&lt;li>&lt;strong>Rojo&lt;/strong>: &amp;gt; 92 % (riesgo de &lt;strong>preempt-on-OOM&lt;/strong>: vLLM tirará requests para liberar memoria, lo que aumenta TTFT visiblemente).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>&lt;code>vllm:time_to_first_token_seconds&lt;/code>&lt;/strong> — Histograma de TTFT por request. Se consume como &lt;code>histogram_quantile(0.95, sum by(le)(rate(vllm:time_to_first_token_seconds_bucket[5m])))&lt;/code>. Comparado contra el SLO de TTFT P95 dispara la alerta primaria de servicio.&lt;/p>
&lt;p>&lt;strong>&lt;code>vllm:time_per_output_token_seconds&lt;/code>&lt;/strong> — Histograma de TPOT. Equivalente al anterior pero para fluidez de streaming. Comparado contra el SLO de TPOT P95 dispara la alerta secundaria.&lt;/p>
&lt;h2 id="las-seis-alertas-que-deben-pagear-en-producción">Las seis alertas que deben pagear en producción&lt;/h2>
&lt;p>Cualquier cluster productivo serio dispara estas seis alertas a un canal con rotación de guardia. Sin estas, el SLO se cumple por suerte, no por proceso.&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">groups&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">gpu-llm-critical&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">rules&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">alert&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">GpuHbmNearOom&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">expr&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">100&lt;/span>&lt;span class="w"> &lt;/span>*&lt;span class="w"> &lt;/span>&lt;span class="l">(DCGM_FI_DEV_FB_USED / DCGM_FI_DEV_FB_TOTAL) &amp;gt; 92&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">for&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">2m&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">labels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>{&lt;span class="w"> &lt;/span>&lt;span class="nt">severity&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">critical }&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">annotations&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">summary&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;HBM de {{ $labels.gpu }} en {{ $value }}% — riesgo OOM&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>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">alert&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">GpuThermalOrPowerThrottle&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">expr&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">(DCGM_FI_DEV_CLOCK_THROTTLE_REASONS != 0) and ignoring(reason) (DCGM_FI_DEV_CLOCK_THROTTLE_REASONS != 1)&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">for&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">1m&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">labels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>{&lt;span class="w"> &lt;/span>&lt;span class="nt">severity&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">warning }&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">annotations&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">summary&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;GPU {{ $labels.gpu }} en throttle (reasons={{ $value }})&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>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">alert&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">GpuXidErrorDetected&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">expr&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">increase(DCGM_FI_DEV_XID_ERRORS[5m]) &amp;gt; 0&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">labels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>{&lt;span class="w"> &lt;/span>&lt;span class="nt">severity&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">critical }&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">annotations&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">summary&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;XID error en GPU {{ $labels.gpu }} — investigar inmediatamente&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>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">alert&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">GpuEccDoubleBit&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">expr&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">DCGM_FI_DEV_ECC_DBE_VOL_TOTAL &amp;gt; 0&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">labels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>{&lt;span class="w"> &lt;/span>&lt;span class="nt">severity&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">critical }&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">annotations&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">summary&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;ECC double-bit en GPU {{ $labels.gpu }} — drenar nodo&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>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">alert&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">VllmKvCachePoolNearFull&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">expr&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">vllm:gpu_cache_usage_perc &amp;gt; 0.95&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">for&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">3m&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">labels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>{&lt;span class="w"> &lt;/span>&lt;span class="nt">severity&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">warning }&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">annotations&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">summary&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;KV cache pool &amp;gt; 95% en {{ $labels.instance }}&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>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">alert&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">VllmTtftP95OutOfSlo&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">expr&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">histogram_quantile(0.95, sum by(le, instance)(rate(vllm:time_to_first_token_seconds_bucket[5m]))) &amp;gt; 1.5&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">for&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">5m&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">labels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>{&lt;span class="w"> &lt;/span>&lt;span class="nt">severity&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">warning }&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">annotations&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">summary&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;TTFT P95 sobre SLO ({{ $value }}s &amp;gt; 1.5s)&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Estas seis cubren el 80 % de los incidentes que afectan a SLO. El 20 % restante exige investigación con tracing (ver &lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">Tracing LLM con OpenTelemetry GenAI&lt;/a>).&lt;/p>
&lt;h2 id="tabla-maestra-umbrales-y-queries">Tabla maestra: umbrales y queries&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Métrica&lt;/th>
&lt;th>Verde&lt;/th>
&lt;th>Ámbar&lt;/th>
&lt;th>Rojo&lt;/th>
&lt;th>Query base (PromQL)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>SM occupancy&lt;/td>
&lt;td>0.30–0.70&lt;/td>
&lt;td>0.15–0.30&lt;/td>
&lt;td>&amp;lt; 0.10 sostenido&lt;/td>
&lt;td>&lt;code>DCGM_FI_PROF_SM_OCCUPANCY&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Tensor active (decode)&lt;/td>
&lt;td>15–30 %&lt;/td>
&lt;td>&amp;lt; 10 %&lt;/td>
&lt;td>&amp;lt; 3 %&lt;/td>
&lt;td>&lt;code>DCGM_FI_PROF_PIPE_TENSOR_ACTIVE&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DRAM active&lt;/td>
&lt;td>60–85 %&lt;/td>
&lt;td>85–95 %&lt;/td>
&lt;td>&amp;gt; 95 % con KV bajo&lt;/td>
&lt;td>&lt;code>DCGM_FI_PROF_DRAM_ACTIVE&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>FB used&lt;/td>
&lt;td>70–85 %&lt;/td>
&lt;td>86–92 %&lt;/td>
&lt;td>&amp;gt; 92 %&lt;/td>
&lt;td>&lt;code>100 * DCGM_FI_DEV_FB_USED / DCGM_FI_DEV_FB_TOTAL&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>NVLink BW&lt;/td>
&lt;td>&amp;lt; 70 % cap&lt;/td>
&lt;td>70–90 % cap&lt;/td>
&lt;td>&amp;gt; 90 % cap&lt;/td>
&lt;td>&lt;code>DCGM_FI_DEV_NVLINK_BANDWIDTH_TOTAL&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GPU temp&lt;/td>
&lt;td>&amp;lt; 75 °C&lt;/td>
&lt;td>75–82 °C&lt;/td>
&lt;td>&amp;gt; 83 °C&lt;/td>
&lt;td>&lt;code>DCGM_FI_DEV_GPU_TEMP&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Power usage&lt;/td>
&lt;td>&amp;lt; 90% TDP&lt;/td>
&lt;td>90–98 % TDP&lt;/td>
&lt;td>&amp;gt; 98 % TDP&lt;/td>
&lt;td>&lt;code>DCGM_FI_DEV_POWER_USAGE&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Throttle reasons&lt;/td>
&lt;td>0 o Idle&lt;/td>
&lt;td>App/SW&lt;/td>
&lt;td>HW Therm/Power&lt;/td>
&lt;td>&lt;code>DCGM_FI_DEV_CLOCK_THROTTLE_REASONS&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>XID errors&lt;/td>
&lt;td>sin cambio&lt;/td>
&lt;td>—&lt;/td>
&lt;td>cualquier delta&lt;/td>
&lt;td>&lt;code>increase(DCGM_FI_DEV_XID_ERRORS[5m])&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ECC DBE&lt;/td>
&lt;td>0&lt;/td>
&lt;td>—&lt;/td>
&lt;td>&amp;gt; 0&lt;/td>
&lt;td>&lt;code>DCGM_FI_DEV_ECC_DBE_VOL_TOTAL&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Retired pages&lt;/td>
&lt;td>&amp;lt; 4&lt;/td>
&lt;td>4–8&lt;/td>
&lt;td>&amp;gt; 8&lt;/td>
&lt;td>&lt;code>DCGM_FI_DEV_RETIRED_DBE&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>KV cache used&lt;/td>
&lt;td>50–80 %&lt;/td>
&lt;td>80–92 %&lt;/td>
&lt;td>&amp;gt; 92 %&lt;/td>
&lt;td>&lt;code>vllm:gpu_cache_usage_perc&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Requests waiting&lt;/td>
&lt;td>0&lt;/td>
&lt;td>1–5 sostenido&lt;/td>
&lt;td>&amp;gt; 10 sostenido&lt;/td>
&lt;td>&lt;code>vllm:num_requests_waiting&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TTFT P95&lt;/td>
&lt;td>&amp;lt; SLO&lt;/td>
&lt;td>80–100 % SLO&lt;/td>
&lt;td>&amp;gt; SLO&lt;/td>
&lt;td>ver query alerta arriba&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TPOT P95&lt;/td>
&lt;td>&amp;lt; SLO&lt;/td>
&lt;td>80–100 % SLO&lt;/td>
&lt;td>&amp;gt; SLO&lt;/td>
&lt;td>&lt;code>histogram_quantile(0.95, sum by(le)(rate(vllm:time_per_output_token_seconds_bucket[5m])))&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="tres-pitfalls-que-confunden-al-operador-junior">Tres pitfalls que confunden al operador junior&lt;/h2>
&lt;p>&lt;strong>Pitfall 1 — &amp;ldquo;GPU-Util al 99 % = saturada&amp;rdquo;.&lt;/strong> Como se explicó al inicio: &lt;code>DCGM_FI_DEV_GPU_UTIL&lt;/code> se enciende con cualquier kernel. Lo correcto es mirar las tres &lt;code>_PROF_*&lt;/code> (SM occupancy, tensor active, DRAM active) juntas. &lt;em>GPU util 99 % + tensor active 8 % + DRAM active 92 %&lt;/em> = &amp;ldquo;saturada por memoria, no compute&amp;rdquo;; &lt;em>GPU util 99 % + tensor active 75 % + DRAM active 50 %&lt;/em> = &amp;ldquo;saturada por compute, prefill heavy&amp;rdquo;. Las dos situaciones piden palancas distintas.&lt;/p>
&lt;p>&lt;strong>Pitfall 2 — confundir ECC single-bit (SBE) con double-bit (DBE).&lt;/strong> Los single-bit se corrigen silenciosamente y son &lt;strong>inevitables&lt;/strong> en cualquier HBM bajo carga (radiación cósmica, fluctuaciones de tensión). Un contador SBE creciendo lentamente no es alerta — es física. El DBE sí: corrompe datos. Distinguir las dos métricas evita falsas alarmas y falsos negativos a partes iguales.&lt;/p>
&lt;p>&lt;strong>Pitfall 3 — alertar sobre &lt;code>num_requests_waiting &amp;gt; 0&lt;/code> sin contexto.&lt;/strong> Un valor instantáneo de 1 o 2 durante un pico es normal. Lo que importa es la cola &lt;strong>sostenida&lt;/strong>: usar &lt;code>for: 5m&lt;/code> con umbral 3–5. Sin esa ventana, el sistema satura el canal de alertas con ruido.&lt;/p>
&lt;h2 id="aplicado-a-hardware-on-premise-típico">Aplicado a hardware on-premise típico&lt;/h2>
&lt;p>Para un cluster genérico de &lt;strong>4×H100 SXM 80 GB con NVLink intra-nodo&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>DCGM Exporter desplegado vía NVIDIA GPU Operator, un DaemonSet por nodo GPU.&lt;/li>
&lt;li>Prometheus interno con retención 30 días para métricas de alta frecuencia, 1 año para downsampled (Thanos/Mimir si el volumen lo justifica).&lt;/li>
&lt;li>Grafana con tres dashboards estándar: hardware GPU (DCGM), motor (vLLM), SLO (TTFT/TPOT/RPS contra objetivos escritos).&lt;/li>
&lt;li>Alertmanager con rotación de guardia y rate-limiting por silencio agrupado por nodo.&lt;/li>
&lt;li>Cardinalidad controlada: &lt;code>gpu&lt;/code> (id local), &lt;code>node&lt;/code>, &lt;code>pod&lt;/code>, &lt;code>model&lt;/code> — no añadir &lt;code>request_id&lt;/code> ni labels de alta cardinalidad a métricas (eso es trabajo del tracing).&lt;/li>
&lt;/ul>
&lt;p>Volumen estimado para un cluster de 16 GPUs con scraping cada 15 s: ~2 millones de samples/min, ~25 GB/día de Prometheus crudo. Manejable con un Prometheus por cluster + retention; si el equipo escala a &amp;gt; 64 GPUs, considerar Thanos sidecar o VictoriaMetrics. Ver &lt;a href="https://blog.lo0.es/posts/catalogo-herramientas-oss-llmops/">Catálogo de herramientas OSS LLMOps&lt;/a> para alternativas equivalentes.&lt;/p>
&lt;h2 id="lo-que-no-hemos-cubierto-próximos-artículos">Lo que no hemos cubierto (próximos artículos)&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Tracing de cargas LLM&lt;/strong>: ya cubierto en &lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">Tracing LLM con OpenTelemetry GenAI&lt;/a>.&lt;/li>
&lt;li>&lt;strong>Autoscaling&lt;/strong> basado en estas métricas: ver &lt;a href="https://blog.lo0.es/posts/autoscaling-llm-kubernetes-keda/">Autoscaling LLM en Kubernetes&lt;/a>.&lt;/li>
&lt;li>&lt;strong>Runbooks de incident response&lt;/strong>: cómo cada una de estas alertas se traduce a acción concreta (drain, restart, RMA, escalado, rollback).&lt;/li>
&lt;li>&lt;strong>Cost accounting&lt;/strong>: usar &lt;code>DCGM_FI_DEV_POWER_USAGE&lt;/code> y &lt;code>vllm:request_success_total&lt;/code> para showback de coste por tenant.&lt;/li>
&lt;li>&lt;strong>Monitorización de fairness multi-tenant&lt;/strong>: cuando varios tenants comparten cluster, qué métricas detectan que uno está acaparando el KV cache.&lt;/li>
&lt;/ul>
&lt;h2 id="ver-también">Ver también&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">Tracing LLM con OpenTelemetry GenAI&lt;/a> — la otra mitad de la observabilidad.&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> — qué se dimensionó y, por tanto, qué umbrales son defendibles aquí.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/continuous-batching-fundamentos/">Continuous batching&lt;/a> — explica por qué &lt;code>num_requests_running&lt;/code>, &lt;code>num_requests_waiting&lt;/code> y &lt;code>gpu_cache_usage_perc&lt;/code> son las métricas operativas del motor.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/cinco-niveles-madurez-plataforma-llm-on-premise/">Cinco niveles de madurez&lt;/a> — la observabilidad LLM-aware vive en el nivel 4.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/siete-capas-stack-inferencia-llm-on-premise/">Siete capas del stack de inferencia LLM on-premise&lt;/a> — DCGM Exporter es pieza de la capa de plataforma.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/autoscaling-llm-kubernetes-keda/">Autoscaling LLM en Kubernetes&lt;/a> — usa estas métricas como input.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/anatomia-metricas-dcgm-vllm-anomalias/">Anatomía de las doce métricas DCGM y cinco vLLM&lt;/a> — profundización con analogía y anomalía documentada en producción para cada métrica, con cifras de incidentes públicos (Meta Llama 3, &lt;em>Story of Two GPUs&lt;/em>, issues vLLM, KBs Dell/Lenovo).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/runbooks-incident-response-llm-keep-kafka/">Runbooks de incident response para LLM con Keep + Kafka&lt;/a> — la traducción de cada alerta crítica a acción concreta (drain, reset, RMA, rollback) con workflow YAML, schema Kafka WORM y encaje en ISO 27035, ENS, NIS2, EU AI Act art. 73.&lt;/li>
&lt;/ul>
&lt;h2 id="referencias">Referencias&lt;/h2>
&lt;ul>
&lt;li>NVIDIA — &lt;em>DCGM Exporter&lt;/em> (repo &lt;code>nvidia/dcgm-exporter&lt;/code>, métricas y unidades documentadas).&lt;/li>
&lt;li>NVIDIA — &lt;em>DCGM Field Identifiers reference&lt;/em> (lista completa de &lt;code>DCGM_FI_*&lt;/code>).&lt;/li>
&lt;li>NVIDIA — &lt;em>XID Errors documentation&lt;/em> (catálogo de códigos XID y procedimientos de remediación).&lt;/li>
&lt;li>NVIDIA — &lt;em>NVIDIA GPU Operator&lt;/em> (Helm chart oficial).&lt;/li>
&lt;li>vLLM project — &lt;code>examples/production_monitoring/&lt;/code> (PromQL y dashboards Grafana de referencia).&lt;/li>
&lt;li>Prometheus — &lt;em>Histogram and summary best practices&lt;/em> (para construir queries de percentiles defendibles).&lt;/li>
&lt;li>NVIDIA — &lt;em>H100 Tensor Core GPU datasheet&lt;/em> (TDP, HBM bandwidth, NVLink capacities).&lt;/li>
&lt;/ul></description></item></channel></rss>