Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 10 additions & 14 deletions simvue/eco/emissions_monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,6 @@ def estimate_co2_emissions(

if self.co2_intensity:
_current_co2_intensity = self.co2_intensity
_co2_units = "kgCO2/kWh"
else:
self.check_refresh()
# If no local data yet then return
Expand All @@ -251,10 +250,8 @@ def estimate_co2_emissions(
**self._local_data[_country_code]
)
_current_co2_intensity = self._current_co2_data.data.carbon_intensity
_co2_units = self._current_co2_data.carbon_intensity_units
_process.gpu_percentage = gpu_percent
_process.cpu_percentage = cpu_percent
_previous_energy: float = _process.total_energy
_process.power_usage = (_process.cpu_percentage / 100.0) * (
self.thermal_design_power_per_cpu / self.n_cores_per_cpu
)
Expand All @@ -263,22 +260,21 @@ def estimate_co2_emissions(
_process.power_usage += (
_process.gpu_percentage / 100.0
) * self.thermal_design_power_per_gpu
# Convert W to kW
_process.power_usage /= 1000
# Measure energy in kWh
_process.energy_delta = _process.power_usage * measure_interval / 3600
_process.total_energy += _process.energy_delta

_process.total_energy += _process.power_usage * measure_interval
_process.energy_delta = _process.total_energy - _previous_energy

# Measured value is in g/kWh, convert to kg/kWs
_carbon_intensity_kgpws: float = _current_co2_intensity / (60 * 60 * 1e3)

_process.co2_delta = (
_process.power_usage * _carbon_intensity_kgpws * measure_interval
)
# Measured value is in g/kWh, convert to kg/kWh
_carbon_intensity: float = _current_co2_intensity / 1000

_process.co2_delta = _process.energy_delta * _carbon_intensity
_process.co2_emission += _process.co2_delta

self._logger.debug(
f"📝 For process '{process_id}', recorded: CPU={_process.cpu_percentage:.2f}%, "
f"Power={_process.power_usage:.2f}W, CO2={_process.co2_emission:.2e}{_co2_units}"
f"📝 For process '{process_id}', in interval {measure_interval}, recorded: CPU={_process.cpu_percentage:.2f}%, "
f"Power={_process.power_usage:.2f}kW, Energy = {_process.energy_delta}kWh, CO2={_process.co2_delta:.2e}kg"
)

def simvue_metrics(self) -> dict[str, float]:
Expand Down
16 changes: 7 additions & 9 deletions tests/unit/test_ecoclient.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import pytest
import time
import pytest_mock

import pytest
import simvue.eco.api_client as sv_eco_api
import simvue.eco.emissions_monitor as sv_eco_ems

Expand Down Expand Up @@ -81,17 +81,15 @@ def test_co2_monitor_properties(mock_co2_signal) -> None:
assert _ems_monitor.process_data["test_co2_monitor_properties"]

# Will use this equation
# Power used = (TDP_cpu * cpu_percent / num_cores) + (TDP_gpu * gpu_percent)
assert _ems_monitor.total_power_usage == (80 * 0.2 * 1 / 4) + (130 * 0.4 * 1)
# Power used = (TDP_cpu * cpu_percent / num_cores) + (TDP_gpu * gpu_percent) / 1000 (for kW)
assert _ems_monitor.total_power_usage == pytest.approx(((80 * 0.2 * 1 / 4) + (130 * 0.4 * 1)) / 1000)

# Energy used = power used * measure interval
assert _ems_monitor.total_energy == _ems_monitor.total_power_usage * 2
# Energy used = power used * measure interval / 3600 (for kWh)
assert _ems_monitor.total_energy == pytest.approx(_ems_monitor.total_power_usage * 2 / 3600)

# CO2 emission = energy * CO2 intensity
# Need to convert CO2 intensity from g/kWh to kg/kWs
# So divide by 1000 (g -> kg)
# And divide by 60*60 (kWh -> kws)
assert _ems_monitor.total_co2_emission == _ems_monitor.total_energy * 40 / (60*60*1000)
# Need to convert CO2 intensity from g/kWh to kg/kWh, so divide by 1000
assert _ems_monitor.total_co2_emission == pytest.approx(_ems_monitor.total_energy * 40 / 1000)

_ems_monitor.estimate_co2_emissions(**_measure_params)
# Check delta is half of total, since we've now called this twice
Expand Down
Loading