Skip to content

Commit bae99c4

Browse files
committed
Added support for codecarbon in offline mode
1 parent a560a82 commit bae99c4

File tree

3 files changed

+70
-10
lines changed

3 files changed

+70
-10
lines changed

simvue/config/parameters.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def check_token(cls, v: typing.Any) -> str | None:
4848

4949
class OfflineSpecifications(pydantic.BaseModel):
5050
cache: pathlib.Path | None = None
51+
country_iso_code: str | None = None
5152

5253

5354
class MetricsSpecifications(pydantic.BaseModel):

simvue/eco.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import logging
33
import datetime
44

5-
from codecarbon import EmissionsTracker
5+
from codecarbon import EmissionsTracker, OfflineEmissionsTracker
66
from codecarbon.output import BaseOutput as cc_BaseOutput
77
from simvue.utilities import simvue_timestamp
88

@@ -101,3 +101,32 @@ def post_init(self) -> None:
101101
self._set_from_conf(self._simvue_run._id, "experiment_id")
102102
self._set_from_conf(self._simvue_run._name, "experiment_name")
103103
self.start()
104+
105+
106+
class OfflineSimvueEmissionsTracker(OfflineEmissionsTracker):
107+
def __init__(
108+
self, project_name: str, simvue_run: "Run", metrics_interval: int
109+
) -> None:
110+
self._simvue_run = simvue_run
111+
logger.setLevel(logging.ERROR)
112+
super().__init__(
113+
country_iso_code=simvue_run._user_config.offline.country_iso_code,
114+
project_name=project_name,
115+
measure_power_secs=metrics_interval,
116+
api_call_interval=1,
117+
experiment_id=None,
118+
experiment_name=None,
119+
logging_logger=CodeCarbonOutput(simvue_run),
120+
save_to_logger=True,
121+
allow_multiple_runs=True,
122+
log_level="error",
123+
)
124+
125+
def set_measure_interval(self, interval: int) -> None:
126+
"""Set the measure interval"""
127+
self._set_from_conf(interval, "measure_power_secs")
128+
129+
def post_init(self) -> None:
130+
self._set_from_conf(self._simvue_run._id, "experiment_id")
131+
self._set_from_conf(self._simvue_run._name, "experiment_name")
132+
self.start()

simvue/run.py

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
from .models import FOLDER_REGEX, NAME_REGEX, MetricKeyString
4444
from .system import get_system
4545
from .metadata import git_info, environment
46-
from .eco import SimvueEmissionsTracker
46+
from .eco import SimvueEmissionsTracker, OfflineSimvueEmissionsTracker
4747
from .utilities import (
4848
skip_if_failed,
4949
validate_timestamp,
@@ -208,11 +208,28 @@ def __init__(
208208
)
209209
else self._user_config.metrics.emission_metrics_interval
210210
)
211-
self._emissions_tracker: SimvueEmissionsTracker | None = (
212-
SimvueEmissionsTracker("simvue", self, self._emission_metrics_interval)
213-
if self._user_config.metrics.enable_emission_metrics
214-
else None
215-
)
211+
if mode == "offline":
212+
if (
213+
self._user_config.metrics.enable_emission_metrics
214+
and not self._user_config.offline.country_iso_code
215+
):
216+
raise ValueError(
217+
"Country ISO code must be provided if tracking emissions metrics in offline mode."
218+
)
219+
220+
self._emissions_tracker: OfflineSimvueEmissionsTracker | None = (
221+
OfflineSimvueEmissionsTracker(
222+
"simvue", self, self._emission_metrics_interval
223+
)
224+
if self._user_config.metrics.enable_emission_metrics
225+
else None
226+
)
227+
else:
228+
self._emissions_tracker: SimvueEmissionsTracker | None = (
229+
SimvueEmissionsTracker("simvue", self, self._emission_metrics_interval)
230+
if self._user_config.metrics.enable_emission_metrics
231+
else None
232+
)
216233

217234
def __enter__(self) -> Self:
218235
return self
@@ -1028,9 +1045,22 @@ def config(
10281045
self._emission_metrics_interval = emission_metrics_interval
10291046

10301047
if enable_emission_metrics:
1031-
self._emissions_tracker = SimvueEmissionsTracker(
1032-
"simvue", self, self._emission_metrics_interval
1033-
)
1048+
if self._user_config.run.mode == "offline":
1049+
if not self._user_config.offline.country_iso_code:
1050+
self._error(
1051+
"Country ISO code must be provided if tracking emissions metrics in offline mode."
1052+
)
1053+
self._emissions_tracker: OfflineSimvueEmissionsTracker = (
1054+
OfflineSimvueEmissionsTracker(
1055+
"simvue", self, self._emission_metrics_interval
1056+
)
1057+
)
1058+
else:
1059+
self._emissions_tracker: SimvueEmissionsTracker = (
1060+
SimvueEmissionsTracker(
1061+
"simvue", self, self._emission_metrics_interval
1062+
)
1063+
)
10341064

10351065
# If the main Run API object is initialised the run is active
10361066
# hence the tracker should start too

0 commit comments

Comments
 (0)