数据版本控制:管道参数中的绝对路径和项目路径?

Data Version Control: Absolute Paths and Project Paths in the Pipeline Parameters?

在 DVC 中,可以定义管道。在 Unix 中,通常在根级别不起作用。此外,DVC 期望文件位于 git 存储库中。

所以,这似乎是一个典型的问题。

假设我有以下内容:

/home/user/project/content-folder/data/data-type/cfg.json
/home/user/project/content-folder/app/foo.py

Git 从 /home/user/project/

开始
cd ~/project/content-folder/data/data-type
../../app/foo.py do-this --with cfg.json --dest $(pwd) 

对我来说似乎是合理的:脚本采用存储在特定位置的配置,针对某些封装的功能运行它,并使用绝对路径将其输出到目的地。

--dest 的默认行为是输出到当前工作目录。这似乎是另一个合理的默认设置。


接下来,我要为 dvc 配置 params.yaml 文件,我立即感到困惑,不确定会发生什么。我写:

foodoo:
  params: do-this --with ????/cfg.json --dest ????

我想写的(并且会在 shell 脚本中):

#!/usr/bin/env bash
origin:=$(git rev-parse --show-toplevel)

verb=do-this
params=--with $(origin)/content-folder/data/data-type/cfg.json --dest $(origin)/content-folder/data/data-type

但是,在 DVC 中,路径似乎是隐式的,我也不知道从哪里开始:

  1. DVC 将在本地计算我的脚本的路径
  2. 没有在本地计算我的脚本的路径

这很好 -- 我可以发现这一点。但我有理由相信 DVC 绝对不会在我的 params.yaml 目录和文件参数前面加上我的项目路径。


如何实现不假定固定项目位置的路径控制,就像我在 BASH 中所做的那样?

默认情况下,DVC 将从与 dvc.yaml 文件相同的目录中 运行 您的舞台命令。如果您需要 运行 来自不同位置的命令,您可以通过 wdir 指定备用工作目录,该目录应该是相对于 dvc.yaml 位置的路径。

阶段中所有其他内容的路径(如 params.yaml)应指定为相对于 wdir(如果未提供 wdir,则相对于 dvc.yaml) .

看你的例子,DVC中的参数似乎也有点混乱。在 DVC 阶段,params 用于指定 parameter dependencies,不用于指定命令行标志。包含 flags/options 的完整命令应包含在您的阶段的 cmd 部分。如果您想确保每次 cfg.json 中的某些值发生变化时您的舞台都重新 运行,您舞台的 params 部分将类似于:

params:
  <relpath from dvc.yaml>/cfg.json:
    - param1
    - param2
    ...

所以你的例子 dvc.yaml 看起来像这样:

stages:
  foodoo:
    cmd: <relpath from dvc.yaml>/foo.py do-this --with <relpath from dvc.yaml>/cfg.json --dest <relpath from dvc.yaml>/...
    deps:
      <relpath from dvc.yaml>/foo.py
    params:
      <relpath from dvc.yaml>/cfg.json:
        ...
    ...

只要 foo.py 中的代码发生变化,或者 cfg.json 中指定的参数发生变化,这将使命令 dvc repro 重新 运行 您的舞台。

您可能还想参考 dvc run 的文档,它可用于生成或更新 dvc.yaml 阶段(而不是手动编写 dvc.yaml