Joulehousea live datacenter energy simulation

Same GPUs. Same traffic. Same latency promise. Less power.

Below are two identical halls of 256 H100s serving a 70B model. They receive exactly the same requests. The right-hand hall runs a controller that watches what each GPU is doing and turns its clock down whenever that costs the user nothing. Every number here is computed live, in your browser, from a physical model of the boards.

less energy
same tokens delivered
of requests inside the latency objective
saved per hour at this tariff
Traffic
simulated 00:00 · 8× real time

Without control

stock clocks, 700 W board limit
kW drawn from the grid, including cooling220 kW contracted
Tokens / s
Token latency p95, 40 ms promised
Mean GPU clock
MHz
Energy so far
kWh

With workload-aware control

clock set per node, every 250 ms
kW drawn from the grid, including cooling220 kW contracted
Tokens / s
Token latency p95, 40 ms promised
Mean GPU clock
MHz
Energy so far
kWh
Idle board Reading a prompt (compute-bound) Writing an answer (memory-bound) Dimmer means less power

Each small square is one GPU; eight in a row make a node, four nodes make a rack. Watch the teal squares. Those boards are generating tokens, which means they are waiting on memory, and the right-hand hall runs them at a fraction of the clock with no visible difference in output. The amber squares are digesting a fresh prompt, which is real arithmetic, and the controller leaves those alone.

Grid draw, last three minutes

Without controlWith control

What one GPU looks like while it answers a question

A language model answers in two very different phases. First it reads the whole prompt in one burst of matrix multiplies; the tensor cores are the bottleneck and the clock matters. Then it writes the answer one token at a time, and for every single token it has to stream the entire 70 GB of model weights out of memory. The arithmetic is trivial next to the data movement. The cores spend most of their time waiting.

That second phase is where the money is. Power falls roughly with the cube of the clock; the speed of a memory-bound pass barely falls at all. The controller estimates which situation each board is in from its own counters and picks the slowest clock that still meets the latency objective.

Prompt phase, stock clock
Answer phase, stock clock
Answer phase, controlled

One node (eight boards, tensor parallel) with sixteen chat sessions already generating, while an 8,000-token document arrives every few seconds and gets read in one burst. Watts are per board; the scene runs slower than real time so the phases are visible.

Without controlclock MHz · W per board
With controlclock MHz · W per board
reading the prompt writing the answer board power (W) clock (MHz)

How the controller works

It never touches the model, the serving stack, or the customer's code. It reads the same telemetry an operator already has and adjusts one knob the driver already exposes.

1

Measure

Every 250 ms, read each board's power, clock, temperature and two profiling counters: how busy the tensor pipes were, and how busy the memory interface was. This is standard NVML / DCGM telemetry.

DCGM_FI_PROF_PIPE_TENSOR_ACTIVE 0.11 DCGM_FI_PROF_DRAM_ACTIVE 0.86 DCGM_FI_DEV_POWER_USAGE 318 W DCGM_FI_DEV_SM_CLOCK 1980 MHz
2

Understand

The ratio of those two counters says where the board sits between compute-bound and memory-bound. That single number predicts how much slower each candidate clock would make the next forward pass. No phase detector, no model of the workload: with continuous batching almost every pass is a mixture, and the estimate handles a mixture without naming it.

compute share c = 0.11 / (0.11 + 0.86) = 0.11 pass at 1980 MHz 9.4 ms pass at 900 MHz 10.6 ms (+13%) pass at 345 MHz 14.3 ms (+52%)
3

Adjust

Take the slowest clock whose predicted latency still clears the objective with margin, and set it. Idle boards are parked at the floor, which alone takes a resting H100 from about 125 W to under 70 W. Descend gradually; release instantly.

objective 40 ms, hold back 25% → 30 ms candidates 345 … 1980 MHz, 45 MHz steps chosen 810 MHz predicted 10.9 ms nvmlDeviceSetGpuLockedClocks(810, 810)
4

Guard

Compare the latency the model predicted with the latency the next sample actually shows, and correct the estimate. If measured token latency ever climbs past 80% of the objective, the clock goes straight back to maximum. Being wrong about the physics costs a little energy, never the SLO.

predicted ITL 10.9 ms measured ITL 11.6 ms ratio 1.06 → correct c up guard line 32 ms clear next interval hold 810 MHz

Why it is nearly free

Drag the clock down. Board power falls because dynamic power scales with voltage squared times frequency, and the voltage a part needs falls with the frequency it must sustain. The speed of a token-generation pass hardly moves until the clock is very low, because that pass is set by memory bandwidth, which lives on its own clock domain and does not care.

