AWS Builder Center

Thirst: Every GPU Hour Drinks Water Twice, So We Built a Planner and a Receipt for It

Thirst helps people in India run GPU jobs at the right hour and the right speed, then proves the water and CO₂ cost with a signed receipt. Built on Amplify, API Gateway, Lambda, DynamoDB and EventBridge for the Environmental Hacks hackathon (WeMakeDevs × AWS).

Built for Environmental Hacks (WeMakeDevs × AWS), Track : Heat and Water, by team hello_world.
Live website:  https://main.dzxkrtlc7xqfx.amplifyapp.com  Install the CLI:  pip install thirst  Code:  https://github.com/Neal006/Thirst 



The problem nobody sees

Imagine you are a master's student in Chennai. You start a 6-hour LoRA fine-tune on two RTX 4090s before going to sleep. You see a loss curve in the morning. You do not see the water.
Every kWh of GPU energy uses water twice:
  1. At the power plant that generates the electricity (coal plants evaporate a lot of water).
  1. At the building that removes the heat (room AC or cooling towers).

In Chennai, Delhi or Bengaluru, that water is already scarce. Yet nobody planning a training job gets to see this cost, and nothing rewards the people who choose well.
So we built Thirst: a free tool that answers one question before a job starts ("when and how fast should I run this?") and one after it ends ("what did it really cost in water and CO₂?").



What Thirst does


Thirst has four steps:
Step
What happens
1. Plan
You enter GPU model, count, hours of work, deadline and city. The planner finds the start time, pauses and power cap that use the least water and CO₂ and still meet your deadline.
2. Run
thirst run waits for the right hour, lowers the GPU power limit, runs your script, pauses and resumes if planned, and always restores the power limit, even on Ctrl-C.
3. Receipt
When the job ends you get a signed receipt: energy measured from the GPU, water and CO₂ modelled from it, compared with "if you had started right away".
4. Rating
Receipts add up to a fair public score per lab, on a leaderboard grouped by lab size.

.



The water clock

The first thing you see is the water clock: your city's next 24 hours on one dial. Longer teal wedges mean thirstier hours (more water per kWh). The amber RUN arc marks the best window.
Show Image Upload: clock.png
Every number carries a tag (modelled, measured, placeholder). Click any tag to see its value, range and source.



Plan a job in one screen

You fill in a short form (with quick-fill buttons like "Overnight fine-tune") and get a plain sentence, for example: "Start now, GPU at 70%, done by 21:25." A line underneath explains why. In the screenshot below, the cleanest hours fall after the deadline, so the planner picks the cleanest time that still finishes on time.

It works at phone width too, because judges and students open links on their phones:

Savings are always shown as ranges ("19 to 20% less water, modelled"), never as a single over-confident number. We also translate litres into person-days of city water (135 L per person per day, the CPHEEO norm), so the stake is visible to the people who live in these cities.



Same job, two start times

The "beakers" view shows the same job started now versus started on the plan. It splits water into power-plant water and building water, with tabs for a lab with room AC and a data centre with a cooling tower.




Not just when, but how fast

Shifting a job to a different hour mostly moves water use around. It becomes a real cut only when it uses midday solar that would otherwise be wasted. The lever that is always a real cut is power capping: a GPU at 70% power takes a little longer but needs noticeably less energy for the same work.

Lever
Real cut or a shift?
Slow the GPU a little
Real cut. Less energy means less water and CO₂.
Pick better hours
Mostly a shift. Becomes a cut when it uses midday solar.
Receipt and rating
Behaviour change over months, across many labs.
We never claim to "reverse" water use.



Run it, schedule it, share it

Once you have a plan, the page gives you the exact command to copy, a calendar entry with a reminder, and a share link that reopens the same job.

bash
Bash
pip install thirst

