Skip to content

Commit f045b0e

Browse files
authored
feat(lit-logger): metrics show metrics (#53)
1 parent 2d595b2 commit f045b0e

4 files changed

Lines changed: 79 additions & 0 deletions

File tree

src/litlogger/experiment_support.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,18 @@ def rebuild_state(exp: "Experiment") -> None:
152152
exp._key_types[tag.name] = "metadata"
153153
exp._metadata_values[tag.name] = tag.value
154154

155+
response = exp._metrics_api.client.lit_logger_service_get_logger_metrics(
156+
project_id=exp._teamspace.id, ids=[exp._metrics_store.id]
157+
)
155158
for name in exp._resumed_steps:
156159
exp._key_types[name] = "metric"
160+
series = Series(exp, name)
161+
series._type = "metric"
162+
if name in response.named_metrics:
163+
id_metrics = response.named_metrics[name].ids_metrics
164+
metrics_values = next(iter(id_metrics.values())).metrics_values
165+
series._values = [mv.value for mv in metrics_values]
166+
exp._series[name] = series
157167

158168
artifacts = getattr(exp._metrics_store, "artifacts", None) or []
159169
with contextlib.suppress(AttributeError):

tests/unittests/test_experiment_media.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,14 @@ def test_rebuilds_artifacts_with_name_and_download(self):
734734
exp._metrics_store.tags = []
735735
exp._metrics_api = MagicMock()
736736
exp._resumed_steps = {}
737+
exp._teamspace = MagicMock()
738+
exp._teamspace.id = "ts-1"
739+
exp._media_api = MagicMock()
740+
exp._media_api.client.lit_logger_service_list_lit_logger_media.return_value.media = []
741+
response = MagicMock()
742+
response.named_metrics = {}
743+
exp._metrics_api.client.lit_logger_service_get_logger_metrics.return_value = response
744+
exp._metrics_store.id = "store-1"
737745

738746
art = MagicMock()
739747
art.path = "results.csv"
@@ -812,6 +820,14 @@ def test_rebuild_does_not_overwrite_existing_keys(self):
812820
exp._metrics_store.tags = []
813821
exp._metrics_api = MagicMock()
814822
exp._resumed_steps = {}
823+
exp._teamspace = MagicMock()
824+
exp._teamspace.id = "ts-1"
825+
exp._media_api = MagicMock()
826+
exp._media_api.client.lit_logger_service_list_lit_logger_media.return_value.media = []
827+
response = MagicMock()
828+
response.named_metrics = {}
829+
exp._metrics_api.client.lit_logger_service_get_logger_metrics.return_value = response
830+
exp._metrics_store.id = "store-1"
815831

816832
art = MagicMock()
817833
art.path = "existing"

tests/unittests/test_experiment_metadata.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,12 @@ def test_rebuilds_code_tags(self):
219219
exp._series = {}
220220
exp._metrics_api = MagicMock()
221221

222+
exp._teamspace = MagicMock()
223+
exp._teamspace.id = "ts-1"
224+
exp._update_metrics_store = MagicMock()
225+
exp._media_api = MagicMock()
226+
exp._media_api.client.lit_logger_service_list_lit_logger_media.return_value.media = []
227+
222228
tag = MagicMock()
223229
tag.name = "model"
224230
tag.value = "resnet50"
@@ -254,6 +260,11 @@ def test_rebuilds_metric_key_types(self):
254260
exp._metrics_api = MagicMock()
255261
exp._create_download_fn = MagicMock()
256262
exp._resumed_steps = {"loss": 10, "acc": 5}
263+
exp._teamspace = MagicMock()
264+
exp._teamspace.id = "ts-1"
265+
exp._update_metrics_store = MagicMock()
266+
exp._media_api = MagicMock()
267+
exp._media_api.client.lit_logger_service_list_lit_logger_media.return_value.media = []
257268

258269
Experiment._rebuild_state(exp)
259270

tests/unittests/test_experiment_support.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,3 +208,45 @@ def test_rebuild_state_reconstructs_same_name_media_series(self):
208208
assert exp._key_types["loss"] == "metric"
209209
assert isinstance(exp._series["logs"], Series)
210210
assert [item.path for item in exp._series["logs"]] == ["logs", "logs"]
211+
212+
def test_rebuild_state_hydrates_metric_values_from_api(self):
213+
mv0 = MagicMock()
214+
mv0.value = 1.0
215+
mv1 = MagicMock()
216+
mv1.value = 0.5
217+
mv2 = MagicMock()
218+
mv2.value = 0.333
219+
220+
id_metrics_entry = MagicMock()
221+
id_metrics_entry.metrics_values = [mv0, mv1, mv2]
222+
223+
named_metric = MagicMock()
224+
named_metric.ids_metrics = {"test-id": id_metrics_entry}
225+
226+
response = MagicMock()
227+
response.named_metrics = {"train/loss": named_metric}
228+
229+
exp = MagicMock(spec=Experiment)
230+
exp._key_types = {}
231+
exp._metadata_values = {}
232+
exp._static_files = {}
233+
exp._series = {}
234+
exp._metrics_store = MagicMock()
235+
exp._metrics_store.id = "store-1"
236+
exp._metrics_store.tags = []
237+
exp._metrics_store.artifacts = []
238+
exp._metrics_api = MagicMock()
239+
exp._metrics_api.client.lit_logger_service_get_logger_metrics.return_value = response
240+
exp._teamspace = MagicMock()
241+
exp._teamspace.id = "ts-1"
242+
exp._media_api = MagicMock()
243+
exp._media_api.client.lit_logger_service_list_lit_logger_media.return_value.media = []
244+
exp._resumed_steps = {"train/loss": 2}
245+
246+
ExperimentStateSupport.rebuild_state(exp)
247+
248+
assert exp._key_types["train/loss"] == "metric"
249+
series = exp._series["train/loss"]
250+
assert isinstance(series, Series)
251+
assert series._type == "metric"
252+
assert series._values == [1.0, 0.5, 0.333]

0 commit comments

Comments
 (0)