@@ -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 )
0 commit comments