Skip to content

Commit 86be328

Browse files
vertex-sdk-botcopybara-github
authored andcommitted
fix: Tensorboard - Fix error in tensorboard batch upload of nested dirs
PiperOrigin-RevId: 675716748
1 parent 4637b4c commit 86be328

File tree

2 files changed

+78
-12
lines changed

2 files changed

+78
-12
lines changed

google/cloud/aiplatform/tensorboard/uploader.py

+1
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,7 @@ def _pre_create_runs_and_time_series(self):
386386
if (run_name and run_name != ".")
387387
else uploader_utils.DEFAULT_RUN_NAME
388388
)
389+
run_name = uploader_utils.reformat_run_name(run_name)
389390
run_names.append(run_name)
390391
for event in events:
391392
_filter_graph_defs(event)

tests/unit/aiplatform/test_uploader.py

+77-12
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,11 @@ def test_start_uploading_without_create_experiment_fails(self):
591591
with self.assertRaisesRegex(RuntimeError, "call create_experiment()"):
592592
uploader.start_uploading()
593593

594+
@parameterized.parameters(
595+
{"nested_run_dir": ""},
596+
{"nested_run_dir": "nested-dir/"},
597+
{"nested_run_dir": "double/nested-dir/"},
598+
)
594599
@patch.object(
595600
uploader_utils.OnePlatformResourceManager,
596601
"get_run_resource_name",
@@ -599,7 +604,11 @@ def test_start_uploading_without_create_experiment_fails(self):
599604
@patch.object(metadata, "_experiment_tracker", autospec=True)
600605
@patch.object(experiment_resources, "Experiment", autospec=True)
601606
def test_start_uploading_scalars(
602-
self, experiment_resources_mock, experiment_tracker_mock, run_resource_mock
607+
self,
608+
experiment_resources_mock,
609+
experiment_tracker_mock,
610+
run_resource_mock,
611+
nested_run_dir,
603612
):
604613
experiment_resources_mock.get.return_value = _TEST_EXPERIMENT_NAME
605614
experiment_tracker_mock.set_experiment.return_value = _TEST_EXPERIMENT_NAME
@@ -628,21 +637,21 @@ def test_start_uploading_scalars(
628637
mock_logdir_loader = mock.create_autospec(logdir_loader.LogdirLoader)
629638
mock_logdir_loader.get_run_events.side_effect = [
630639
{
631-
"run 1": _apply_compat(
640+
f"{nested_run_dir}run 1": _apply_compat(
632641
[_scalar_event("1.1", 5.0), _scalar_event("1.2", 5.0)]
633642
),
634-
"run 2": _apply_compat(
643+
f"{nested_run_dir}run 2": _apply_compat(
635644
[_scalar_event("2.1", 5.0), _scalar_event("2.2", 5.0)]
636645
),
637646
},
638647
{
639-
"run 3": _apply_compat(
648+
f"{nested_run_dir}run 3": _apply_compat(
640649
[_scalar_event("3.1", 5.0), _scalar_event("3.2", 5.0)]
641650
),
642-
"run 4": _apply_compat(
651+
f"{nested_run_dir}run 4": _apply_compat(
643652
[_scalar_event("4.1", 5.0), _scalar_event("4.2", 5.0)]
644653
),
645-
"run 5": _apply_compat(
654+
f"{nested_run_dir}run 5": _apply_compat(
646655
[_scalar_event("5.1", 5.0), _scalar_event("5.2", 5.0)]
647656
),
648657
},
@@ -666,11 +675,20 @@ def test_start_uploading_scalars(
666675
self.assertEqual(mock_tracker.blob_tracker.call_count, 0)
667676

668677
@parameterized.parameters(
669-
{"existing_experiment": None, "one_platform_run_name": None},
670-
{"existing_experiment": None, "one_platform_run_name": "."},
678+
{
679+
"existing_experiment": None,
680+
"one_platform_run_name": None,
681+
"nested_run_dir": "",
682+
},
683+
{
684+
"existing_experiment": None,
685+
"one_platform_run_name": ".",
686+
"nested_run_dir": "nested-dir/",
687+
},
671688
{
672689
"existing_experiment": _TEST_EXPERIMENT_NAME,
673690
"one_platform_run_name": _TEST_ONE_PLATFORM_RUN_NAME,
691+
"nested_run_dir": "double/nested-dir/",
674692
},
675693
)
676694
@patch.object(
@@ -693,6 +711,7 @@ def test_start_uploading_scalars_one_shot(
693711
run_resource_mock,
694712
existing_experiment,
695713
one_platform_run_name,
714+
nested_run_dir,
696715
):
697716
"""Check that one-shot uploading stops without AbortUploadError."""
698717

@@ -760,10 +779,10 @@ def batch_create_time_series(parent, requests):
760779
mock_logdir_loader = mock.create_autospec(logdir_loader.LogdirLoader)
761780
mock_logdir_loader.get_run_events.side_effect = [
762781
{
763-
"run 1": _apply_compat(
782+
f"{nested_run_dir}run 1": _apply_compat(
764783
[_scalar_event("tag_1.1", 5.0), _scalar_event("tag_1.2", 5.0)]
765784
),
766-
"run 2": _apply_compat(
785+
f"{nested_run_dir}run 2": _apply_compat(
767786
[_scalar_event("tag_2.1", 5.0), _scalar_event("tag_2.2", 5.0)]
768787
),
769788
},
@@ -772,10 +791,10 @@ def batch_create_time_series(parent, requests):
772791
mock_logdir_loader_pre_create = mock.create_autospec(logdir_loader.LogdirLoader)
773792
mock_logdir_loader_pre_create.get_run_events.side_effect = [
774793
{
775-
"run 1": _apply_compat(
794+
f"{nested_run_dir}run 1": _apply_compat(
776795
[_scalar_event("tag_1.1", 5.0), _scalar_event("tag_1.2", 5.0)]
777796
),
778-
"run 2": _apply_compat(
797+
f"{nested_run_dir}run 2": _apply_compat(
779798
[_scalar_event("tag_2.1", 5.0), _scalar_event("tag_2.2", 5.0)]
780799
),
781800
},
@@ -804,6 +823,52 @@ def batch_create_time_series(parent, requests):
804823
self.assertEqual(mock_tracker.blob_tracker.call_count, 0)
805824
experiment_tracker_mock.set_experiment.assert_called_once()
806825

826+
@parameterized.parameters(
827+
{"nested_run_dir": ""},
828+
{"nested_run_dir": "nested-dir/"},
829+
{"nested_run_dir": "double/nested-dir/"},
830+
)
831+
@patch.object(metadata, "_experiment_tracker", autospec=True)
832+
@patch.object(experiment_resources, "Experiment", autospec=True)
833+
def test_upload_nested_scalars_one_shot(
834+
self,
835+
experiment_resources_mock,
836+
experiment_tracker_mock,
837+
nested_run_dir,
838+
):
839+
"""Check that one-shot uploading stops without AbortUploadError."""
840+
841+
logdir = self.get_temp_dir()
842+
uploader = _create_uploader(
843+
logdir=logdir,
844+
)
845+
uploader.create_experiment()
846+
847+
run_1 = f"{nested_run_dir}run 1"
848+
run_2 = f"{nested_run_dir}run 2"
849+
850+
mock_dispatcher = mock.create_autospec(uploader_lib._Dispatcher)
851+
uploader._dispatcher = mock_dispatcher
852+
mock_logdir_loader = mock.create_autospec(logdir_loader.LogdirLoader)
853+
mock_logdir_loader.get_run_events.side_effect = [
854+
{
855+
run_1: _apply_compat(
856+
[_scalar_event("tag_1.1", 5.0), _scalar_event("tag_1.2", 5.0)]
857+
),
858+
run_2: _apply_compat(
859+
[_scalar_event("tag_2.1", 5.0), _scalar_event("tag_2.2", 5.0)]
860+
),
861+
},
862+
]
863+
with mock.patch.object(uploader, "_logdir_loader", mock_logdir_loader):
864+
uploader._upload_once()
865+
866+
self.assertEqual(1, mock_logdir_loader.get_run_events.call_count)
867+
self.assertEqual(1, mock_dispatcher.dispatch_requests.call_count)
868+
run_to_events = mock_dispatcher.dispatch_requests.call_args[0][0]
869+
self.assertIn(run_1, run_to_events)
870+
self.assertIn(run_2, run_to_events)
871+
807872
@patch.object(metadata, "_experiment_tracker", autospec=True)
808873
@patch.object(experiment_resources, "Experiment", autospec=True)
809874
def test_upload_empty_logdir(

0 commit comments

Comments
 (0)