微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

解决方法

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

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

看看你的例子,DVC 中的参数似乎也有点混乱。在 DVC 阶段,params 用于指定 parameter dependencies,不用于指定命令行标志。包括标志/选项在内的完整命令应包含在您的阶段的 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。