At 3am in the Netherlands, wind turbines are spinning and demand is low. The grid carbon intensity drops to around 90 gCO2/kWh. By 6pm, gas peaking plants have kicked in to cover the evening demand surge and it climbs past 170. Same country. Same infrastructure. Same day. Nearly double the carbon intensity, separated by fifteen hours.

CarbonBench has been tracking these curves across nine regions and the patterns are consistent enough to be actionable. Probably. Still collecting data to be sure about the generality, but the shape of the curve keeps repeating.

What the curves look like

Every electricity grid has a daily rhythm. It follows demand and generation mix. In markets with significant wind capacity — the Netherlands, Ireland, parts of the UK — the cleanest hours tend to be overnight. Wind doesn’t stop blowing when people go to sleep, but electricity demand drops significantly. The result is a surplus of renewable generation relative to demand, which pushes carbon intensity down.

During the day, and especially during evening peaks, dispatchable generation ramps up. This is usually natural gas, sometimes coal. These are the plants that grid operators can turn on and off quickly to match demand. They’re also the most carbon-intensive sources on the grid. So the evening peak isn’t just more electricity — it’s dirtier electricity.

The swing varies by region. CarbonBench data suggests the Netherlands sees a 30-40% swing over 24 hours. Ireland can swing more, sometimes 50%, because its wind capacity is large relative to its total demand. Virginia swings less, maybe 20%, because the baseload is already carbon-heavy and the renewable fraction is smaller. Singapore barely swings at all — it’s natural gas around the clock, consistently dirty.

Oregon is interesting because its baseload is heavily hydroelectric. The daily swing is small, but the absolute level is low. It’s clean at 3am and still pretty clean at 6pm. The curve is flat and low rather than variable.

What this means for batch inference

Not all AI workload is real-time. A lot of it is batch processing. Fine-tuning runs. Evaluation sweeps. Embedding generation for RAG pipelines. Data preprocessing. Synthetic data generation. None of these have a user waiting for a response. They can run whenever.

If you can run a batch job at any point in a 24-hour window, the carbon cost of running it at the cleanest hour versus the dirtiest hour differs by 30-50% in most regions. For a job that takes several hours, scheduling it to start at the trough of the carbon curve instead of the peak is a meaningful reduction. And it’s free — the compute costs the same at 3am as at 6pm on most cloud provider pricing.

Some providers do offer spot pricing that varies by time, and sometimes the cheapest hours overlap with the cleanest hours, because demand is low at both. Night-time spot instances on a wind-heavy grid might be simultaneously cheaper and lower-carbon. Haven’t verified this correlation rigorously, but it seems plausible and worth investigating.

The data nobody looks at

Here’s what keeps bothering about this. The data exists. Electricity Maps publishes real-time grid carbon intensity for most major markets. Cloud providers know which regions their data centers are in. The conversion from grid intensity to inference carbon is straightforward multiplication. And yet no cloud provider dashboard shows the carbon intensity of the region you’re about to deploy to. Or a CI/CD pipeline that schedules training runs for the cleanest available window. Or a batch job scheduler that factors in grid carbon alongside cost and availability.

The tools exist to build all of this. The data is available via API. CarbonBench combines it into a single dataset. But the default is to ignore it entirely — schedule batch jobs for whenever the cron tab says, deploy to whatever region the Terraform template specifies, and never look at what the grid is doing.

Time-shifting inference is free optimization that nobody does because nobody sees the data. That sentence keeps rattling around.

A simple implementation

The most minimal version of carbon-aware scheduling might be something like this. Before launching a batch job, query CarbonBench for the 24-hour carbon forecast for your region. Find the trough. If the trough is within your acceptable delay window, schedule the job for that time. If not, run it now but log the carbon premium you’re paying.

The logging might matter as much as the scheduling. Even if a team decides they can’t always defer jobs to the cleanest window — deadlines exist, SLAs exist — knowing the carbon cost of running at a particular time creates visibility. Over a quarter, that data accumulates into a picture of how much carbon was spent at peak versus trough, and how much could have been saved by time-shifting the deferrable work.

The CarbonBench API returns carbon intensity by region and time. The 24-hour forecast data is there. Building a scheduler wrapper around it seems like a weekend project for any team that already has batch infrastructure. Whether anyone will actually do it is a different question.

The compounding effect with region selection

Time-shifting and region selection multiply together. Pick the cleanest region. Then schedule for the cleanest hour in that region. The combined effect can be substantial.

Netherlands at 3am versus Singapore at 6pm is not a 2x difference. It’s closer to 6x. Same model, same task, same output. One configuration produces 6x the carbon of the other. Neither configuration costs more money. The only cost is latency — your batch job finishes a few hours later, and maybe the data traverses a longer network path.

For real-time inference serving user requests, the constraints are tighter. Latency matters. Data residency matters. You can’t always route to the cleanest region or wait for the cleanest hour. But even for real-time workloads, the region selection still helps — choosing Oregon over Virginia doesn’t add meaningful latency for most US applications, and the carbon difference is significant.

Why the curve matters beyond scheduling

The 24-hour carbon curve also tells you something about a region’s trajectory. Regions with large daily swings tend to have significant renewable capacity that’s variable — wind, solar. The swing exists because there’s enough renewable generation to materially change the carbon intensity when conditions are favorable. A flat, high curve — like Singapore’s — means there’s little renewable capacity to speak of.

A flat, low curve — like Oregon’s hydro-dominated grid — means clean baseload. This is probably the best case: consistently low carbon regardless of time of day. No need for time-shifting because there’s no dirty peak to avoid.

Watching these curves over time might also reveal trends. As regions add renewable capacity, you’d expect the troughs to get deeper and the average to decline. The 24-hour curve could serve as a leading indicator of grid decarbonization, months before annual statistics are published.

Still early in collecting this longitudinal data. But the daily snapshots are already there for nine regions, updated every 24 hours. The patterns are clear enough to act on.

carbonbench.ai