首页 > 解决方案 > 数据版本控制:管道参数中的绝对路径和项目路径?

问题描述

在 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是输出到当前工作目录。这似乎是另一个合理的默认值。


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

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 中那样?

标签: gitpathdvc

解决方案


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

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

查看您的示例,DVC 中的参数似乎也有些混乱。在 DVC 阶段,params用于指定参数依赖项,不用于指定命令行标志。包含标志/选项的完整命令应包含在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:
        ...
    ...

这将使命令dvc repro在 foo.py 中的代码发生更改或指定参数发生更改时重新运行您的阶段cfg.json

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


推荐阅读