在 dvc 2.0

问题描述

使用 dvc 版本 2.0.18 和 python 3.9.2 我想在配置 dvc.yaml 中阶段的参数时使用与 params.yaml 不同的配置文件中定义的参数。但是,它并没有像我预期的那样工作。

MWE: Git repo + dvc 初始化:

.
├── dvc.yaml
├── preproc.yaml
└── test.py

dvc.yaml:

vars:
  - preproc.yaml
stages:
  test:
    cmd: python test.py
    deps:
      - test.py
    params:
      - important_parameter

preproc.yaml:

important_parameter: 123

运行 dvc repro 导致以下错误

ERROR: Failed to reproduce 'dvc.yaml': dependency 'params.yaml' does not exist

创建一个没有内容的虚拟 params.yaml 给出:

WARNING: 'params.yaml' is empty.
ERROR: Failed to reproduce 'dvc.yaml': Parameters 'important_parameter' are missing from 'params.yaml'.

我错过了什么?使用模板功能可以做到这一点吗?

解决方法

我认为在这种情况下您不需要模板功能。如example所示:

stages:
  train:
    cmd: python train.py
    deps:
      - users.csv
    params:
      - params.py:
          - BOOL
          - INT
          - TrainConfig.EPOCHS
          - TrainConfig.layers
    outs:
      - model.pkl

重新定义默认 params.yaml 的方法是在 params: 部分明确指定文件名:

params:
  - preproc.yaml:
    - important_parameter

此外,当您使用 dvc run(不推荐)或 dvc stage add 创建阶段时,您可以明确提供 params 文件名作为前缀:

dvc run -n train -d train.py -d logs/ -o users.csv -f \
          -p parse_params.yaml:threshold,classes_num \
          python train.py

这里 ^^ parse_params.yaml 是自定义参数文件。

请告诉我它是否解决了问题,如果您有任何其他问题:)