您可以通过在一个或多个 dvc.yaml 文件(或流水线文件)中定义各个阶段(Stage)来构建数据科学或机器学习流水线(Pipeline)。 Stage 相互连接时形成 Pipeline (形成依赖关系图,具体请见: dvc dag)。
注意:命令
dvc stage可用于创建和列出 Stage 。
dvc.yaml 文件可以使用 Git 进行版本控制。
这些文件使用 YAML 1.2 文件格式。 我们鼓励您熟悉它,以便您可以自己修改、编写或生成 Stage 和 Pipeline。
阶段(Stages)
stages 列表包含一个或多个用户定义的 stages。 这是一个名为 transpose 的简单 stages:
stages: transpose: cmd: ./trans.r rows.txt > columns.txt deps: - rows.txt outs: - columns.txt 复制代码
另请参阅
dvc stage add,一个用于在dvc.yaml中编写 Stage 的辅助命令。
Stage 中最重要的部分是它执行的终端命令(cmd 字段)。 这就是 DVC 在 Stage 再现时运行的内容(请参阅 dvc repro)。
如果命令读取输入文件,则这些文件(或它们的目录位置)可以定义为依赖项(deps)。 DVC 会检查它们是否已经改变来决定该 Stage 是否需要重新执行(请参阅 dvc status))。
如果它写入文件或目录,则可以将它们定义为输出(outs)。 DVC 将继续跟踪它们(类似于使用 dvc add)。
请参阅完整的 Stage 条目规范。
参数依赖(Parameter dependencies)
Parameters是一种特殊类型的 Stage 依赖。 它们由一个 name/value 对组成,可在 YAML、JSON、TOML 或 Python 参数文件(默认为 params.yaml)中发现。 具体示例如下:
stages: preprocess: cmd: bin/cleanup raw.txt clean.txt deps: - raw.txt params: - threshold - passes outs: - clean.txt 复制代码
这允许多个 Stage 依赖于共享结构化文件的值(可以直接使用 Git 对其进行版本控制)。 另请参见 dvc params diff。
指标和图表输出
与常见的输出一样,指标和图表文件由 Stage 的 cmd 生成。 但是,它们的目的是不同的。 通常,它们包含用于评估流水线流程的元数据。 具体示例如下:
stages: build: cmd: python train.py deps: - features.csv outs: - model.pt metrics: - accuracy.txt: cache: false plots: - auc.json: cache: false 复制代码
其中,cache: false 在这里是特有的,因为它们足够小,可以让 Git 直接进行版本控制。
dvc metrics和 dvc plots命令可帮助您显示和比较指标和图表。
模板(Templating)-DVC 2.0
这是 DVC 2.0 中的新功能(具体请参见
dvc version)
dvc.yaml 支持模板(Templating)格式以在 YAML 结构中插入来自不同来源的值。 这些来源可以是 parameters files 或 dvc.yaml 中定义的 vars。
假设我们有一个params.yaml(默认参数文件)具有以下的内容:
models: us: threshold: 10 filename: 'model-us.hdf5' 复制代码
这些值可以在 dvc.yaml 中的任何位置使用 ${} 替换表达式:
stages: build-us: cmd: >- python train.py --thresh ${models.us.threshold} --out ${models.us.filename} outs: - ${models.us.filename}: cache: true 复制代码
DVC 将跟踪 ${} 中使用的简单参数值(数字、字符串等)(它们将由 dvc params diff 列出)。
或者,可以将替换值列为顶级 vars,如下所示:
vars: - models: us: threshold: 10 - desc: 'Reusable description' stages: build-us: desc: ${desc} cmd: python train.py --thresh ${models.us.threshold} 复制代码
请注意,来自
vars的值不会像参数一样被跟踪。
要加载其他参数文件,请按所需顺序将它们列在顶部的 vars 中,例如:
如果有的话,参数文件路径将根据
wdir进行评估。
vars: - params.json - myvar: 'value' - config/myapp.yaml 复制代码
请注意,默认的
params.yaml文件总是首先加载(如果存在的话)。
还可以使用 : 冒号指定要从其他参数文件中包含的内容:
vars: - params.json:clean,feats stages: featurize: cmd: ${feats.exec} deps: - ${clean.filename} outs: - ${feats.dirname} 复制代码
还支持 Stage 特有的值,带有内部 vars。 您还可以在本地加载其他参数文件。 例如:
stages: build-us: vars: - params.json:build - model: filename: 'model-us.hdf5' cmd: python train.py ${build.epochs} --out ${model.filename} outs: - ${model.filename} 复制代码
DVC 会尽可能在每个范围内合并来自 params 文件和 vars 的值。 例如,{"grp": {"a": 1}} 与{"grp": {"b": 2}} 合并,但不与{"grp": {"a": 7}}。
⚠️ 本地vars的已知限制:
wdir不能使用本地vars中的值,因为 DVC 首先使用工作目录(从vars中列出的 params 文件加载任何值)。- 目前,
foreach也与本地vars不兼容。
替换表达式支持以下形式:
${param} # Simple ${param.key} # Nested values through . (period) ${param.list[0]} # List elements via index in [] (square brackets) 复制代码
要在
dvc.yaml中按字面意思使用表达式(即 DVC 不会将其替换为值),请使用反斜杠对其进行转义,例如\${....
foreach 阶段-DVC 2.0
这是 DVC 2.0 中的新功能(具体请参见
dvc version)
您可以使用以下语法在单个 dvc.yaml 条目中定义多个 Stage 。 一个 foreach 元素接受一个列表或字典,其中包含要迭代的值,而 do 包含常规 Stage 字段(cmd、outs等)。
这是一个简单的例子:
stages: cleanups: foreach: # List of simple values - raw1 - labels1 - raw2 do: cmd: clean.py "${item}" outs: - ${item}.cln 复制代码
在 dvc repro 时,列表中的每个 item 都会通过替换表达式${item}中的值来展开到自己的 Stage 。item 的值附加到每个 Stage 名称后的@,其格式为:stage名@item的值。 foreach 语法生成的最终的 Stage 保存到 dvc.lock,如下所示:
schema: '2.0' stages: cleanups@labels1: cmd: clean.py "labels1" outs: - path: labels1.cln cleanups@raw1: cmd: clean.py "raw1" outs: - path: raw1.cln cleanups@raw2: cmd: clean.py "raw2" outs: - path: raw2.cln 复制代码
对于包含复杂值的列表(例如字典),替换表达式可以使用${item.key} 形式。 Stage 名称将附加一个从零开始的索引。 例如:
stages: train: foreach: - epochs: 3 thresh: 10 - epochs: 10 thresh: 15 do: cmd: python train.py ${item.epochs} ${item.thresh} 复制代码
dvc.lock文件如下所示:
# dvc.lock schema: '2.0' stages: train@0: cmd: python train.py 3 10 train@1: cmd: python train.py 10 15 复制代码