数据版本控制:管道参数中的绝对路径和项目路径?
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 中,路径似乎是隐式的,我也不知道从哪里开始:
- DVC 将在本地计算我的脚本的路径
- 没有在本地计算我的脚本的路径
这很好 -- 我可以发现这一点。但我有理由相信 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
)
在 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 中,路径似乎是隐式的,我也不知道从哪里开始:
- DVC 将在本地计算我的脚本的路径
- 没有在本地计算我的脚本的路径
这很好 -- 我可以发现这一点。但我有理由相信 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
)