Navigation
๐Ÿญ Platform & Infrastructureยท 8 min read

Carbon & Energy Awareness

Per-GPU power consumption, PUE, carbon intensity by grid, carbon-aware scheduling, and renewable energy strategies.

carbonenergypuesustainabilityrenewablepower-consumption

AI infrastructure is energy-intensive: a single H100 draws 700W, and a 1000-GPU cluster consumes ~1 MW continuously. As AI scales, energy cost becomes a significant OpEx component, and carbon footprint becomes a regulatory and reputational concern.


1. GPU Power Consumption

GPUTDP (Watts)Typical inference (W)Typical training (W)
T47040-6060-70
A100 SXM400200-300350-400
H100 SXM700350-550600-700
H200 SXM700350-550600-700
B200 SXM1000500-800900-1000
GB200 NVL72 (per GPU)1200600-9001000-1200

Cluster Power

def cluster_power_kw(
    num_gpus: int,
    gpu_tdp_watts: int,
    utilization: float = 0.75,
    pue: float = 1.3,
) -> dict:
    """Calculate total facility power draw."""
    gpu_power_kw = num_gpus * gpu_tdp_watts * utilization / 1000
    
    # Non-GPU server power (CPU, RAM, NVMe, NICs): ~30% of GPU power
    server_overhead_kw = gpu_power_kw * 0.30
    
    # IT load
    it_power_kw = gpu_power_kw + server_overhead_kw
    
    # Total with cooling + facility overhead (PUE)
    total_power_kw = it_power_kw * pue
    
    return {
        "gpu_power_kw": gpu_power_kw,
        "it_power_kw": it_power_kw,
        "total_facility_kw": total_power_kw,
        "cooling_overhead_kw": total_power_kw - it_power_kw,
        "annual_kwh": total_power_kw * 8760,
        "annual_cost_usd": total_power_kw * 8760 * 0.08,  # $0.08/kWh
    }

# 1000 H100 cluster:
result = cluster_power_kw(1000, 700, 0.75, 1.3)
# GPU power: 525 kW
# IT power: 682 kW  
# Total facility: 887 kW (~1 MW)
# Annual: 7.77 GWh
# Annual cost: $621K

2. PUE (Power Usage Effectiveness)

PUE = Total facility power / IT equipment power. Lower is better:

Cooling typeTypical PUENotes
Air-cooled (basic)1.4-1.6Cheapest, lowest density
Air-cooled (optimized)1.2-1.4Hot/cold aisle containment
Direct liquid cooling (DLC)1.05-1.15Required for H100/B200 dense racks
Immersion cooling1.02-1.08Lowest PUE, highest upfront cost

Impact: Going from PUE 1.4 to 1.1 saves ~21% on total power cost.

# Annual savings from PUE improvement
it_power_kw = 682  # 1000 H100s + servers
pue_old, pue_new = 1.4, 1.1
savings_kw = it_power_kw * (pue_old - pue_new)  # 204 kW saved
annual_savings = savings_kw * 8760 * 0.08  # $143K/year

3. Carbon Intensity

The same kWh produces vastly different carbon depending on the grid:

Grid / RegionCarbon intensity (gCO2/kWh)Example locations
Hydro-dominant20-50Quebec, Norway, Iceland
Nuclear + renewable50-100France, Sweden, Ontario
Mixed (US average)350-450Most US states
Coal-heavy500-900Parts of India, China, Poland
def annual_carbon_tonnes(
    annual_kwh: float,
    carbon_intensity_g_per_kwh: float,
) -> float:
    return annual_kwh * carbon_intensity_g_per_kwh / 1_000_000

# 1000 H100 cluster, 7.77 GWh/year:
# Quebec (hydro):   7.77M ร— 30  / 1M = 233 tonnes CO2
# US average:       7.77M ร— 400 / 1M = 3,108 tonnes CO2
# Coal grid:        7.77M ร— 800 / 1M = 6,216 tonnes CO2
# โ†’ 27ร— difference based on location

4. Carbon-Aware Scheduling

Shift flexible workloads to low-carbon hours:

class CarbonAwareScheduler:
    """Schedule batch jobs during low-carbon grid periods."""
    
    async def schedule(self, job: BatchJob):
        if job.is_latency_sensitive:
            return await self.run_immediately(job)
        
        # Get carbon forecast for next 24 hours
        forecast = await self.carbon_api.get_forecast(
            region=self.region,
            hours=24,
        )
        
        # Find lowest-carbon window that fits the job
        best_window = min(
            forecast.windows,
            key=lambda w: w.carbon_intensity
                if w.duration >= job.estimated_hours else float('inf')
        )
        
        if best_window.carbon_intensity < forecast.current.carbon_intensity * 0.7:
            # Wait for 30%+ carbon reduction
            return await self.schedule_at(job, best_window.start_time)
        else:
            # Not worth waiting
            return await self.run_immediately(job)

What Can Be Shifted

WorkloadShiftable?Typical flexibility
Interactive inferenceNoMust serve immediately
Batch inferenceYesHours to days
Training (long-running)PartiallyCan pause/resume
Evaluation runsYesHours
Data preprocessingYesHours to days
Model export/conversionYesHours

5. Renewable Energy Strategies

StrategyCostCarbon reductionComplexity
Renewable Energy Certificates (RECs)LowAccounting only (no physical change)Low
Power Purchase Agreement (PPA)MediumReal if additiveMedium
On-site solar/windHigh upfrontReal, limited by spaceHigh
Grid-matched 24/7HighHighestVery high
Low-carbon locationVariesHighest impact decisionMedium

Biggest single decision: Where to build. Quebec at 30g CO2/kWh vs Texas at 400g CO2/kWh means 13ร— less carbon for the same workload.


6. Water Usage (WUE)

Cooling systems consume water:

Water Usage Effectiveness (WUE) = Annual water usage (liters) / IT energy (kWh)

Air cooling (evaporative): WUE = 1.0-2.0 L/kWh
Direct liquid cooling:     WUE = 0.1-0.5 L/kWh (mostly closed-loop)
Immersion cooling:         WUE โ‰ˆ 0 L/kWh (fully closed-loop)

1000 H100 cluster, air cooled:
  Annual water: 6M kWh ร— 1.5 L/kWh = 9M liters (2.4M gallons)
  Same cluster, DLC: 6M ร— 0.2 = 1.2M liters

Self-Check

  • Calculate total facility power for a 1000-GPU cluster including PUE
  • Compare annual carbon emissions across different grid regions
  • Design a carbon-aware scheduler for batch workloads
  • Estimate the PUE improvement from switching air cooling to DLC
  • Evaluate renewable energy strategies by cost, impact, and complexity

References