thirst register --name "CSE GPU Lab" --city Chennai --cooling room_ac --gpus 4
thirst run --hours 6 --deadline "2026-10-12 09:00" --pausable -- python train.py
Thirst waits, runs, measures energy from the GPU (NVML), and prints a receipt. This is the layout of a receipt:
text
text
Thirst receipt j_tksft2nswiku
Ran 11 Oct 02:00 to 08:40 IST on 2 x NVIDIA GeForce RTX 4090, cap 70%
Energy 3.89 kWh GPU (measured)
Water 16.5 L (modelled); if you had started right away: 21.0 L
Carbon 4.81 kg CO2 (modelled); if you had started right away: 6.12 kg
Capture You took 86% of the possible saving
Score Site score 82 (Provisional)
(Example layout. Real numbers come from your GPU and the planner.)
A few safety rules we care about:
  • Thirst always restores the GPU power limit, on exit, on Ctrl-C and on crash.
  • If the power limit cannot be changed (many laptops block it), the job runs normally and the receipt says "uncapped".
  •  --modelled  lets machines without an NVIDIA GPU estimate energy, and the receipt says so.
  •  thirst doctor  checks your GPU, permissions, clock and API connection.



Compare cities

Kabir, an ML engineer renting GPUs in Hyderabad, may want to know where the same job costs less water. The Cities page runs the same job in all six seed cities (Chennai, Bengaluru, Hyderabad, Mumbai, Delhi, Pune), with a 48-hour strip, water for the job and the saving, for room AC or a cooling tower.




A fair score: judge the choice, not the climate

If we ranked labs by raw litres, a lab next to a dam would always beat a lab next to a coal plant, which is unfair. So Thirst scores one question:
Of the saving that was possible for this job, how much did you actually take?
text
text
1 − J(actual)
Capture = ─────────────────
1 − J(best)
Here J is a mix of water, CO₂ and energy compared with "start now". Every job starts from its own "start now" baseline, so labs in very different places can both score high.
Weight classes, like boxing:
Class
Size
D1
Small labs, up to 16 GPUs (college labs live here)
D2
Clusters, 17 to 256
D3
Facilities, 257 to 4,096
D4
Hyperscale, above 4,096
Badges: Bronze 45+, Silver 60+, Gold 75+, Platinum 90+.

Each lab gets a page showing its score, which parts of the score are rated, and how many points remain to the next badge. Part B (building efficiency) says "Not rated" until metered building data exists, and the score carries a Provisional tag, because we would rather be honest than look finished.

No gaming it: the start time comes from the server, receipts are signed (HMAC-SHA256), energy above what the GPUs can physically draw is rejected, and urgent jobs with no room to shift are left out instead of punished. Sites that did not opt in are never ranked. The demo sites on the board are clearly tagged Simulated.



Every number wears a label

This is the part we care about most. Every number in Thirst has a tag:
Label
Meaning
measured
Read from the hardware on your machine
modelled
Calculated from a model; the Assumptions page shows how
sourced
Taken from a published source we cite
calibrated
Adjusted so the model matches a published yearly figure
placeholder
A stand-in until we measure the real value
The Assumptions page lists every factor with its value, unit, source and status, and explains the words we use (PUE, water stress, capture and so on) in plain language.

Energy is measured from the GPU. Water and CO₂ are modelled from that energy using the average grid mix (not the marginal plant), and we leave out the water and carbon used to manufacture the GPU. We say so on the page.



How we built it on AWS

