Skip to content
This repository was archived by the owner on Oct 22, 2025. It is now read-only.
328 changes: 328 additions & 0 deletions examples/compute_emissons.ipynb

Large diffs are not rendered by default.

16 changes: 12 additions & 4 deletions examples/my_experiment.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import sys
import tempfile

sys.path.append('../')
sys.path.append('./')
import torch

from experiment_impact_tracker.compute_tracker import ImpactTracker
Expand Down Expand Up @@ -47,13 +48,16 @@ def train(self):
self.w2 -= self.learning_rate * grad_w2


def my_experiment() -> None:
def my_experiment(region_coords=None) -> None:
tmp_dir = tempfile.mkdtemp()
# Init tracker with log path
tracker = ImpactTracker(tmp_dir)
tracker = ImpactTracker(tmp_dir,region_coords)
# Start tracker in a separate process
tracker.launch_impact_monitor()

print(tracker.initial_info['region'])
print('')
print(tracker.initial_info['region_carbon_intensity_estimate'])
exp = Experiment()

for t in range(100):
Expand All @@ -67,4 +71,8 @@ def my_experiment() -> None:


if __name__ == "__main__":
my_experiment()

# Example latitude and longitude by city
# MTL:(45.4972159,-73.6103642), NYC:(40.741895,-73.989308), Pune:(18.521428,73.8544541), Paris:(48.8566969,2.3514616)
REGION_COORDS = (45.4972159,-73.6103642)
my_experiment(REGION_COORDS)
32 changes: 20 additions & 12 deletions experiment_impact_tracker/compute_tracker.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,15 @@
from experiment_impact_tracker.cpu import rapl
from experiment_impact_tracker.cpu.common import get_my_cpu_info
from experiment_impact_tracker.cpu.intel import get_intel_power, get_rapl_power
from experiment_impact_tracker.data_info_and_router import (DATA_HEADERS,
INITIAL_INFO)

#import wrapper for DATA_HEADERS, INITIAL_INFO
from experiment_impact_tracker.data_info_and_router import get_initial_info, get_data_headers

from experiment_impact_tracker.data_utils import *
from experiment_impact_tracker.emissions.common import \
is_capable_realtime_carbon_intensity
from experiment_impact_tracker.emissions.get_region_metrics import \
get_current_region_info_cached
get_current_region_info_cached, get_region_info
from experiment_impact_tracker.gpu.nvidia import (get_gpu_info,
get_nvidia_gpu_power)
from experiment_impact_tracker.utils import (get_timestamp, processify,
Expand Down Expand Up @@ -73,7 +75,7 @@ def read_latest_stats(log_dir):
return None


def _sample_and_log_power(log_dir, initial_info, logger=None):
def _sample_and_log_power(log_dir, region_coords, initial_info, logger=None):
"""
Iterates over compatible metrics and logs the relevant information.

Expand All @@ -90,7 +92,8 @@ def _sample_and_log_power(log_dir, initial_info, logger=None):
set(process_ids)
) # dedupe so that we don't double count by accident

required_headers = _get_compatible_data_headers(get_current_region_info_cached()[0])
#required_headers = _get_compatible_data_headers(get_current_region_info_cached()[0])
required_headers = _get_compatible_data_headers(get_region_info(region_coords)[0])

header_information = {}

Expand Down Expand Up @@ -135,7 +138,7 @@ def _sample_and_log_power(log_dir, initial_info, logger=None):


@processify
def launch_power_monitor(queue, log_dir, initial_info, logger=None):
def launch_power_monitor(queue, log_dir, region_coords, initial_info, logger=None):
"""
Launches a separate process which monitors metrics

Expand All @@ -158,7 +161,7 @@ def launch_power_monitor(queue, log_dir, initial_info, logger=None):
pass

try:
_sample_and_log_power(log_dir, initial_info, logger=logger)
_sample_and_log_power(log_dir, region_coords, initial_info, logger=logger)
except:
ex_type, ex_value, tb = sys.exc_info()
logger.error("Encountered exception within power monitor thread!")
Expand All @@ -175,6 +178,7 @@ def _get_compatible_data_headers(region=None):
:return: which headers are compatible
"""
compatible_headers = []
DATA_HEADERS = get_data_headers()

for header in DATA_HEADERS:
compat = True
Expand Down Expand Up @@ -203,7 +207,7 @@ def _validate_compatabilities(compatabilities, *args, **kwargs):
return True


def gather_initial_info(log_dir: str):
def gather_initial_info(log_dir: str, region_coords=None):
"""Log one time info

For example, CPU/GPU info, version of this package, region, datetime for start of experiment,
Expand All @@ -216,7 +220,10 @@ def gather_initial_info(log_dir: str):
info_path = safe_file_path(os.path.join(log_dir, INFOPATH))

data = {}


print('Region coords: {}'.format(region_coords))
INITIAL_INFO = get_initial_info(region_coords)

# Gather all the one-time info specified by the appropriate router
for info_ in INITIAL_INFO:
key = info_["name"]
Expand All @@ -239,11 +246,12 @@ def gather_initial_info(log_dir: str):


class ImpactTracker(object):
def __init__(self, logdir):
def __init__(self, logdir, region_coords=None):
self.logdir = logdir
self.region_coords = region_coords
self._setup_logging()
self.logger.info("Gathering system info for reproducibility...")
self.initial_info = gather_initial_info(logdir)
self.initial_info = gather_initial_info(logdir, region_coords)
self.logger.info("Done initial setup and information gathering...")
self.launched = False

Expand Down Expand Up @@ -292,7 +300,7 @@ def launch_impact_monitor(self):
# OS X multiprocessing starts processes with spawn instead of fork
multiprocessing.set_start_method("fork")
self.p, self.queue = launch_power_monitor(
self.logdir, self.initial_info, self.logger
self.logdir, self.region_coords, self.initial_info, self.logger
)

def _terminate_monitor_and_log_final_info(p):
Expand Down
Loading