diff --git a/codecarbon/emissions_tracker.py b/codecarbon/emissions_tracker.py
index 6bbf6db9e..57382fac7 100644
--- a/codecarbon/emissions_tracker.py
+++ b/codecarbon/emissions_tracker.py
@@ -341,6 +341,11 @@ def __init__(
self._cpu_power: Power = Power.from_watts(watts=0)
self._gpu_power: Power = Power.from_watts(watts=0)
self._ram_power: Power = Power.from_watts(watts=0)
+ # Running average tracking for power
+ self._cpu_power_sum: float = 0.0
+ self._gpu_power_sum: float = 0.0
+ self._ram_power_sum: float = 0.0
+ self._power_measurement_count: int = 0
self._measure_occurrence: int = 0
self._cloud = None
self._previous_emissions = None
@@ -751,6 +756,24 @@ def _prepare_emissions_data(self) -> EmissionsData:
on_cloud = "Y"
cloud_provider = cloud.provider
cloud_region = cloud.region
+
+ # Calculate average power values across all measurements
+ avg_cpu_power = (
+ self._cpu_power_sum / self._power_measurement_count
+ if self._power_measurement_count > 0
+ else self._cpu_power.W
+ )
+ avg_gpu_power = (
+ self._gpu_power_sum / self._power_measurement_count
+ if self._power_measurement_count > 0
+ else self._gpu_power.W
+ )
+ avg_ram_power = (
+ self._ram_power_sum / self._power_measurement_count
+ if self._power_measurement_count > 0
+ else self._ram_power.W
+ )
+
total_emissions = EmissionsData(
timestamp=datetime.now().strftime("%Y-%m-%dT%H:%M:%S"),
project_name=self._project_name,
@@ -759,9 +782,9 @@ def _prepare_emissions_data(self) -> EmissionsData:
duration=duration.seconds,
emissions=emissions, # kg
emissions_rate=emissions / duration.seconds, # kg/s
- cpu_power=self._cpu_power.W,
- gpu_power=self._gpu_power.W,
- ram_power=self._ram_power.W,
+ cpu_power=avg_cpu_power,
+ gpu_power=avg_gpu_power,
+ ram_power=avg_ram_power,
cpu_energy=self._total_cpu_energy.kWh,
gpu_energy=self._total_gpu_energy.kWh,
ram_energy=self._total_ram_energy.kWh,
@@ -849,6 +872,8 @@ def _do_measurements(self) -> None:
if isinstance(hardware, CPU):
self._total_cpu_energy += energy
self._cpu_power = power
+ # Accumulate for running average
+ self._cpu_power_sum += power.W
logger.info(
f"Delta energy consumed for CPU with {hardware._mode} : {energy.kWh:.6f} kWh"
+ f", power : {self._cpu_power.W} W"
@@ -859,6 +884,8 @@ def _do_measurements(self) -> None:
elif isinstance(hardware, GPU):
self._total_gpu_energy += energy
self._gpu_power = power
+ # Accumulate for running average
+ self._gpu_power_sum += power.W
logger.info(
f"Energy consumed for all GPUs : {self._total_gpu_energy.kWh:.6f} kWh"
+ f". Total GPU Power : {self._gpu_power.W} W"
@@ -866,6 +893,8 @@ def _do_measurements(self) -> None:
elif isinstance(hardware, RAM):
self._total_ram_energy += energy
self._ram_power = power
+ # Accumulate for running average
+ self._ram_power_sum += power.W
logger.info(
f"Energy consumed for RAM : {self._total_ram_energy.kWh:.6f} kWh"
+ f". RAM Power : {self._ram_power.W} W"
@@ -874,6 +903,8 @@ def _do_measurements(self) -> None:
if hardware.chip_part == "CPU":
self._total_cpu_energy += energy
self._cpu_power = power
+ # Accumulate for running average
+ self._cpu_power_sum += power.W
logger.info(
f"Energy consumed for all CPUs : {self._total_cpu_energy.kWh:.6f} kWh"
+ f". Total CPU Power : {self._cpu_power.W} W"
@@ -881,6 +912,8 @@ def _do_measurements(self) -> None:
elif hardware.chip_part == "GPU":
self._total_gpu_energy += energy
self._gpu_power = power
+ # Accumulate for running average
+ self._gpu_power_sum += power.W
logger.info(
f"Energy consumed for all GPUs : {self._total_gpu_energy.kWh:.6f} kWh"
+ f". Total GPU Power : {self._gpu_power.W} W"
@@ -891,6 +924,8 @@ def _do_measurements(self) -> None:
logger.debug(
f"Done measure for {hardware.__class__.__name__} - measurement time: {h_time:,.4f} s - last call {last_duration:,.2f} s"
)
+ # Increment measurement count for power averaging
+ self._power_measurement_count += 1
logger.info(
f"{self._total_energy.kWh:.6f} kWh of electricity and {self._total_water.litres:.6f} L of water were used since the beginning."
)
diff --git a/docs/edit/output.rst b/docs/edit/output.rst
index 2a6a4a369..478a32aca 100644
--- a/docs/edit/output.rst
+++ b/docs/edit/output.rst
@@ -30,11 +30,11 @@ input parameter (defaults to the current directory), for each experiment tracked
* - emissions_rate
- emissions divided per duration, in Kg/s
* - cpu_power
- - CPU power (W)
+ - Mean CPU power (W)
* - gpu_power
- - GPU power (W)
+ - Mean GPU power (W)
* - ram_power
- - RAM power (W)
+ - Mean RAM power (W)
* - cpu_energy
- Energy used per CPU (kWh)
* - gpu_energy
@@ -130,7 +130,7 @@ Logfire
Using CodeCarbon with logfire
`````````````````````````````````
-`Logfire `_ is an observability platform.
+`Logfire `_ is an observability platform.
CodeCarbon exposes all its metrics with the suffix `codecarbon_`.