您可以通过在一个或多个 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 复制代码