A single H100 draws 700W at peak. Run a 1000-GPU cluster at that draw, 24 hours a day, 365 days a year, and you are looking at roughly $800,000 a year in electricity alone, before cooling overhead pushes it closer to $1M. That is a board-level line item, not an engineering footnote — and the EU CSRD, the SEC climate disclosure rule, and AWS/GCP/Azure carbon-free compute commitments have all conspired to make it visible to CFOs and ESG officers, not just SREs.

The good news: 30-50% of that energy is recoverable through software. Not new GPUs, not exotic cooling, not model quantization that degrades quality. The waste comes from over-provisioned clusters, un-batched requests, model load/unload churn, and cold-starts from scale-to-zero — all of which are addressable with the Kubernetes primitives you already run.

This guide walks through the four sources of waste, the concrete fix for each, and the carbon-accounting instrumentation you need to prove the savings to procurement. The goal: turn inference energy from an invisible cost into a metric you can monitor, alert on, and reduce quarter-over-quarter, the same way you treat latency or error rate.

The math your CFO actually wants to see

Before diving into fixes, here is the cost model that makes the conversation real. A single H100 SXM5 at 700W TDP running 24/7 at industrial U.S. electricity rates of $0.10/kWh:

  • Compute power: 700W x 24h x 365d x $0.10/kWh = $613/GPU/year
  • Cooling overhead: PUE of 1.3 (typical for modern data centers) adds 30%, so $800/GPU/year all-in
  • Network and storage: another 5-10% on top of compute, so $850/GPU/year in fully-loaded cost
  • A 1000-GPU cluster: $850,000/year in electricity. With 30% recoverable, that is $255,000/year in savings without buying a single new chip

For an EU enterprise under CSRD, the same cluster has a Scope 3 carbon cost of roughly 1,500-2,500 tonnes CO2e/year (depending on grid mix), which the CFO has to disclose and which procurement teams now actively evaluate. The financial and the carbon metrics are the same fix — reducing kWh per inference reduces both the line item and the disclosure.

Source 1: Over-provisioned clusters

Most enterprise inference clusters run at 2-3x peak capacity "just in case." A team expecting 100 requests/second at peak provisions 300 RPS of capacity, and runs that 24/7. At $0.85/GPU-hour all-in, a 1000-GPU cluster at 30% utilization is wasting $500K/year in idle compute power alone — the GPUs are powered up, the memory is reserved, the network is allocated, and the chips are drawing 200-300W each even when no requests are in flight.

The fix is queue-depth autoscaling instead of CPU-based scaling. CPU utilization on a GPU is a poor signal — it tells you the chip is doing compute, not whether requests are queued behind it. A 30-second queue with 95% CPU utilization means you are about to time out. A 30-second queue with 20% CPU utilization means you have a prefill bottleneck and adding replicas will help. KEDA with the Prometheus scaler reads queue depth directly from your inference server metrics and adds or removes replicas in seconds.

For background and async inference workloads, Spot GPU pricing adds another 60-70% savings on top of the autoscaling win. Spot GPUs are reclaimable, but for inference that can tolerate a 2-minute drain (which is most of it), the economics are obvious. Reserve on-demand for the steady-state baseline, Spot for the burst, and your cost-per-million-tokens drops by 50-60% without changing the SLA.

For the practical KEDA + Karpenter setup that produced the 40% GPU cost reduction on our own vLLM cluster, see Cut vLLM GPU Costs 40% with KEDA Queue-Depth Autoscaling.

Source 2: Un-batched requests

Most production LLM traffic is single-request-per-call. The user types a query, the inference server processes it, and the GPU is busy for 200-500ms. During that time, the chip is nowhere near saturated on memory bandwidth, which is the actual constraint for transformer inference. A single H100 running Llama 70B at batch size 1 produces around 80 tokens/second; the same GPU at batch size 32 produces 1,800 tokens/second — a 22x throughput improvement at the same power draw.

