<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Power-Capping on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/power-capping/</link><description>Recent content in Power-Capping on lo0 — Blog Técnico</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Tue, 16 Jun 2026 09:00:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/tags/power-capping/index.xml" rel="self" type="application/rss+xml"/><item><title>Palancas para gastar menos vatios por token: catálogo cuantificado para inferencia LLM</title><link>https://blog.lo0.es/posts/palancas-eficiencia-energetica-inferencia/</link><pubDate>Tue, 16 Jun 2026 09:00:00 +0200</pubDate><guid>https://blog.lo0.es/posts/palancas-eficiencia-energetica-inferencia/</guid><description>&lt;blockquote>
&lt;p>Notación: importes en &lt;strong>euros (N €)&lt;/strong>, decimales con coma. No se usa el símbolo de dólar
(en este sitio es delimitador de fórmula).&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>Siete palancas independientes actúan sobre el numerador o el denominador de la identidad
(\text{J/token} = \text{potencia (W)} / \text{throughput (tok/s)}). Aplicadas en orden de
coste-beneficio: la &lt;strong>cuantización&lt;/strong> (FP16→FP8) recorta el J/token un 30–50% sin cambiar hardware;
el &lt;strong>power capping&lt;/strong> al 70% del TDP reduce la potencia un 30% con menos de un 10% de caída de
throughput en cargas memory-bound; el &lt;strong>DVFS&lt;/strong> en fase decode ahorra un 22–45% adicional; el
&lt;strong>continuous batching&lt;/strong> baja el J/token un 25–40% respecto a stacks sin optimizar; el &lt;strong>speculative
decoding&lt;/strong> recorta hasta un 29% el J/token en batch bajo; el &lt;strong>prefix caching&lt;/strong> elimina el
recompute de prefill para prompts repetidos; y el &lt;strong>scheduling a horas limpias&lt;/strong> desplaza la
huella de carbono sin cambiar el consumo físico. Referencia de partida: un stack vLLM FP16 en H100
SXM (700 W TDP) con Llama-3 70B produce ~0,39 J/token bajo cargas batch realistas; un stack
sin optimizar (PyTorch baseline) parte de 2–6× más. Las palancas se apilan; el efecto combinado
puede llegar a un 73% de reducción respecto al baseline no optimizado
(&lt;a href="https://arxiv.org/pdf/2504.17674">arXiv 2504.17674&lt;/a>).&lt;/p>
&lt;hr>
&lt;h2 id="la-identidad-de-referencia">La identidad de referencia&lt;/h2>
&lt;p>$$\text{J/token} = \frac{\overline{P}\ [\text{W}]}{\text{throughput}\ [\text{tok/s}]}$$&lt;/p>
&lt;p>donde (\overline{P}) es la potencia media sobre la ventana de medición (ver metodología en
&lt;a href="https://blog.lo0.es/posts/energia-por-token-metodologia/">energía por token&lt;/a>). Las palancas actúan sobre uno
de los dos factores:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Reducen (\overline{P})&lt;/strong>: power capping, DVFS, scheduling a horas de baja intensidad.&lt;/li>
&lt;li>&lt;strong>Aumentan throughput&lt;/strong> (denominador): cuantización, continuous batching, speculative decoding,
prefix caching, chunked prefill, selección de modelo.&lt;/li>
&lt;li>&lt;strong>Ambos a la vez&lt;/strong>: cuantización (menor footprint de pesos → mayor batch cabe en VRAM → mayor
throughput a potencia similar o menor).&lt;/li>
&lt;/ul>
&lt;p>La fórmula expandida incluyendo el overhead de infraestructura:&lt;/p>
&lt;p>$$\text{J/token}&lt;em>{\text{efectivo}} = \frac{\overline{P}&lt;/em>{\text{GPU}} + \overline{P}&lt;em>{\text{resto nodo}}}{\text{throughput}&lt;/em>{\text{tok/s}}} \times \text{PUE}$$&lt;/p>
&lt;p>Para los cálculos de palancas se trabaja sobre (\overline{P}_{\text{GPU}}) por claridad; el
factor PUE (ver &lt;a href="https://blog.lo0.es/posts/energia-por-token-metodologia/">energía por token&lt;/a>) amplifica o
atenúa el efecto de cada palanca de forma proporcional.&lt;/p>
&lt;hr>
&lt;h2 id="tabla-maestra-palancas--impacto--coste--herramienta">Tabla maestra: palancas × impacto × coste × herramienta&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Palanca&lt;/th>
&lt;th>Reducción J/token (%)&lt;/th>
&lt;th>Efecto en latencia&lt;/th>
&lt;th>Efecto en calidad&lt;/th>
&lt;th>Herramienta OSS principal&lt;/th>
&lt;th>Fuente&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Cuantización FP16→FP8&lt;/td>
&lt;td>&lt;strong>30–50%&lt;/strong>&lt;/td>
&lt;td>−8–33% TPOT (mejora)&lt;/td>
&lt;td>degradación &amp;lt;1% en benchmarks&lt;/td>
&lt;td>vLLM, TRT-LLM, llm-compressor&lt;/td>
&lt;td>arXiv 2504.17674, baseten.co&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cuantización FP16→INT4 (AWQ/GPTQ)&lt;/td>
&lt;td>&lt;strong>45–60%&lt;/strong>&lt;/td>
&lt;td>mejora latencia (menor BW)&lt;/td>
&lt;td>degradación 1–3% según modelo&lt;/td>
&lt;td>AutoAWQ, llm-compressor, vLLM&lt;/td>
&lt;td>arXiv 2504.17674&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Continuous batching vs estático&lt;/td>
&lt;td>&lt;strong>25–40%&lt;/strong> vs PyTorch&lt;/td>
&lt;td>+5× throughput (mejora)&lt;/td>
&lt;td>sin impacto&lt;/td>
&lt;td>vLLM, TGI, TRT-LLM&lt;/td>
&lt;td>arXiv 2504.17674, TokenPowerBench&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Power capping 70% TDP&lt;/td>
&lt;td>&lt;strong>20–30%&lt;/strong> potencia&lt;/td>
&lt;td>&amp;lt;10% throughput (decode)&lt;/td>
&lt;td>sin impacto&lt;/td>
&lt;td>nvidia-smi, DCGM, Zeus&lt;/td>
&lt;td>arXiv 2604.11391, NERSC docs&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DVFS decode-phase&lt;/td>
&lt;td>&lt;strong>22–45%&lt;/strong> en decode&lt;/td>
&lt;td>1–6% latencia total&lt;/td>
&lt;td>sin impacto&lt;/td>
&lt;td>nvidia-smi, GreenLLM, DVFS-GPT&lt;/td>
&lt;td>arXiv 2501.08219, HAL 05190051&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Speculative decoding&lt;/td>
&lt;td>&lt;strong>hasta 29%&lt;/strong> (batch≤16)&lt;/td>
&lt;td>TTFT mejora&lt;/td>
&lt;td>sin impacto demostrable&lt;/td>
&lt;td>vLLM, TRT-LLM&lt;/td>
&lt;td>arXiv 2602.09113&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Prefix caching&lt;/td>
&lt;td>&lt;strong>50–90%&lt;/strong> en prefill reusable&lt;/td>
&lt;td>TTFT −50–80% (prompts repetidos)&lt;/td>
&lt;td>sin impacto&lt;/td>
&lt;td>vLLM, SGLang&lt;/td>
&lt;td>vLLM docs&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Chunked prefill&lt;/td>
&lt;td>~10–15% en cargas mixtas&lt;/td>
&lt;td>TTFT más estable&lt;/td>
&lt;td>sin impacto&lt;/td>
&lt;td>vLLM (SARATHI)&lt;/td>
&lt;td>arXiv 2308.16369&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Selección SLM vs LLM denso&lt;/td>
&lt;td>&lt;strong>60–80%&lt;/strong> (modelo 7B vs 70B)&lt;/td>
&lt;td>latencia baja&lt;/td>
&lt;td>degradación variable por tarea&lt;/td>
&lt;td>Ollama, vLLM, llama.cpp&lt;/td>
&lt;td>arXiv 2504.17674&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Scheduling a horas limpias&lt;/td>
&lt;td>0% J/token, hasta −70% CO₂&lt;/td>
&lt;td>sin impacto en la carga&lt;/td>
&lt;td>sin impacto&lt;/td>
&lt;td>Kueue, Volcano, cron&lt;/td>
&lt;td>ACM SLIT, arXiv 2507.09942&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>Nota: los porcentajes son sobre el J/token efectivo de la carga, no sobre la potencia de placa
en vacío. Los efectos se miden siempre en condiciones de igual calidad de salida (mismo modelo,
mismo serving stack, misma distribución de prompts).&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="palanca-1-cuantización">Palanca 1: cuantización&lt;/h2>
&lt;h3 id="mecánica">Mecánica&lt;/h3>
&lt;p>La cuantización reduce la precisión numérica de los pesos (y opcionalmente las activaciones),
lo que acorta el tiempo de lectura de pesos desde HBM por token generado. El decode es
memory-bandwidth-bound: el cuello es leer los pesos, no computar. Reducir la anchura de bits
libera ancho de banda para mayor throughput o permite meter más batch en VRAM.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Formato&lt;/th>
&lt;th>Bits/peso&lt;/th>
&lt;th>Reducción BW vs FP32&lt;/th>
&lt;th>J/token vs FP16&lt;/th>
&lt;th>Herramienta&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>FP32&lt;/td>
&lt;td>32&lt;/td>
&lt;td>1× (referencia)&lt;/td>
&lt;td>+100% (peor)&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>BF16/FP16&lt;/td>
&lt;td>16&lt;/td>
&lt;td>2×&lt;/td>
&lt;td>referencia&lt;/td>
&lt;td>vLLM nativo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>FP8 (W8A8)&lt;/td>
&lt;td>8&lt;/td>
&lt;td>~4×&lt;/td>
&lt;td>&lt;strong>−30–50%&lt;/strong>&lt;/td>
&lt;td>vLLM, TRT-LLM, llm-compressor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>INT4 AWQ (W4A16)&lt;/td>
&lt;td>4&lt;/td>
&lt;td>~8×&lt;/td>
&lt;td>&lt;strong>−45–60%&lt;/strong>&lt;/td>
&lt;td>AutoAWQ, llm-compressor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>INT4 GPTQ (W4A16)&lt;/td>
&lt;td>4&lt;/td>
&lt;td>~8×&lt;/td>
&lt;td>&lt;strong>−40–55%&lt;/strong>&lt;/td>
&lt;td>AutoGPTQ, vLLM&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Datos concretos de referencia:&lt;/p>
&lt;ul>
&lt;li>Llama-3 405B en H100, FP16→FP8: −30% J/token medido; TPOT mejora un 33% (Baseten,
&lt;a href="https://www.baseten.co/blog/33-faster-llm-inference-with-fp8-quantization/">baseten.co/blog/33-faster-llm-inference-with-fp8-quantization&lt;/a>).&lt;/li>
&lt;li>El stack vLLM+CUDA graphs vs PyTorch baseline: 2–6× más eficiente en J/token
(&lt;a href="https://arxiv.org/pdf/2504.17674">arXiv 2504.17674&lt;/a>).&lt;/li>
&lt;li>Llama-65B en V100 FP16: 3–4 J/token. Llama-3 70B en H100 FP8: 0,39 J/token. Reducción
combinada hardware+cuantización: ~90%
(&lt;a href="https://mlcommons.org/2025/09/mlperf-inference-v5-1-results/">MLCommons, arXiv 2504.17674&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="coste-de-calidad">Coste de calidad&lt;/h3>
&lt;p>La cuantización FP8 con calibración produce degradación &amp;lt;1% en benchmarks estándar (MMLU,
HumanEval). INT4 AWQ puede producir 1–3% de degradación dependiendo del modelo y la tarea;
INT4 GPTQ sin calibración fina, hasta 2–5%. Se valida con &lt;a href="https://blog.lo0.es/posts/leaderboards-energia-llm/">leaderboards de energía&lt;/a> y benchmarks de calidad propios.&lt;/p>
&lt;h3 id="herramientas-oss">Herramientas OSS&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># vLLM con FP8 (cuantización en tiempo de carga, H100/A100)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vllm serve meta-llama/Llama-3-70B-Instruct &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --quantization fp8 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --dtype auto
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># llm-compressor: cuantización offline a W4A16 (AWQ)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python -m llmcompressor.transformers.compression.helpers &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --model meta-llama/Llama-3-70B-Instruct &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --recipe w4a16_awq.yaml &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --output-dir llama-70b-w4a16/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="palanca-2-continuous-batching">Palanca 2: continuous batching&lt;/h2>
&lt;h3 id="mecánica-1">Mecánica&lt;/h3>
&lt;p>El batching estático mantiene el batch fijo: si una petición termina antes, el slot queda
vacío hasta el final del batch. El &lt;strong>continuous batching&lt;/strong> inserta nuevas peticiones en
cuanto un slot libera, manteniendo la GPU siempre al máximo de utilización posible.&lt;/p>
&lt;p>El efecto energético: la potencia GPU es casi constante (la GPU está siempre activa); el
throughput crece. El resultado es un denominador mayor a potencia similar:&lt;/p>
&lt;p>$$\text{J/token}&lt;em>{\text{batch continuo}} = \frac{\overline{P}}{\text{throughput}&lt;/em>{\uparrow}}$$&lt;/p>
&lt;p>Datos medidos (&lt;a href="https://arxiv.org/pdf/2504.17674">arXiv 2504.17674&lt;/a>,
&lt;a href="https://arxiv.org/pdf/2512.03024">TokenPowerBench arXiv 2512.03024&lt;/a>):&lt;/p>
&lt;ul>
&lt;li>vLLM con PagedAttention vs Transformers sin optimizar: −25–40% J/token en cargas
batch altas.&lt;/li>
&lt;li>Continuous batching online vs static offline: −5% adicional de J/token (pequeño pero
consistente).&lt;/li>
&lt;li>Batch 32→256 tokens: −25% J/token en Llama-3 70B (economías de escala de kernel).&lt;/li>
&lt;li>Throughput: ×5 respecto a stacks de batching estático a carga equivalente.&lt;/li>
&lt;/ul>
&lt;p>El knee de eficiencia en H100 se sitúa en torno a 256–512 tokens de batch; más allá,
el J/token se estabiliza o sube ligeramente.&lt;/p>
&lt;h3 id="herramientas-oss-1">Herramientas OSS&lt;/h3>
&lt;p>vLLM, TGI (Text Generation Inference de HuggingFace), TRT-LLM. El flag relevante en vLLM:
&lt;code>--max-num-seqs&lt;/code> (máximo de secuencias concurrentes); ajustarlo al tamaño de VRAM disponible
maximiza el batch efectivo.&lt;/p>
&lt;hr>
&lt;h2 id="palanca-3-power-capping">Palanca 3: power capping&lt;/h2>
&lt;h3 id="mecánica-2">Mecánica&lt;/h3>
&lt;p>El power cap fija un techo de potencia instantánea (W). La GPU lo respeta recortando el
clock (DVFS interno). El truco de eficiencia: LLM decode es &lt;strong>memory-bandwidth-bound&lt;/strong>; la
GPU ya no está a full clock útil, y bajar el TDP reduce la potencia sin degradar el
throughput de forma proporcional.&lt;/p>
&lt;h3 id="la-curva-power-cap-vs-throughput-h100-sxm">La curva power cap vs throughput (H100 SXM)&lt;/h3>
&lt;p>Datos de (&lt;a href="https://arxiv.org/html/2604.11391v1">arXiv 2604.11391&lt;/a>) y NERSC
(&lt;a href="https://docs.nersc.gov/jobs/power-capping/">docs.nersc.gov/jobs/power-capping&lt;/a>):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Power cap (W)&lt;/th>
&lt;th>% del TDP (700 W)&lt;/th>
&lt;th>Throughput relativo (memory-bound)&lt;/th>
&lt;th>Eficiencia (tok/W)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>700 W&lt;/td>
&lt;td>100%&lt;/td>
&lt;td>100%&lt;/td>
&lt;td>1,00×&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>560 W&lt;/td>
&lt;td>80%&lt;/td>
&lt;td>~95%&lt;/td>
&lt;td>~1,19×&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>490 W&lt;/strong>&lt;/td>
&lt;td>&lt;strong>70%&lt;/strong>&lt;/td>
&lt;td>&lt;strong>~90–95%&lt;/strong>&lt;/td>
&lt;td>&lt;strong>~1,27×&lt;/strong> (sweet spot)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>420 W&lt;/td>
&lt;td>60%&lt;/td>
&lt;td>~80–85%&lt;/td>
&lt;td>~1,33× (latencia sube)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>350 W&lt;/td>
&lt;td>50%&lt;/td>
&lt;td>~75% (H100 alcanza BW máximo a 350 W memory-bound)&lt;/td>
&lt;td>~1,50×&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>200 W&lt;/td>
&lt;td>29%&lt;/td>
&lt;td>~50%&lt;/td>
&lt;td>saturación de frecuencia&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Hallazgo clave de &lt;a href="https://arxiv.org/html/2604.11391v1">arXiv 2604.11391&lt;/a>: &lt;strong>el H100 alcanza
su máximo ancho de banda de memoria efectivo con solo ~350 W&lt;/strong> en cargas memory-bound
(STriad benchmark), frente a 700 W de TDP. Bajar de 700 W a 490 W (−30% potencia) produce
menos de un 10% de caída de throughput en decode: el J/token mejora un ~20–27%.&lt;/p>
&lt;p>Para cargas compute-bound (prefill pesado), el sweet spot se desplaza a 400–500 W, donde el
rendimiento escala de forma casi lineal con el cap; de 500 W a 700 W, la ganancia es solo
~10% de throughput adicional por cada 100 W más.&lt;/p>
&lt;h3 id="fórmula-de-jtoken-con-power-cap">Fórmula de J/token con power cap&lt;/h3>
&lt;p>$$\text{J/token}(P_{\text{cap}}) = \frac{P_{\text{cap}} \times \eta(P_{\text{cap}})}{\text{throughput}&lt;em>{\text{base}} \times f(P&lt;/em>{\text{cap}})}$$&lt;/p>
&lt;p>donde (\eta(P_{\text{cap}})) es la fracción de potencia efectivamente consumida bajo el
cap (en cargas memory-bound, la GPU ya no consume todo el cap), y (f(P_{\text{cap}})) es
la fracción de throughput resultante. En la zona 490–560 W del H100,
(\eta \approx 0{,}9) y (f \approx 0{,}92\text{–}0{,}95): el numerador baja más que el
denominador, por lo que el J/token mejora.&lt;/p>
&lt;h3 id="comandos">Comandos&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Fijar el power cap a 490 W en la GPU 0 (H100 SXM, TDP 700 W)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo nvidia-smi -i &lt;span class="m">0&lt;/span> -pl &lt;span class="m">490&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Verificar el límite aplicado y la potencia en tiempo real&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nvidia-smi --query-gpu&lt;span class="o">=&lt;/span>power.limit,power.draw --format&lt;span class="o">=&lt;/span>csv -l &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Con DCGM: leer DCGM_FI_DEV_POWER_USAGE en Prometheus&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># y DCGM_FI_DEV_POWER_LIMIT para confirmar que el cap está activo&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Aplicar el cap a todas las GPUs del nodo (script de systemd/cron)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> i in &lt;span class="k">$(&lt;/span>seq &lt;span class="m">0&lt;/span> 3&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> sudo nvidia-smi -i &lt;span class="nv">$i&lt;/span> -pl &lt;span class="m">490&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Con DCGM en producción, el cap se puede establecer vía
&lt;code>dcgmi policy --set powercap:490&lt;/code> o mediante el GPU Operator de NVIDIA (campo
&lt;code>powerLimit&lt;/code> en el DevicePlugin). Zeus (&lt;a href="https://ml.energy/zeus/">ml.energy/zeus&lt;/a>)
permite sweepear caps automáticamente y medir el J/token resultante por configuración.&lt;/p>
&lt;hr>
&lt;h2 id="palanca-4-dvfs-dynamic-voltage-and-frequency-scaling">Palanca 4: DVFS (Dynamic Voltage and Frequency Scaling)&lt;/h2>
&lt;h3 id="mecánica-3">Mecánica&lt;/h3>
&lt;p>DVFS es más fino que el power cap: permite ajustar la frecuencia del SM directamente
(&lt;code>nvidia-smi -lgc&lt;/code> para lock GPU clock) o dejar que el driver la ajuste dinámicamente
según la potencia disponible y la carga. En LLM inference, la asimetría entre fases
es el dato clave:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Prefill&lt;/strong>: compute-bound. Beneficia de clock máximo. Sensible a reducción de frecuencia.&lt;/li>
&lt;li>&lt;strong>Decode&lt;/strong>: memory-bandwidth-bound. El clock del SM apenas importa; lo que manda es el
ancho de banda HBM.&lt;/li>
&lt;/ul>
&lt;p>Esta asimetría es la que explotan los sistemas de DVFS específicos para LLM:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Sistema&lt;/th>
&lt;th>Ahorro energético&lt;/th>
&lt;th>Penalidad latencia&lt;/th>
&lt;th>Hardware&lt;/th>
&lt;th>Fuente&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>DVFS-GPT (HAL)&lt;/td>
&lt;td>hasta &lt;strong>32%&lt;/strong> en iso-latencia&lt;/td>
&lt;td>~1–2%&lt;/td>
&lt;td>A100, RTX 4090&lt;/td>
&lt;td>HAL 05190051&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>EcoInfer&lt;/td>
&lt;td>hasta &lt;strong>25,4%&lt;/strong> (media 21,5%)&lt;/td>
&lt;td>&amp;lt;5%&lt;/td>
&lt;td>A100&lt;/td>
&lt;td>arXiv MDPI Electronics&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DualScale (prefill/decode disaggregado)&lt;/td>
&lt;td>&lt;strong>22–45%&lt;/strong> con SLO&lt;/td>
&lt;td>1–6%&lt;/td>
&lt;td>H100&lt;/td>
&lt;td>arXiv 2602.18755&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GreenLLM (SLO-aware DVFS)&lt;/td>
&lt;td>&lt;strong>18–30%&lt;/strong>&lt;/td>
&lt;td>dentro del SLO&lt;/td>
&lt;td>—&lt;/td>
&lt;td>arXiv 2508.16449&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>El paper &lt;a href="https://arxiv.org/abs/2501.08219">arXiv 2501.08219&lt;/a> mide que reducir la
frecuencia de GPU de 2.842 MHz a 180 MHz logra un ahorro medio del 42% con solo 1–6% de
aumento de latencia en la fase decode — porque el decode es memory-bound y la frecuencia
del SM no es el cuello.&lt;/p>
&lt;h3 id="comandos-dvfs-manual">Comandos (DVFS manual)&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Bloquear el clock del SM a 1.200 MHz (H100 boost: 1.980 MHz) para decode&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo nvidia-smi -i &lt;span class="m">0&lt;/span> -lgc 1200,1200
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Restaurar el clock dinámico&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo nvidia-smi -i &lt;span class="m">0&lt;/span> -rgc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Modo persistente (necesario para que el lock sobreviva entre trabajos)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo nvidia-smi -pm &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Para DVFS automático ajustado al SLO (TPOT objetivo), los sistemas como GreenLLM o
DVFS-GPT miden el tiempo de cada iteración y ajustan la frecuencia en tiempo real, sin
sobrespasar el presupuesto de latencia.&lt;/p>
&lt;hr>
&lt;h2 id="palanca-5-selección-de-modelo-slm-moe-vs-denso">Palanca 5: selección de modelo (SLM, MoE vs denso)&lt;/h2>
&lt;h3 id="el-efecto-de-la-escala">El efecto de la escala&lt;/h3>
&lt;p>El J/token escala con el tamaño del modelo, pero de forma sublineal. Para Llama-3
(&lt;a href="https://arxiv.org/pdf/2504.17674">arXiv 2504.17674&lt;/a>):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Modelo&lt;/th>
&lt;th>Parámetros&lt;/th>
&lt;th>J/token relativo&lt;/th>
&lt;th>Factor vs 1B&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Llama-3 1B&lt;/td>
&lt;td>1B&lt;/td>
&lt;td>1,0×&lt;/td>
&lt;td>referencia&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Llama-3 8B&lt;/td>
&lt;td>8B&lt;/td>
&lt;td>~2,3×&lt;/td>
&lt;td>×2,3 (no ×8)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Llama-3 70B&lt;/td>
&lt;td>70B&lt;/td>
&lt;td>~7,3×&lt;/td>
&lt;td>×7,3 (no ×70)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Llama-3 405B&lt;/td>
&lt;td>405B&lt;/td>
&lt;td>~40×&lt;/td>
&lt;td>×40 (no ×405)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>El J/token crece ~7,3× de 1B a 70B, mientras que los parámetros crecen ×70: la
eficiencia de hardware (caches, tensor parallelism, kernels) amortigua la escala.
Aun así, pasar de 70B a 8B recorta el J/token un ~68% si la calidad es suficiente para
la tarea.&lt;/p>
&lt;h3 id="moe-vs-denso">MoE vs denso&lt;/h3>
&lt;p>Los MoE activan solo un subconjunto de expertos por token (típicamente 2 de 8–64), lo que
reduce el cómputo activo. Pero hay una trampa de implementación:&lt;/p>
&lt;ul>
&lt;li>OLMoE-1B-7B (MoE, 1B activos) vs OLMo-1B (denso): el MoE consume un &lt;strong>54,24% más&lt;/strong>
de energía por token que el modelo denso de igual tamaño activo
(&lt;a href="https://arxiv.org/pdf/2504.17674">arXiv 2504.17674&lt;/a>), porque los kernels fusionados
de los expertos son ~19–63% más lentos que una GEMM densa equivalente.&lt;/li>
&lt;li>OLMoE-1B-7B vs OLMo-7B (denso): el MoE sí es más eficiente (7B activos → solo 1B
activos, ~7× reducción de FLOPs activos por token).&lt;/li>
&lt;/ul>
&lt;p>La regla: MoE es eficiente cuando la comparación es &lt;strong>parámetros totales iguales, activos
menores&lt;/strong> (p.ej. Mixtral 8×7B vs Llama-3 70B denso). No es eficiente cuando la comparación
es &lt;strong>parámetros activos iguales&lt;/strong> por token.&lt;/p>
&lt;h3 id="tabla-de-selección-de-modelo-por-caso-de-uso">Tabla de selección de modelo por caso de uso&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Caso de uso&lt;/th>
&lt;th>Modelo recomendado&lt;/th>
&lt;th>Razón de eficiencia&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Chat simple, extracción de entidades&lt;/td>
&lt;td>SLM 7–8B FP8&lt;/td>
&lt;td>−68% J/token vs 70B&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RAG con contextos largos&lt;/td>
&lt;td>70B FP8 o MoE 8×7B&lt;/td>
&lt;td>calidad/J óptimo en K&amp;gt;2K tokens&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Código complejo, razonamiento&lt;/td>
&lt;td>70B FP8 o 405B INT4&lt;/td>
&lt;td>calidad no negociable&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Clasificación, embeddings&lt;/td>
&lt;td>modelo dedicado (ej. E5, BGE)&lt;/td>
&lt;td>órdenes de magnitud menos J&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Batch diferible offline&lt;/td>
&lt;td>MoE grande (DeepSeek, Mixtral)&lt;/td>
&lt;td>alta calidad, throughput batch&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="palanca-6-speculative-decoding">Palanca 6: speculative decoding&lt;/h2>
&lt;h3 id="mecánica-4">Mecánica&lt;/h3>
&lt;p>El speculative decoding usa un modelo borrador pequeño (&lt;em>draft model&lt;/em>) para proponer varios
tokens, que el modelo objetivo verifica en paralelo en un solo forward pass. Si los tokens
son aceptados, se generan K tokens por paso en lugar de 1: throughput potencialmente K×.&lt;/p>
&lt;h3 id="condición-de-eficiencia-energética">Condición de eficiencia energética&lt;/h3>
&lt;p>El beneficio en J/token &lt;strong>depende del batch size&lt;/strong> (&lt;a href="https://arxiv.org/pdf/2602.09113">arXiv 2602.09113&lt;/a>):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Batch size&lt;/th>
&lt;th>Efecto en J/token&lt;/th>
&lt;th>Razón&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1–16 (batch bajo)&lt;/td>
&lt;td>&lt;strong>−hasta 29%&lt;/strong>&lt;/td>
&lt;td>el draft model llena el tiempo de espera; verificación es barata&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>32–64 (batch medio)&lt;/td>
&lt;td>~0% (neutro)&lt;/td>
&lt;td>el overhead de verificación compensa el ganado&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>128+ (batch alto)&lt;/td>
&lt;td>&lt;strong>+25%&lt;/strong> (peor)&lt;/td>
&lt;td>GPU saturada; el draft model añade overhead sin ahorrar&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Conclusión: speculative decoding es una palanca de J/token solo en &lt;strong>régimen de baja latencia
(batch≤16)&lt;/strong>; en high-throughput serving, es contraproducente en términos de J/token
(aunque reduce latencia TPOT).&lt;/p>
&lt;h3 id="herramientas-oss-2">Herramientas OSS&lt;/h3>
&lt;p>vLLM soporta speculative decoding con &lt;code>--speculative-model&lt;/code> y &lt;code>--num-speculative-tokens&lt;/code>.
TRT-LLM también. El draft model debe ser de la misma familia (p.ej. Llama-3 8B para
draft de Llama-3 70B).&lt;/p>
&lt;hr>
&lt;h2 id="palanca-7-prefix-caching-y-chunked-prefill">Palanca 7: prefix caching y chunked prefill&lt;/h2>
&lt;h3 id="prefix-caching">Prefix caching&lt;/h3>
&lt;p>El KV-cache del prefill de un prompt compartido (system prompt, few-shot examples, contexto
de documento) es idéntico entre peticiones. Almacenarlo y reutilizarlo elimina el recompute
del prefill para esa fracción del prompt.&lt;/p>
&lt;p>Impacto en energía: el prefill es compute-bound y tira picos de potencia. Eliminar el
prefill repetido elimina esos picos. En escenarios con system prompt fijo de 1.000 tokens
y prompts de usuario de 200 tokens, el ahorro es ~1.000/(1.000+200) = &lt;strong>~83% de la energía
de prefill&lt;/strong>. En J/token total, el efecto depende de la longitud del prompt compartido vs
la longitud de generación.&lt;/p>
&lt;p>Habilitación en vLLM:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">vllm serve meta-llama/Llama-3-70B-Instruct &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --enable-prefix-caching &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --max-num-seqs &lt;span class="m">256&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="chunked-prefill-sarathi">Chunked prefill (SARATHI)&lt;/h3>
&lt;p>El chunked prefill parte el prefill en chunks de tamaño fijo y procesa cada chunk junto con
tokens de decode de otras peticiones. El beneficio: el prefill de un prompt largo ya no
bloquea el decode de otras peticiones (reducing TPOT spikes), lo que permite mayor
utilización de la GPU en el tiempo.&lt;/p>
&lt;p>En términos de J/token total, el chunked prefill reduce la potencia de pico del nodo
(menos spikes de prefill) y mejora la utilización media, lo que se traduce en ~10–15% menos
de J/token en cargas mixtas con prompts largos (&lt;a href="https://arxiv.org/pdf/2308.16369">arXiv 2308.16369&lt;/a>).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Activar chunked prefill en vLLM (tamaño de chunk: 512 tokens)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vllm serve meta-llama/Llama-3-70B-Instruct &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --enable-chunked-prefill &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --max-num-batched-tokens &lt;span class="m">512&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="palanca-8-scheduling-a-horas-limpias">Palanca 8: scheduling a horas limpias&lt;/h2>
&lt;p>Esta palanca no reduce el J/token físico, pero sí el &lt;strong>gCO₂/token&lt;/strong> de la carga diferible.
La mecánica: mover entrenamiento, ingestión de documentos, re-ranking batch y fine-tuning
a las horas de menor intensidad de carbono de la red.&lt;/p>
&lt;p>Datos de impacto de temporal shifting (&lt;a href="https://arxiv.org/pdf/2507.09942">ACM SLIT, arXiv 2507.09942&lt;/a>):&lt;/p>
&lt;ul>
&lt;li>Reducción de CO₂ por temporal shifting: &lt;strong>hasta 34,7%&lt;/strong> para cargas flexibles.&lt;/li>
&lt;li>Con carbon-aware reinforcement learning (Eco-Orchestrator): hasta &lt;strong>70% de offset&lt;/strong> en
despliegues integrados.&lt;/li>
&lt;li>En España, la variación horaria de intensidad es ~80–250 gCO₂/kWh: un factor ~3× en el
mismo día (ver &lt;a href="https://blog.lo0.es/posts/del-vatio-al-carbono-pue-grid/">del vatio al carbono&lt;/a>).&lt;/li>
&lt;/ul>
&lt;p>La implementación práctica usa Kueue o Volcano en Kubernetes, con una métrica de intensidad
de red (ElectricityMaps API o esios) como señal de scheduling. Las cargas se marcan con una
anotación &lt;code>carbon-deadline&lt;/code> (tiempo máximo de espera tolerable) y el scheduler las coloca
en las horas de mínima intensidad dentro de esa ventana.&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="c"># Anotación Kueue para scheduling consciente de carbono&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">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">kueue.x-k8s.io/carbon-aware&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;true&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">kueue.x-k8s.io/carbon-deadline&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;8h&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="la-curva-power-cap-vs-throughput-el-sweet-spot">La curva power cap vs throughput: el sweet spot&lt;/h2>
&lt;div class="diagram" style="max-width:720px;margin:1rem auto;">
&lt;svg viewBox="0 0 720 320" role="img" aria-label="Curva power cap vs throughput en H100 SXM: el sweet spot de eficiencia (J/token mínimo) se sitúa entre 490 y 560 W, donde la reducción de potencia supera la caída de throughput" xmlns="http://www.w3.org/2000/svg">
&lt;style>.ax{fill:none;stroke:currentColor;stroke-width:1}.ln{fill:none;stroke:currentColor;stroke-width:1.8}.ln2{fill:none;stroke:currentColor;stroke-width:1.8;stroke-dasharray:6 3}.tl{font:600 12px sans-serif;fill:currentColor}.ts{font:11px sans-serif;fill:currentColor}.dot{fill:currentColor}&lt;/style>
&lt;defs>&lt;marker id="arr" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto">&lt;path d="M0,0 L10,5 L0,10 z" fill="currentColor"/>&lt;/marker>&lt;/defs>
&lt;line class="ax" x1="60" y1="30" x2="60" y2="240" marker-end="url(#arr)"/>
&lt;line class="ax" x1="60" y1="240" x2="660" y2="240" marker-end="url(#arr)"/>
&lt;text x="62" y="22" class="ts">%&lt;/text>
&lt;text x="330" y="268" class="ts">Power cap (W) →&lt;/text>
&lt;text x="10" y="80" class="ts" transform="rotate(-90 10 140)">%&lt;/text>
&lt;text x="62" y="245" class="ts">200&lt;/text>
&lt;text x="152" y="245" class="ts">280&lt;/text>
&lt;text x="242" y="245" class="ts">350&lt;/text>
&lt;text x="332" y="245" class="ts">420&lt;/text>
&lt;text x="412" y="245" class="ts">490&lt;/text>
&lt;text x="492" y="245" class="ts">560&lt;/text>
&lt;text x="572" y="245" class="ts">630&lt;/text>
&lt;text x="642" y="245" class="ts">700&lt;/text>
&lt;text x="64" y="235" class="ts">0&lt;/text>
&lt;text x="54" y="195" class="ts">50&lt;/text>
&lt;text x="54" y="155" class="ts">70&lt;/text>
&lt;text x="54" y="115" class="ts">80&lt;/text>
&lt;text x="54" y="75" class="ts">90&lt;/text>
&lt;text x="44" y="45" class="ts">100&lt;/text>
&lt;line class="ax" x1="58" y1="40" x2="62" y2="40"/>
&lt;line class="ax" x1="58" y1="75" x2="62" y2="75"/>
&lt;line class="ax" x1="58" y1="115" x2="62" y2="115"/>
&lt;line class="ax" x1="58" y1="155" x2="62" y2="155"/>
&lt;line class="ax" x1="58" y1="195" x2="62" y2="195"/>
&lt;path class="ln" d="M90,195 L180,160 L240,130 L330,115 L420,95 L500,75 L590,55 L650,40"/>
&lt;path class="ln2" d="M90,160 L180,140 L240,128 L330,118 L420,108 L500,98 L590,92 L650,90"/>
&lt;text x="580" y="48" class="ts">potencia (% TDP)&lt;/text>
&lt;text x="560" y="104" class="ts">throughput (%)&lt;/text>
&lt;circle class="dot" cx="420" cy="95" r="5"/>
&lt;circle class="dot" cx="500" cy="75" r="5"/>
&lt;line class="ax" x1="420" y1="95" x2="420" y2="240" stroke-dasharray="3 3"/>
&lt;line class="ax" x1="500" y1="75" x2="500" y2="240" stroke-dasharray="3 3"/>
&lt;text x="380" y="88" class="tl">sweet spot&lt;/text>
&lt;text x="362" y="280" class="ts">490–560 W: −30% potencia, &amp;lt;10% throughput. J/token mínimo.&lt;/text>
&lt;text x="62" y="305" class="ts">H100 SXM (700 W TDP). Carga memory-bound (decode LLM). Fuente: arXiv 2604.11391, NERSC.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>La lectura del gráfico: la curva de potencia (línea continua) cae más rápido que la curva
de throughput (línea discontinua) en la zona 490–560 W. Por encima de 560 W, cada 70 W
adicionales dan solo un ~5% de throughput extra; por debajo de 420 W, el throughput empieza
a caer más rápido que la potencia. El &lt;strong>sweet spot de eficiencia&lt;/strong> (J/token mínimo) está
en 490–560 W para cargas decode-bound.&lt;/p>
&lt;p>Para cargas compute-bound (prefill puro), el sweet spot se desplaza a 500–600 W: el prefill
satura el cómputo de los SM y necesita más potencia para mantener el throughput.&lt;/p>
&lt;hr>
&lt;h2 id="cómo-medir-el-efecto-y-validar-la-calidad">Cómo medir el efecto y validar la calidad&lt;/h2>
&lt;h3 id="stack-de-medición">Stack de medición&lt;/h3>
&lt;p>El stack completo para medir el efecto de cada palanca:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Qué medir&lt;/th>
&lt;th>Herramienta&lt;/th>
&lt;th>Métrica&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Potencia GPU en tiempo real&lt;/td>
&lt;td>DCGM (&lt;code>DCGM_FI_DEV_POWER_USAGE&lt;/code>)&lt;/td>
&lt;td>W por GPU, 100ms&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>J/token en producción&lt;/td>
&lt;td>Kepler + vLLM tokens&lt;/td>
&lt;td>&lt;code>rate(kepler_joules) / rate(vllm_tokens)&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>J/token en banco&lt;/td>
&lt;td>Zeus (&lt;code>ZeusMonitor&lt;/code>)&lt;/td>
&lt;td>J medidos durante el benchmark&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Throughput&lt;/td>
&lt;td>vLLM metrics (&lt;code>vllm:generation_tokens_total&lt;/code>)&lt;/td>
&lt;td>tok/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Latencia TPOT&lt;/td>
&lt;td>vLLM (&lt;code>vllm:e2e_request_latency&lt;/code>)&lt;/td>
&lt;td>ms/tok&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Calidad de salida&lt;/td>
&lt;td>lm-evaluation-harness&lt;/td>
&lt;td>MMLU, HumanEval, etc.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Ver el stack completo en &lt;a href="https://blog.lo0.es/posts/herramientas-energia-deploy-precision-overhead/">herramientas de energía&lt;/a>.&lt;/p>
&lt;h3 id="protocolo-de-medición-por-palanca">Protocolo de medición por palanca&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-promql" data-lang="promql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># J/token en tiempo real (Kepler + vLLM en Prometheus)&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="k">sum&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="kr">rate&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">kepler_container_joules_total&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="nl">container&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">&amp;#34;&lt;/span>&lt;span class="s">vllm&lt;/span>&lt;span class="p">&amp;#34;}[&lt;/span>&lt;span class="s">5m&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">))&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="o">/&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="k">sum&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="kr">rate&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">vllm_generation_tokens_total&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s">5m&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">))&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="c1"># Potencia media por GPU (DCGM)&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="k">avg&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">by&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">gpu&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">DCGM_FI_DEV_POWER_USAGE&lt;/span>&lt;span class="o">)&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="c1"># Verificar power cap activo&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="k">avg&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">by&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">gpu&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">DCGM_FI_DEV_POWER_LIMIT&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Con Zeus, el sweep de configuraciones es automático:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">zeus.monitor&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">ZeusMonitor&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">monitor&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ZeusMonitor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">gpu_indices&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">with&lt;/span> &lt;span class="n">monitor&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">begin_window&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;fp8_inference&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># lanzar benchmark con vLLM FP8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">run_benchmark&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;llama-3-70b-fp8&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">num_tokens&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10_000&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">monitor&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">end_window&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;fp8_inference&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;J/token: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">total_energy&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">10_000&lt;/span>&lt;span class="si">:&lt;/span>&lt;span class="s2">.4f&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="validación-de-calidad">Validación de calidad&lt;/h3>
&lt;p>La validación de que la palanca no degrada la calidad se hace con lm-evaluation-harness
(&lt;a href="https://github.com/EleutherAI/lm-evaluation-harness">github.com/EleutherAI/lm-evaluation-harness&lt;/a>):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Comparar MMLU entre FP16 y FP8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lm_eval --model vllm &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --model_args &lt;span class="nv">pretrained&lt;/span>&lt;span class="o">=&lt;/span>meta-llama/Llama-3-70B-Instruct,dtype&lt;span class="o">=&lt;/span>float16 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --tasks mmlu --num_fewshot &lt;span class="m">5&lt;/span> --output_path ./results/fp16/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lm_eval --model vllm &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --model_args &lt;span class="nv">pretrained&lt;/span>&lt;span class="o">=&lt;/span>meta-llama/Llama-3-70B-Instruct,quantization&lt;span class="o">=&lt;/span>fp8 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --tasks mmlu --num_fewshot &lt;span class="m">5&lt;/span> --output_path ./results/fp8/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>La diferencia de puntuación en MMLU entre FP16 y FP8 con calibración es típicamente
&amp;lt;1%. Sin calibración puede ser 2–4%.&lt;/p>
&lt;hr>
&lt;h2 id="tabla-de-decisión-pareto-energía--latencia--calidad">Tabla de decisión Pareto (energía / latencia / calidad)&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Palanca&lt;/th>
&lt;th>J/token&lt;/th>
&lt;th>TPOT (latencia)&lt;/th>
&lt;th>Calidad&lt;/th>
&lt;th>Coste implementación&lt;/th>
&lt;th>Reversibilidad&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Cuantización FP8&lt;/td>
&lt;td>↓↓↓&lt;/td>
&lt;td>↓ (mejora)&lt;/td>
&lt;td>~ (−&amp;lt;1%)&lt;/td>
&lt;td>Bajo (1 flag)&lt;/td>
&lt;td>Alta&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cuantización INT4 AWQ&lt;/td>
&lt;td>↓↓↓↓&lt;/td>
&lt;td>↓ (mejora)&lt;/td>
&lt;td>↓ (−1–3%)&lt;/td>
&lt;td>Medio (recalibrar)&lt;/td>
&lt;td>Alta&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Continuous batching&lt;/td>
&lt;td>↓↓↓&lt;/td>
&lt;td>~ (neutro en TPOT)&lt;/td>
&lt;td>~&lt;/td>
&lt;td>Bajo (motor nuevo)&lt;/td>
&lt;td>Alta&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Power cap 70% TDP&lt;/td>
&lt;td>↓↓&lt;/td>
&lt;td>↑ &amp;lt;10%&lt;/td>
&lt;td>~&lt;/td>
&lt;td>Muy bajo (1 comando)&lt;/td>
&lt;td>Inmediata&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DVFS decode&lt;/td>
&lt;td>↓↓↓&lt;/td>
&lt;td>↑ &amp;lt;6%&lt;/td>
&lt;td>~&lt;/td>
&lt;td>Medio (script + tuning)&lt;/td>
&lt;td>Alta&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Speculative decoding&lt;/td>
&lt;td>↓ (batch bajo)&lt;/td>
&lt;td>↓ (mejora TTFT)&lt;/td>
&lt;td>~&lt;/td>
&lt;td>Medio (draft model)&lt;/td>
&lt;td>Alta&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Prefix caching&lt;/td>
&lt;td>↓↓ (prefill)&lt;/td>
&lt;td>↓↓ (TTFT mejora)&lt;/td>
&lt;td>~&lt;/td>
&lt;td>Bajo (1 flag)&lt;/td>
&lt;td>Alta&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Chunked prefill&lt;/td>
&lt;td>↓&lt;/td>
&lt;td>↑ TPOT estable&lt;/td>
&lt;td>~&lt;/td>
&lt;td>Bajo (1 flag)&lt;/td>
&lt;td>Alta&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>SLM (7B vs 70B)&lt;/td>
&lt;td>↓↓↓↓&lt;/td>
&lt;td>↓↓ (mejora mucho)&lt;/td>
&lt;td>↓↓ (−variable)&lt;/td>
&lt;td>Alto (re-eval calidad)&lt;/td>
&lt;td>Media&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>MoE (vs denso mismo tamaño activo)&lt;/td>
&lt;td>↑ (+54%)&lt;/td>
&lt;td>↑&lt;/td>
&lt;td>~&lt;/td>
&lt;td>—&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Scheduling a horas limpias&lt;/td>
&lt;td>~ J/token, ↓↓ CO₂&lt;/td>
&lt;td>~ (para diferible)&lt;/td>
&lt;td>~&lt;/td>
&lt;td>Medio (scheduler)&lt;/td>
&lt;td>Alta&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Leyenda: ↓↓↓↓ mejora fuerte · ↓↓↓ mejora significativa · ↓↓ mejora moderada · ↓ mejora leve ·
~ neutro · ↑ empeora · ↑↑ empeora significativamente.&lt;/p>
&lt;hr>
&lt;h2 id="apilamiento-de-palancas-efecto-combinado">Apilamiento de palancas: efecto combinado&lt;/h2>
&lt;p>Las palancas son en su mayoría &lt;strong>ortogonales&lt;/strong> y se apilan. El impacto combinado máximo
documentado en (&lt;a href="https://arxiv.org/pdf/2504.17674">arXiv 2504.17674&lt;/a>):&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;La aplicación correcta de las optimizaciones de inferencia relevantes puede reducir el
consumo de energía total hasta un 73% respecto a baselines sin optimizar.&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>Secuencia recomendada por coste-beneficio:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Motor optimizado&lt;/strong> (vLLM, TRT-LLM) con continuous batching: −25–40% inmediato.&lt;/li>
&lt;li>&lt;strong>Cuantización FP8&lt;/strong> (si el hardware lo soporta: H100, A100 con soporte limitado): −30–50%
adicional sobre el J/token restante.&lt;/li>
&lt;li>&lt;strong>Power cap al 70% TDP&lt;/strong>: −20–30% de potencia con &amp;lt;10% de throughput. Bajo coste.&lt;/li>
&lt;li>&lt;strong>Prefix caching&lt;/strong>: actívalo si hay system prompts o contextos repetidos. Sin coste.&lt;/li>
&lt;li>&lt;strong>Chunked prefill&lt;/strong>: si la carga tiene prompts variables largos.&lt;/li>
&lt;li>&lt;strong>DVFS en decode&lt;/strong>: −22–45% adicional si el SLO lo permite.&lt;/li>
&lt;li>&lt;strong>Speculative decoding&lt;/strong>: solo si el batch es bajo (&amp;lt;16) y la latencia TTFT importa.&lt;/li>
&lt;li>&lt;strong>Selección de modelo&lt;/strong>: pasar a SLM si la calidad es suficiente (evaluar con
lm-evaluation-harness en tu tarea concreta).&lt;/li>
&lt;/ol>
&lt;p>Ejemplo cuantificado en 4×H100 SXM (2.800 W TDP nodo), Llama-3 70B, carga chat:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Configuración&lt;/th>
&lt;th>Potencia (W)&lt;/th>
&lt;th>Throughput (tok/s)&lt;/th>
&lt;th>J/token&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>PyTorch FP16, batch estático&lt;/td>
&lt;td>~2.100&lt;/td>
&lt;td>~400&lt;/td>
&lt;td>&lt;strong>5,25&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>vLLM FP16, continuous batching&lt;/td>
&lt;td>~2.200&lt;/td>
&lt;td>~1.800&lt;/td>
&lt;td>&lt;strong>1,22&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>vLLM FP8, continuous batching&lt;/td>
&lt;td>~2.100&lt;/td>
&lt;td>~2.400&lt;/td>
&lt;td>&lt;strong>0,875&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>+ power cap 490 W/GPU (1.960 W nodo)&lt;/td>
&lt;td>~1.960&lt;/td>
&lt;td>~2.160&lt;/td>
&lt;td>&lt;strong>0,907&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>+ prefix caching (40% hit rate)&lt;/td>
&lt;td>~1.960&lt;/td>
&lt;td>~2.600&lt;/td>
&lt;td>&lt;strong>0,754&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>+ DVFS decode 1.200 MHz&lt;/td>
&lt;td>~1.500&lt;/td>
&lt;td>~2.400&lt;/td>
&lt;td>&lt;strong>0,625&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>Los valores son estimaciones ilustrativas basadas en los papers citados aplicados a
un nodo 4×H100. El J/token real depende de la distribución de prompts, el batch efectivo
y la temperatura de los modelos. Medirlo con Zeus o DCGM+Kepler es obligatorio.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="hardware-de-referencia-tdp-y-rangos-de-power-cap">Hardware de referencia: TDP y rangos de power cap&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>GPU&lt;/th>
&lt;th>TDP (W)&lt;/th>
&lt;th>Rango de cap soportado&lt;/th>
&lt;th>Sweet spot decode&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>H100 SXM 80GB&lt;/td>
&lt;td>700&lt;/td>
&lt;td>200–700 W&lt;/td>
&lt;td>~490–560 W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>H100 PCIe 80GB&lt;/td>
&lt;td>350&lt;/td>
&lt;td>100–350 W&lt;/td>
&lt;td>~245–280 W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A100 SXM 80GB&lt;/td>
&lt;td>400&lt;/td>
&lt;td>100–400 W&lt;/td>
&lt;td>~280–320 W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A100 PCIe 80GB&lt;/td>
&lt;td>300&lt;/td>
&lt;td>100–300 W&lt;/td>
&lt;td>~210–240 W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>L40S 48GB&lt;/td>
&lt;td>350&lt;/td>
&lt;td>100–350 W&lt;/td>
&lt;td>~245–280 W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RTX 5090 (referencia, PCIe)&lt;/td>
&lt;td>575&lt;/td>
&lt;td>~100–575 W&lt;/td>
&lt;td>~400–460 W&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Para los rangos exactos: &lt;code>nvidia-smi -q -d POWER | grep -E &amp;quot;Min|Max|Current&amp;quot;&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2 id="resumen-ejecutivo-por-rol">Resumen ejecutivo por rol&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Rol&lt;/th>
&lt;th>Primera acción&lt;/th>
&lt;th>Segunda acción&lt;/th>
&lt;th>Herramienta clave&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Operador de cluster&lt;/td>
&lt;td>&lt;code>nvidia-smi -pl [70% TDP]&lt;/code> en todos los nodos&lt;/td>
&lt;td>Activar persistent mode&lt;/td>
&lt;td>nvidia-smi, DCGM&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ingeniero de serving&lt;/td>
&lt;td>Migrar a vLLM FP8 con continuous batching&lt;/td>
&lt;td>Activar prefix caching&lt;/td>
&lt;td>vLLM, llm-compressor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Arquitecto de plataforma&lt;/td>
&lt;td>Seleccionar el modelo mínimo que cumple el SLO de calidad&lt;/td>
&lt;td>Diseñar policy de scheduling por carbono&lt;/td>
&lt;td>lm-evaluation-harness, Kueue&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Equipo de MLOps&lt;/td>
&lt;td>Montar sweep de power cap con Zeus&lt;/td>
&lt;td>Instrumentar J/token en Prometheus&lt;/td>
&lt;td>Zeus, DCGM exporter&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Ver el stack de medición completo en &lt;a href="https://blog.lo0.es/posts/herramientas-energia-deploy-precision-overhead/">herramientas de energía&lt;/a>
y la metodología de J/token en &lt;a href="https://blog.lo0.es/posts/energia-por-token-metodologia/">energía por token&lt;/a>.
Para el contexto de leaderboards y benchmarks de referencia de energía, ver &lt;a href="https://blog.lo0.es/posts/leaderboards-energia-llm/">leaderboards de energía LLM&lt;/a>.
La conexión con el TCO completo está en &lt;a href="https://blog.lo0.es/posts/utilizacion-gpu-como-finops/">utilización GPU como FinOps&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2 id="fuentes">Fuentes&lt;/h2>
&lt;ul>
&lt;li>arXiv 2504.17674 · Energy Considerations of LLM Inference and Efficiency Optimizations (CMU/Hugging Face, 2025) — &lt;a href="https://arxiv.org/pdf/2504.17674">https://arxiv.org/pdf/2504.17674&lt;/a>&lt;/li>
&lt;li>arXiv 2604.11391 · Architectural Trade-offs: power-capping NVIDIA H100 and H200 (FAU Erlangen, 2026) — &lt;a href="https://arxiv.org/html/2604.11391v1">https://arxiv.org/html/2604.11391v1&lt;/a>&lt;/li>
&lt;li>arXiv 2512.03024 · TokenPowerBench: Benchmarking the Power Consumption of LLM Inference — &lt;a href="https://arxiv.org/pdf/2512.03024">https://arxiv.org/pdf/2512.03024&lt;/a>&lt;/li>
&lt;li>arXiv 2602.09113 · Benchmarking the Energy Savings with Speculative Decoding Strategies — &lt;a href="https://arxiv.org/pdf/2602.09113">https://arxiv.org/pdf/2602.09113&lt;/a>&lt;/li>
&lt;li>arXiv 2501.08219 · Characterizing LLM Inference Energy-Performance Tradeoffs across Workloads and GPU Scaling — &lt;a href="https://arxiv.org/abs/2501.08219">https://arxiv.org/abs/2501.08219&lt;/a>&lt;/li>
&lt;li>arXiv 2602.18755 · DualScale: Energy-Efficient Disaggregated LLM Serving via Phase-Aware Placement and DVFS — &lt;a href="https://arxiv.org/pdf/2602.18755">https://arxiv.org/pdf/2602.18755&lt;/a>&lt;/li>
&lt;li>arXiv 2508.16449 · GreenLLM: SLO-Aware Dynamic Frequency Scaling for Energy-Efficient LLM Serving — &lt;a href="https://arxiv.org/pdf/2508.16449">https://arxiv.org/pdf/2508.16449&lt;/a>&lt;/li>
&lt;li>HAL 05190051 · DVFS-GPT: Dynamic Voltage and Frequency Scaling for Energy-Efficient LLMs — &lt;a href="https://hal.science/hal-05190051">https://hal.science/hal-05190051&lt;/a>&lt;/li>
&lt;li>arXiv 2308.16369 · SARATHI: Efficient LLM Inference by Piggybacking Decodes with Chunked Prefills — &lt;a href="https://arxiv.org/pdf/2308.16369">https://arxiv.org/pdf/2308.16369&lt;/a>&lt;/li>
&lt;li>arXiv 2507.09942 · Green-LLM: Optimal Workload Allocation for Environmentally-Aware Distributed Inference — &lt;a href="https://arxiv.org/pdf/2507.09942">https://arxiv.org/pdf/2507.09942&lt;/a>&lt;/li>
&lt;li>arXiv 2505.06371 · The ML.ENERGY Benchmark: Toward Automated Inference Energy Measurement and Optimization — &lt;a href="https://arxiv.org/html/2505.06371v1">https://arxiv.org/html/2505.06371v1&lt;/a>&lt;/li>
&lt;li>Zeus Project (ml.energy) — &lt;a href="https://ml.energy/zeus/">https://ml.energy/zeus/&lt;/a>&lt;/li>
&lt;li>Zeus · PyTorch blog: Deep Learning Energy Measurement and Optimization — &lt;a href="https://pytorch.org/blog/zeus/">https://pytorch.org/blog/zeus/&lt;/a>&lt;/li>
&lt;li>Baseten · 33% faster LLM inference with FP8 quantization — &lt;a href="https://www.baseten.co/blog/33-faster-llm-inference-with-fp8-quantization/">https://www.baseten.co/blog/33-faster-llm-inference-with-fp8-quantization/&lt;/a>&lt;/li>
&lt;li>NVIDIA · Managing Power Capping (DGX H100/H200 User Guide) — &lt;a href="https://docs.nvidia.com/dgx/dgxh100-user-guide/power-capping.html">https://docs.nvidia.com/dgx/dgxh100-user-guide/power-capping.html&lt;/a>&lt;/li>
&lt;li>NERSC · GPU Power Capping documentation — &lt;a href="https://docs.nersc.gov/jobs/power-capping/">https://docs.nersc.gov/jobs/power-capping/&lt;/a>&lt;/li>
&lt;li>MLCommons · MLPerf Inference v5.1 results — &lt;a href="https://mlcommons.org/2025/09/mlperf-inference-v5-1-results/">https://mlcommons.org/2025/09/mlperf-inference-v5-1-results/&lt;/a>&lt;/li>
&lt;li>vLLM · Disaggregated Prefill documentation — &lt;a href="https://docs.vllm.ai/en/latest/features/disagg_prefill/">https://docs.vllm.ai/en/latest/features/disagg_prefill/&lt;/a>&lt;/li>
&lt;li>Microsoft Research · Characterizing Power Management Opportunities for LLMs in the Cloud (ASPLOS 2024) — &lt;a href="https://www.microsoft.com/en-us/research/wp-content/uploads/2024/03/GPU_Power_ASPLOS_24.pdf">https://www.microsoft.com/en-us/research/wp-content/uploads/2024/03/GPU_Power_ASPLOS_24.pdf&lt;/a>&lt;/li>
&lt;li>EcoInfer (MDPI Electronics) · Optimizing Energy Efficiency with Latency Guarantees Through Iteration-Level GPU Frequency Control — &lt;a href="https://doi.org/10.3390/electronics15102139">https://doi.org/10.3390/electronics15102139&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>