Skip to content

Commit

Permalink
exp run: if target is provided, only checkout target and dependencies (
Browse files Browse the repository at this point in the history
…#5519)

* tests: test that only target and its deps are checked out on exp run

* exp run: if target is provided, only checkout target + deps
  • Loading branch information
pmrowla authored Feb 25, 2021
1 parent b3a3280 commit fed6179
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 1 deletion.
13 changes: 12 additions & 1 deletion dvc/repo/experiments/executor/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,10 @@ def filter_pipeline(stages):

with cls._repro_dvc(dvc_dir, rel_cwd) as dvc:
args, kwargs = cls._repro_args(dvc)
if args:
targets: Optional[Union[list, str]] = args[0]
else:
targets = kwargs.get("targets")

repro_force = kwargs.get("force", False)
logger.trace( # type: ignore[attr-defined]
Expand All @@ -265,7 +269,14 @@ def filter_pipeline(stages):
# be removed/does not yet exist) so that our executor workspace
# is not polluted with the (persistent) out from an unrelated
# experiment run
dvc_checkout(dvc, force=True, quiet=True, allow_missing=True)
dvc_checkout(
dvc,
targets=targets,
with_deps=targets is not None,
force=True,
quiet=True,
allow_missing=True,
)

checkpoint_func = partial(
cls.checkpoint_callback, dvc.scm, name, repro_force
Expand Down
21 changes: 21 additions & 0 deletions tests/func/experiments/test_experiments.py
Original file line number Diff line number Diff line change
Expand Up @@ -612,3 +612,24 @@ def test_remove(tmp_dir, scm, dvc, exp_stage):
removed = dvc.experiments.remove(queue=True)
assert removed == 1
assert len(dvc.experiments.stash) == 0


def test_checkout_targets_deps(tmp_dir, scm, dvc, exp_stage):
from dvc.utils.fs import remove

tmp_dir.dvc_gen({"foo": "foo", "bar": "bar"}, commit="add files")
stage = dvc.stage.add(
cmd="python copy.py params.yaml metrics.yaml",
metrics_no_cache=["metrics.yaml"],
params=["foo"],
name="copy-file",
deps=["copy.py", "foo"],
force=True,
)
remove("foo")
remove("bar")

dvc.experiments.run(stage.addressing, params=["foo=2"])
assert (tmp_dir / "foo").exists()
assert (tmp_dir / "foo").read_text() == "foo"
assert not (tmp_dir / "bar").exists()

0 comments on commit fed6179

Please sign in to comment.