Plain text
You ──► AWS Amplify (React site) ──► Amazon API Gateway ──► AWS Lambda (planner + scores) ──► Amazon DynamoDB
thirst CLI (signed receipts) ───────────────────────────────┘
Amazon EventBridge Scheduler (hourly) ──► Lambda (weather refresh) ──► DynamoDB
└──► Open-Meteo
Amazon Bedrock + Strands Agents ──► plain-English explanation (Lambda)
Service
What we use it for
AWS Amplify
Hosts the React website at a public URL
Amazon API Gateway
Front door for the website and the CLI
AWS Lambda
The planner, the score engine, receipt checks, and the weather refresh
Amazon DynamoDB
Sites, receipts, scores, and cached forecasts
Amazon EventBridge Scheduler
Refreshes the weather forecast every hour
Amazon Bedrock + Strands Agents
Plain-words explanation of the plan (see "What is not done yet")
AWS SAM
Infrastructure as code for the backend
GitHub Actions + OIDC
Deploys after CI passes, with no stored AWS keys
There are no servers to babysit and no GPUs on AWS. The GPU work happens on the user's own machine, and AWS handles planning, scoring and the public board. That keeps the running cost very low, which matters for a tool meant for students.
One design decision matters most: the maths decides, the AI only explains. The planner is plain optimisation code that works without AWS and without any AI. The optional Bedrock agent only turns the plan into three plain sentences, and its answer is rejected if it invents a number. A template explanation is served when the agent is not available. For a tool whose whole point is honest numbers, we did not want a language model making the decisions.



What is honest to say is not done yet

We would rather list the gaps ourselves:
  • The power-cap curve is a placeholder. We have not yet measured the speed and energy trade-off (100%, 85%, 70%) on a desktop GPU. Until we do, every plan picks 70%, all 11 water-versus-carbon options give the same plan, and the planner hides the slider and says why. The app labels these numbers as placeholders.
  • The Bedrock/Strands explanation is pending account access. The template explanation is live meanwhile.
  • Water stress per city is a placeholder pending the WRI Aqueduct data.
  • The "India finding" chart (which hours are best for water versus carbon) and the extra boards (Most improved, Basin guardian) are not built.
  • Leaderboard sites are simulated and tagged as such.

Quality checks

  • About 1,800 unit and integration tests run in CI.
  • Playwright tests run against the live site on desktop and phone, with axe accessibility checks.
  • The CLI is published on PyPI ( pip install thirst , version 0.3.2) and supports 42 GPU models.



What we learned

  1. Be loud about uncertainty. Tagging every number as measured, modelled or placeholder made the product more trustworthy and made us argue less about what the data really says.
  1. Serverless fits a hackathon (and a student tool). Lambda, DynamoDB and Amplify meant no infrastructure to run, and the cost stays near zero when nobody is using it.
  1. Use AI where it helps, not where it decides. The solver decides. The language model explains.
  1. Fair scoring is a design problem. Comparing each job with its own "start now" baseline, and grouping labs by size, was the difference between a leaderboard that rewards the rich and one that rewards good choices.

What is next

  • Measure the power-cap sweep on a desktop GPU and replace the placeholders.
  • Turn on the Bedrock and Strands Agents explanation.
  • Add hourly grid mix from CSEP or Ember for each region.
  • Add checkpoint-based pausing and a Slurm plugin so more labs can use it.
  • Onboard the first college labs.



Try it

  1. Open the site:  https://main.dzxkrtlc7xqfx.amplifyapp.com  and press Plan a job.
  1. On a GPU machine:  pip install thirst , then  thirst register  and  thirst run .
  1. Read the Assumptions page and tell us which number you do not trust. We will label it better.



AI tools used

  • Claude Code (Anthropic, Claude Opus and Claude Sonnet models) helped plan, write, test and review the code, and set up AWS and CI. Commits it helped write carry a  Co-Authored-By: Claude  trailer.
  • Amazon Bedrock + Strands Agents, inside the product, only explain a plan in plain words. The solver makes every decision.

Credits

Weather by Open-Meteo (CC BY 4.0). Grid CO₂ factor from CEA. Coal water limits from MoEFCC. Water stress from WRI Aqueduct. City water norm from CPHEEO. National generation mix from the CSEP Electricity and Carbon Tracker.
Built by team hello_world for Environmental Hacks (WeMakeDevs × AWS). MIT licence.
Any opinions in this article are those of the individual author and may not reflect the opinions of AWS.
Enjoyed reading this content? Let the author know!

Your likes, comments, shares, and saves help creators reach more builders.

Loading recommendations

Loading article