Skip to content

Commit be73aec

Browse files
authored
Merge pull request #986 from salob/bug/985
report mean of cpu,gpu,ram from samples instead of just the latest
2 parents f44672f + 6b79dc3 commit be73aec

File tree

2 files changed

+42
-7
lines changed

2 files changed

+42
-7
lines changed

codecarbon/emissions_tracker.py

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,11 @@ def __init__(
341341
self._cpu_power: Power = Power.from_watts(watts=0)
342342
self._gpu_power: Power = Power.from_watts(watts=0)
343343
self._ram_power: Power = Power.from_watts(watts=0)
344+
# Running average tracking for power
345+
self._cpu_power_sum: float = 0.0
346+
self._gpu_power_sum: float = 0.0
347+
self._ram_power_sum: float = 0.0
348+
self._power_measurement_count: int = 0
344349
self._measure_occurrence: int = 0
345350
self._cloud = None
346351
self._previous_emissions = None
@@ -751,6 +756,24 @@ def _prepare_emissions_data(self) -> EmissionsData:
751756
on_cloud = "Y"
752757
cloud_provider = cloud.provider
753758
cloud_region = cloud.region
759+
760+
# Calculate average power values across all measurements
761+
avg_cpu_power = (
762+
self._cpu_power_sum / self._power_measurement_count
763+
if self._power_measurement_count > 0
764+
else self._cpu_power.W
765+
)
766+
avg_gpu_power = (
767+
self._gpu_power_sum / self._power_measurement_count
768+
if self._power_measurement_count > 0
769+
else self._gpu_power.W
770+
)
771+
avg_ram_power = (
772+
self._ram_power_sum / self._power_measurement_count
773+
if self._power_measurement_count > 0
774+
else self._ram_power.W
775+
)
776+
754777
total_emissions = EmissionsData(
755778
timestamp=datetime.now().strftime("%Y-%m-%dT%H:%M:%S"),
756779
project_name=self._project_name,
@@ -759,9 +782,9 @@ def _prepare_emissions_data(self) -> EmissionsData:
759782
duration=duration.seconds,
760783
emissions=emissions, # kg
761784
emissions_rate=emissions / duration.seconds, # kg/s
762-
cpu_power=self._cpu_power.W,
763-
gpu_power=self._gpu_power.W,
764-
ram_power=self._ram_power.W,
785+
cpu_power=avg_cpu_power,
786+
gpu_power=avg_gpu_power,
787+
ram_power=avg_ram_power,
765788
cpu_energy=self._total_cpu_energy.kWh,
766789
gpu_energy=self._total_gpu_energy.kWh,
767790
ram_energy=self._total_ram_energy.kWh,
@@ -849,6 +872,8 @@ def _do_measurements(self) -> None:
849872
if isinstance(hardware, CPU):
850873
self._total_cpu_energy += energy
851874
self._cpu_power = power
875+
# Accumulate for running average
876+
self._cpu_power_sum += power.W
852877
logger.info(
853878
f"Delta energy consumed for CPU with {hardware._mode} : {energy.kWh:.6f} kWh"
854879
+ f", power : {self._cpu_power.W} W"
@@ -859,13 +884,17 @@ def _do_measurements(self) -> None:
859884
elif isinstance(hardware, GPU):
860885
self._total_gpu_energy += energy
861886
self._gpu_power = power
887+
# Accumulate for running average
888+
self._gpu_power_sum += power.W
862889
logger.info(
863890
f"Energy consumed for all GPUs : {self._total_gpu_energy.kWh:.6f} kWh"
864891
+ f". Total GPU Power : {self._gpu_power.W} W"
865892
)
866893
elif isinstance(hardware, RAM):
867894
self._total_ram_energy += energy
868895
self._ram_power = power
896+
# Accumulate for running average
897+
self._ram_power_sum += power.W
869898
logger.info(
870899
f"Energy consumed for RAM : {self._total_ram_energy.kWh:.6f} kWh"
871900
+ f". RAM Power : {self._ram_power.W} W"
@@ -874,13 +903,17 @@ def _do_measurements(self) -> None:
874903
if hardware.chip_part == "CPU":
875904
self._total_cpu_energy += energy
876905
self._cpu_power = power
906+
# Accumulate for running average
907+
self._cpu_power_sum += power.W
877908
logger.info(
878909
f"Energy consumed for all CPUs : {self._total_cpu_energy.kWh:.6f} kWh"
879910
+ f". Total CPU Power : {self._cpu_power.W} W"
880911
)
881912
elif hardware.chip_part == "GPU":
882913
self._total_gpu_energy += energy
883914
self._gpu_power = power
915+
# Accumulate for running average
916+
self._gpu_power_sum += power.W
884917
logger.info(
885918
f"Energy consumed for all GPUs : {self._total_gpu_energy.kWh:.6f} kWh"
886919
+ f". Total GPU Power : {self._gpu_power.W} W"
@@ -891,6 +924,8 @@ def _do_measurements(self) -> None:
891924
logger.debug(
892925
f"Done measure for {hardware.__class__.__name__} - measurement time: {h_time:,.4f} s - last call {last_duration:,.2f} s"
893926
)
927+
# Increment measurement count for power averaging
928+
self._power_measurement_count += 1
894929
logger.info(
895930
f"{self._total_energy.kWh:.6f} kWh of electricity and {self._total_water.litres:.6f} L of water were used since the beginning."
896931
)

docs/edit/output.rst

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ input parameter (defaults to the current directory), for each experiment tracked
3030
* - emissions_rate
3131
- emissions divided per duration, in Kg/s
3232
* - cpu_power
33-
- CPU power (W)
33+
- Mean CPU power (W)
3434
* - gpu_power
35-
- GPU power (W)
35+
- Mean GPU power (W)
3636
* - ram_power
37-
- RAM power (W)
37+
- Mean RAM power (W)
3838
* - cpu_energy
3939
- Energy used per CPU (kWh)
4040
* - gpu_energy
@@ -130,7 +130,7 @@ Logfire
130130
Using CodeCarbon with logfire
131131
`````````````````````````````````
132132

133-
`Logfire <https://docs.pydantic.dev/logfire/>`_ is an observability platform.
133+
`Logfire <https://docs.pydantic.dev/logfire/>`_ is an observability platform.
134134

135135
CodeCarbon exposes all its metrics with the suffix `codecarbon_`.
136136

0 commit comments

Comments
 (0)