The fix is continuous batching. vLLM, SGLang, and TensorRT-LLM all implement continuous batching — the inference server dynamically batches incoming requests together in the same forward pass, instead of waiting for a fixed batch to fill. The throughput improvement is 5-22x depending on model size and request pattern, with zero degradation in latency for the individual request (TTFT might tick up 20-50ms in the worst case, but p50 and p99 actually improve because the system is not waiting for a batch to fill).

If you are running on HuggingFace Transformers, the default transformer generate loop is naive batching — it pads every sequence to the longest in the batch and wastes 40-80% of the FLOPs on padding tokens. That is a 5x energy waste you can recover just by switching to vLLM or SGLang as the serving layer. We benchmarked this directly: same model, same H100, 5.4x throughput improvement going from Transformers to vLLM at the same batch size, with energy per inference dropping proportionally.

For the full SGLang + RadixAttention setup and the throughput numbers, see SGLang Production Monitoring: A Complete Practical Guide and vLLM vs SGLang vs Ollama in Production.

Source 3: Model load/unload churn

A 70B model in FP16 is 140GB. Loading it from NVMe takes 8-15 seconds, during which the GPU is drawing 200-400W but producing zero tokens. Warming the KV cache for the first request adds another 2-5 seconds. Every load is a waste event.

Naive autoscaling that scales to zero on idle, then re-loads on traffic, can easily waste 20-30% of total cluster energy on load/unload cycles. The fix has two parts: pinned model servers, and a lameduck drain instead of abrupt kill on scale-down.

Pinned model servers: keep the same GPU allocation for the same model. A common pattern is to label nodes with the model they are loaded for (model=llama-70b-int8) and have a node affinity rule that pins pods to those nodes. The model stays warm, the KV cache stays hot, and the energy cost of a load happens once per pod lifetime instead of once per scale event.

Lameduck drain: on scale-down, mark the pod for termination, stop accepting new requests, but keep the existing requests running until they complete (30-60 seconds typically). Then gracefully shut down. This avoids the wasteful "kill at request 50% complete, restart from scratch" pattern that doubles energy cost on bursty workloads.

The aggregate impact depends on your traffic pattern. For a steady 100 RPS workload with infrequent scale events, the load/unload waste is under 5%. For a bursty workload with 5-10 scale events per day, the waste can be 25-40% of total energy — and the fix is essentially free, just a configuration change.

Source 4: Cold-start from scale-to-zero

Serverless inference (Modal, RunPod Serverless, AWS SageMaker Serverless Inference) bills you only for the time your model is processing requests. Scale to zero on idle, and you pay nothing. But the cold-start is 10-30 seconds on most platforms — the container has to pull the model from S3, the GPU has to initialize, the runtime has to compile, and the first request has to wait for all of it.

During that 10-30 seconds, the GPU is drawing 100-300W for warming but producing zero tokens. If you have 10 cold-starts a day, each 20 seconds at 200W, you are spending 11 Wh per day on cold-start energy alone — small in absolute terms, but 100% wasted. The fix depends on your tolerance for always-on cost:

  • Keep a warm pool of 1-2 replicas at all times. The cost is the steady-state power draw of those replicas (~$28/day per H100), but the cold-start waste goes to zero. Net win if your traffic is bursty enough that cold-starts happen more than 5-10 times a day.
  • Accept the cold-start tax and price it in: if you are running an async batch workload where 30 seconds of latency is acceptable, cold-start is fine. Account for the wasted energy in your kWh-per-inference metric and move on.
  • Pre-warm based on a schedule: if your traffic pattern is predictable (e.g., business hours in a specific timezone), pre-warm the pool 10 minutes before the expected ramp. The scheduler pays the energy cost only during the predictable window.

Carbon accounting for AI: instrumenting kWh per inference

Once you have the four sources of waste under control, you need to measure the result. The metric that matters is kWh per 1,000 tokens generated (or kWh per 1,000 inferences for non-LLM workloads). This is the single number that lets you compare optimization techniques, prove the savings to procurement, and comply with CSRD.

