Man Patel ← all demos

Live demo · Low-carbon AI

What does your training run actually cost?

Not just in dollars. A GPU job burns electricity, and the carbon that electricity carries depends almost entirely on which grid it runs on — a variable most teams never set deliberately. Change the inputs and watch all three numbers move.

Your training run

Fraction of board power actually drawn. Real jobs idle between steps.

Overhead for cooling and power delivery. Hyperscalers report ~1.1; enterprise rooms run 1.5–2.0.

Pre-filled with an approximate on-demand list price. Override it with what you actually pay.

Energy
kWh
Emissions
kg CO₂e
Compute cost

Same job, different grid

Estimated emissions for the same training run across cloud regions

Data table
Every region plotted above, with the figures behind the bars.
Method & assumptions

The estimate follows the approach in Lacoste et al., Quantifying the Carbon Emissions of Machine Learning (2019): board power × time × datacentre overhead, multiplied by the carbon intensity of the local grid.

energy_kWh = gpus × TDP_watts × utilisation × hours ÷ 1000 × PUE emissions_kg = energy_kWh × grid_intensity_gCO₂e_per_kWh ÷ 1000 cost_usd = gpus × price_per_gpu_hour × hours

Which means the numbers inherit these assumptions:

  • Board TDP stands in for real draw. Utilisation scales it linearly, which is a simplification — power curves are not linear in occupancy.
  • Grid intensity is an annual country average (Ember, 2024 figures), not the region's real-time mix. Actual intensity swings by hour and season, and a provider's renewable PPAs are not reflected here — so treat these as location-based, not market-based, figures.
  • Only the accelerators are counted. Host CPU, memory, networking, storage and the embodied carbon of the hardware itself are all excluded. Real end-to-end footprints run higher.
  • Prices are approximate on-demand list rates and move constantly. Spot, committed-use and reserved pricing change the cost column, never the carbon one.

Equivalences use 170 g CO₂e/km for a passenger car, 8.8 g per smartphone charge, and 21 kg absorbed per tree-year.

The point isn't the third decimal place — it's the spread. Region choice moves the carbon number by more than an order of magnitude while leaving the model, the code, and usually the price almost untouched.

How this is built

Pure client-side: no API, no backend, no build step. The container serves four static files from the Python standard library, so there are no dependencies to pin and nothing that can fail at container start. It runs scale-to-zero on Cloud Run and costs nothing while idle.

The chart is hand-rolled SVG — no chart library. It uses an emphasis encoding (the selected region in accent, the rest recessive) rather than a categorical palette, because the reader's job here is to compare one region against the field, not to tell nine series apart. Bar colours were checked for contrast against the page surface, and every plotted value is also available in the data table above.

Built by Man Patel — more work at manpatel.me/work.