Power does not fall to zero. Memory traffic and leakage set a floor, and that floor is why no clock controller can take much more than a third out of a busy board. The rest of the saving has to come from parking idle boards and from what the lower average draw buys you at the rack.

The prompt-reading pass is the opposite: pure arithmetic, so its speed tracks the clock one for one. A controller that cannot tell the two apart has to leave the clock alone. One that can gets most of the saving at almost no cost.

Board power at this clock
Answer-writing speed, relative to full clock
Prompt-reading speed, relative to full clock

Curves are the model used by the halls above: leakage plus dynamic core power plus HBM traffic, and a roofline step time for a batch of 16 sequences on one 8-board node.

More boards under the same breaker

For an operator the prize is not the electricity bill. It is that a rack, a row and a building each have a fixed power ceiling, and the only way to sell more inference once you are at that ceiling is to make each watt do more.

Without control 26 kW breaker

With control 26 kW breaker

Each bar is the live draw of one of the busiest nodes in the halls above, stacked against a 26 kW rack breaker. The controlled hall's nodes draw less, so more of them fit before the line. The study below measures what that does to protective shedding at six and seven nodes per rack.

Nodes per rackBoardsMean rack kW, uncontrolledMean rack kW, controlledBreaker events, uncontrolledBreaker events, controlled
54022.519.900
64826.723.812835
75630.227.61,513481

Roughly three times fewer protective-shedding events at the same density. It does not eliminate them, and the reason is the sharpest finding in the study: breakers trip on peaks, peaks are prompt bursts, and prompt reading is the one phase a clock controller cannot help. That is an argument for pairing clock control with admission control at the rack, not for pretending the peak is gone.

Every request gets an energy receipt

Because the controller already meters every board at every interval, the energy each forward pass consumed can be split across the requests that rode in it. That turns a facility-level number into a per-request one: this answer cost this many watt-hours, this many cents, this many grams of CO₂.

That is the unit an operator can bill on, the number a customer can put in a sustainability report, and the ground truth the controller is scored against. The receipts on the right are completions from the controlled hall above, priced at the simulated tariff and a 380 g/kWh grid.

Request
Tokens
Energy
Cost
Carbon

What the full study measured

This page runs a browser port of the simulator. The full version is a Rust plant (accelerator physics, inference engine, rack power, cooling, tariff) driven over a socket by a Python control plane that sees nothing but telemetry, the same position a real controller occupies. Identical hall, identical seed, identical arrivals; 256 H100s, 900 s, peak 300 requests per second.

PolicykWhTokens per kWhMean MHzToken latency p95First token p95Inside SLOEnergy
Stock clocks and limits36.432,424,481198012.6 ms748 ms99.89%
Park idle boards only35.662,476,465159212.6 ms742 ms99.88%−2.1%
One fleet-wide power cap35.092,515,668180014.0 ms832 ms99.81%−3.7%
Workload-aware clock control33.842,597,827111228.4 ms1390 ms98.65%−7.1%

The saving depends heavily on how full the hall is, and the two mechanisms are complementary: parking idle boards saves about 20% of a nearly empty hall and nothing on a full one; clock control saves about 5% of a full hall, where it is the only lever left. At high load the fused passes carry more prompt work and are closer to compute-bound, which is exactly where frequency scaling has least to give. The honest version of the pitch is that the savings are largest where they matter least, and the density result above is the one that survives contact with a full hall.

What is real

  • Power is mechanistic: leakage, core dynamic power and HBM traffic behave differently under clock scaling, and the split is what makes the result emergent rather than asserted.
  • The inference engine does continuous batching with chunked prefill and eight-way tensor parallelism, priced from the roofline; latency under load matches published vLLM figures for a 70B model on 8×H100.
  • Rack breakers with proportional, releasable shedding; load-dependent PUE; a two-peak time-of-day tariff.
  • The controller was evaluated only through the telemetry socket. It cannot see the plant's internal state.

What is not

  • The workload is synthetic and seeded, not replayed from a production trace.
  • Constants are datasheet-derived, not calibrated against silicon. The shape is defensible; the third decimal place is not.
  • One model per replica. No speculative decoding, prefix caching or disaggregated prefill, each of which moves the numbers.
  • The browser port above simplifies thermals and drops rack protection from the hall view, so its live saving is larger than the study's. Treat it as the mechanism, and the table as the measurement.