The instrumentation stack:

  • DCGM (Data Center GPU Manager) Exporter: exposes DCGM_FI_DEV_POWER_USAGE in watts, scraped by Prometheus at 15-second intervals. Per-GPU power draw is the raw input.
  • Custom vLLM/SGLang exporter: exposes vllm:prompt_tokens_total, vllm:generation_tokens_total, vllm:e2e_request_latency_seconds. The denominator for kWh per 1,000 tokens.
  • Carbon-aware scheduling layer: Kube-Green, the KEDA carbon-aware scaler, or AWS Compute Carbon-Aware Scaling. These shift workloads to time windows or regions with lower grid carbon intensity.

Prometheus query for kWh per million tokens per GPU:

sum by (gpu_uuid) (
  rate(DCGM_FI_DEV_POWER_USAGE{} [5m]) * 60 * 60
)
/ sum by (gpu_uuid) (
  rate(vllm:generation_tokens_total{} [5m]) * 1e6
)

The result is kWh per million tokens. Alert on a 20% week-over-week regression; dashboard it next to the latency and throughput panels. Once you have this metric, the optimization work becomes self-evident: the 5x throughput improvement from continuous batching shows up as a 5x drop in kWh per token, and the CFO can read the number on a single line in a quarterly ESG report.

The carbon-aware scheduler pattern

Grid carbon intensity varies 3-5x across the day in most U.S. and EU regions. Coal peaker plants come online at 6pm when residential demand spikes; wind generation peaks overnight; solar peaks midday. The same GPU running the same inference workload produces 2-4x more CO2 per kWh at 7pm than at 2pm, depending on the regional grid mix.

The carbon-aware scheduler pattern routes batch and async inference workloads to time windows when the local grid is greenest, and reserves on-demand capacity for latency-sensitive traffic that cannot wait. Three implementations that actually work in production:

  • Kube-Green: a Kubernetes operator from the Keptn project that reads regional carbon intensity from ElectricityMaps API and schedules workloads accordingly. Free and open-source, integrates with the standard kube-scheduler.
  • KEDA carbon-aware scaler: scales replicas to zero (or to a minimum) during high-carbon windows, and scales up during low-carbon windows. Best for batch inference that can tolerate scheduling delays.
  • AWS Compute Carbon-Aware Scaling: AWS-native, integrated with EC2 Auto Scaling and ECS. Reads grid intensity for the region and shifts non-urgent workloads to the greenest 6-hour window each day.

The savings from carbon-aware scheduling alone are 15-30% on Scope 3 emissions for batch workloads, with no impact on latency. For inference workloads serving end users, the constraint is harder — but even there, you can route 20-40% of traffic (the non-interactive batch path) to the greenest window and keep the user-facing path on the always-on baseline.

The CSRD/SEC disclosure angle

EU CSRD reporting is in force as of 2026 for companies with over 250 employees. The Scope 3 disclosure category covers purchased services, which includes cloud compute — and the audit firms are now asking for the specific kWh per workload for material AI deployments. "We use 1000 H100s" is no longer an acceptable answer; the auditor wants "we use 1000 H100s, our measured kWh per million tokens is X, our grid mix is Y percent renewables, our annual Scope 3 compute emissions are Z tonnes CO2e."

The SEC climate disclosure rule in the U.S. is being phased in on a similar schedule, with the first material disclosures due 2026-2027 for accelerated filers. The pattern is the same: measured kWh, measured grid mix, measured Scope 3 emissions, with the supporting data point available on request.

For enterprise procurement teams evaluating AI vendors in 2026, the carbon-efficiency of the inference stack is becoming a tie-breaker on contracts. "We can prove our kWh per million tokens is 40% below the industry median" is the kind of claim that wins RFPs in 2026 — and the instrumentation work to support it is the same work that reduces your own electricity bill. Win-win.

Putting it together: a 90-day carbon-aware inference rollout

For teams that want to do this systematically, here is a realistic 90-day plan that produces measurable savings without disrupting the existing production workload.

Days 1-15: measure the baseline. Deploy DCGM Exporter, instrument your vLLM/SGLang/TGI servers, stand up the Prometheus + Grafana stack for kWh per million tokens. Capture 14 days of baseline data. Identify the four sources of waste in your specific workload: what percent of energy is from over-provisioning, what percent from un-batched traffic, what percent from churn, what percent from cold-starts.

