From 6c8c26f741d0b32f29951a104dc99a2749698bff Mon Sep 17 00:00:00 2001 From: Hagai Kariti Date: Thu, 2 Feb 2023 21:14:43 +0200 Subject: [PATCH] Support setting a exp name prefix in hydra sweeps --- dvc/repo/experiments/run.py | 9 ++++----- tests/func/experiments/test_set_params.py | 15 +++++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/dvc/repo/experiments/run.py b/dvc/repo/experiments/run.py index 10836faed..5975a375d 100644 --- a/dvc/repo/experiments/run.py +++ b/dvc/repo/experiments/run.py @@ -61,20 +61,19 @@ def run( # noqa: C901 ) if hydra_sweep: - if kwargs.get("name"): - raise InvalidArgumentError( - "Sweep overrides can't be used alongside `--name`" - ) from dvc.utils.hydra import get_hydra_sweeps sweeps = get_hydra_sweeps(path_overrides) + name_prefix = kwargs.get("name") else: sweeps = [path_overrides] if not kwargs.get("checkpoint_resume", None): kwargs["reset"] = True - for sweep_overrides in sweeps: + for idx, sweep_overrides in enumerate(sweeps): + if hydra_sweep and name_prefix is not None: + kwargs["name"] = f"{name_prefix}-{idx+1}" queue_entry = repo.experiments.queue_one( repo.experiments.celery_queue, targets=targets, diff --git a/tests/func/experiments/test_set_params.py b/tests/func/experiments/test_set_params.py index 75b37073c..d708d6f26 100644 --- a/tests/func/experiments/test_set_params.py +++ b/tests/func/experiments/test_set_params.py @@ -131,9 +131,12 @@ def test_hydra_sweep_requires_queue(params_repo, dvc): dvc.experiments.run(params=["db=mysql,postgresql"]) -def test_hydra_sweep_cant_use_name(tmp_dir, params_repo, dvc): - with pytest.raises( - InvalidArgumentError, - match="Sweep overrides can't be used alongside `--name`", - ): - dvc.experiments.run(params=["db=mysql,postgresql"], queue=True, name="foo") +def test_hydra_sweep_prefix_name(tmp_dir, params_repo, dvc): + prefix = "foo" + db_values = ["mysql", "postgresql"] + param = "+db=" + ",".join(db_values) + dvc.experiments.run(params=[param], queue=True, name=prefix) + expected_names = [f"{prefix}-{i+1}" for i, _ in enumerate(db_values)] + exp_names = [entry.name for entry in dvc.experiments.celery_queue.iter_queued()] + for name, expected in zip(exp_names, expected_names): + assert name == expected