Days 16-45: fix sources 1 and 2. Move from CPU-based autoscaling to queue-depth autoscaling (KEDA + Prometheus scaler). Enable continuous batching on your inference server (the default for vLLM and SGLang, just verify the config). For 70%+ of workloads, these two changes alone recover 20-35% of total energy.

Days 46-75: fix sources 3 and 4. Implement pinned model servers with node affinity. Replace abrupt scale-down with lameduck drain. For serverless inference, decide on the warm-pool vs cold-start tradeoff per workload and document the policy. The energy savings here are workload-dependent: 5-15% for steady traffic, 25-40% for bursty traffic.

Days 76-90: layer in the carbon-aware scheduler. Deploy Kube-Green or the KEDA carbon-aware scaler for batch inference. Capture the grid-carbon intensity data for your region. Measure the Scope 3 emissions reduction from the scheduling shift. Document the kWh per million tokens trajectory for the next ESG disclosure cycle.

By the end of 90 days, a typical team running 1000 H100s for production inference should see:

  • 30-50% reduction in kWh per million tokens (continuous batching is the biggest single win)
  • 15-25% reduction in absolute electricity cost (autoscaling + Spot GPU for non-prod)
  • 15-30% reduction in Scope 3 emissions (carbon-aware scheduling for batch workloads)
  • Measurable, auditable metrics for the next CSRD or SEC disclosure cycle

The hardware did not change. The model did not change. The SLA did not change. The wins came from running the existing software stack at the efficiency it was designed for, and from instrumenting the metrics that let you prove it.

Conclusion

AI inference energy is not a future problem. It is a present-tense line item on the electricity bill, a present-tense entry in the ESG report, and a present-tense differentiator in the next RFP. The 30-50% recoverable waste is not a hardware problem — it is a software problem, and the fix is the same Kubernetes + Prometheus + autoscaling stack you already run.

The teams that win on carbon-aware inference in 2026-2027 are the ones that started instrumenting kWh per million tokens in 2026, before the disclosure requirements forced their hand. The teams that wait until 2027 will be playing catch-up against competitors who have already published their carbon-efficiency numbers in the last two ESG reports.

For more on the operational and FinOps side of inference cost, see LLM FinOps 2026: Cut Your AI Bill, Keep Performance, Kubernetes Cost Optimization: The FinOps Playbook, and GPU Monitoring for AI Inference.

Advertisement
Advertisement

Tools that help

FinOps Modal

Modal is a serverless GPU platform that publishes per-region carbon intensity and per-workload kWh metrics out of the box. Every job emits carbon-equivalent grams per inference alongside tokens/sec and cost, which makes the CSRD disclosure work a 5-minute export instead of a 3-month instrumentation project. Built-in continuous batching on A100/H100, autoscale-to-zero with sub-second cold-starts, and a Python-native SDK that eliminates the YAML configuration tax. Generous free tier for prototyping, predictable per-GPU-second billing at production scale.

FinOps CoreWeave

CoreWeave's reserved-instance GPU pricing delivers 40-60% savings versus on-demand for sustained inference workloads, and their platform publishes real-time per-cluster PUE and grid carbon intensity. If you are running 100+ H100s and want a single procurement contract that covers compute, sustainability disclosure, and reserved-capacity pricing, CoreWeave is the path of least resistance. Carbon-aware scheduling is supported on the Kubernetes-based product tier.

Observability Grafana Cloud

Grafana Cloud is the de facto dashboard layer for the kWh-per-million-tokens metric. Pull DCGM_FI_DEV_POWER_USAGE from your GPU exporter and vllm:generation_tokens_total from your inference server into Grafana, and the carbon-cost-per-workflow dashboard is a single PromQL query away. The free tier covers 10K metrics series, which is enough for 50-100 GPU monitoring. Carbon-aware scheduling integrations with Kube-Green and AWS Compute Carbon-Aware are one-click alerts.

Advertisement
Advertisement

Free Newsletter

Get one analysis like this every week

The Stack Pulse covers production AI incidents, FinOps playbooks, and infrastructure patterns - written for engineers who operate at scale.

Subscribe Free