入门:使用管道进行实验
如果你是按顺序阅读本指南,可能已经学习过关于 数据管道 的章节。在这里,我们将使用相同的功能作为实验构建系统的基础。
通过执行 DVC 管道 来运行 实验,该术语指与此执行相关联的一组可追踪变更,包括代码更改以及生成的产物(如图表、曲线图和模型)。各种 dvc exp
子命令允许你以多种方式执行、共享和管理实验。下面,我们将构建一个实验管道,并使用 dvc exp run
来执行它,同时利用一些非常实用的功能,例如实验队列和参数化。
走出笔记本
在 IPython 笔记本(例如 Jupyter)中进行了一段时间的数据探索和基础建模后,管理笔记本单元格可能会变得脆弱,此时你可能希望对项目和代码进行结构化,以便实现可重复执行、测试和进一步自动化。当你准备从笔记本迁移到脚本时,DVC 管道 可帮助你遵循软件工程最佳实践来标准化工作流:
-
模块化:将笔记本中的不同逻辑步骤拆分为独立的脚本。
-
参数化:调整你的脚本,使配置与源代码解耦。
创建实验管道
在我们的 示例仓库 中,首先将数据预处理逻辑从 原始笔记本 提取到 data_split.py
中。我们通过从 params.yaml
读取参数来对该脚本进行参数化:
from ruamel.yaml import YAML
yaml = YAML(typ="safe")
def data_split():
params = yaml.load(open("params.yaml", encoding="utf-8"))
...
现在我们使用 dvc stage add
命令将脚本转换为独立的 阶段,首先为 data_split.py
创建一个 data_split
阶段:
$ dvc stage add --name data_split \
--params base,data_split \
--deps data/pool_data --deps src/data_split.py \
--outs data/train_data --outs data/test_data \
python src/data_split.py
系统会自动生成包含阶段信息的 dvc.yaml
文件。
dvc.yaml
其中包含了我们添加的阶段信息,例如可执行命令(python src/data_split.py
)、依赖项、参数 和 输出:
stages:
data_split:
cmd: python src/data_split.py
deps:
- src/data_split.py
- data/pool_data
params:
- base
- data_split
outs:
- data/train_data
- data/test_data
接下来,我们使用 train.py
和 evaluate.py
分别创建 train
和 evaluate
阶段,用于训练模型并评估其性能:
$ dvc stage add -n train \
-p base,train \
-d src/train.py -d data/train_data \
-o models/model.pkl \
python src/train.py
$ dvc stage add -n evaluate \
-p base,evaluate \
-d src/evaluate.py -d models/model.pkl -d data/test_data \
-o results python src/evaluate.py
dvc.yaml
文件会自动更新,现在应包含所有阶段。
dvc.yaml
stages:
data_split:
cmd: python src/data_split.py
deps:
- data/pool_data
- src/data_split.py
params:
- base
- data_split
outs:
- data/test_data
- data/train_data
train:
cmd: python src/train.py
deps:
- data/train_data
- src/train.py
params:
- base
- train
outs:
- models/model.pkl
evaluate:
cmd: python src/evaluate.py
deps:
- data/test_data
- models/model.pkl
- src/evaluate.py
params:
- base
- evaluate
outs:
- results
随着阶段数量增加,使用 dvc dag
命令可以方便地可视化整个管道,而无需手动检查 dvc.yaml
文件:
$ dvc dag
+--------------------+
| data/pool_data.dvc |
+--------------------+
*
*
*
+------------+
| data_split |
+------------+
** **
** **
* **
+-------+ *
| train | **
+-------+ **
** **
** **
* *
+----------+
| evaluate |
+----------+
现在你已经设置好了 DVC Pipeline,可以通过运行 dvc exp run
来创建和跟踪新的实验运行,从而轻松地对其进行迭代。这启用了 DVC 中的一些新功能,例如实验队列,以及处理参数和超参数的标准方式。
修改参数
你可以使用 --set-param
从命令行修改 参数:
$ dvc exp run --set-param "train.img_size=128"
该标志可在一次调用中修改多个参数,甚至来自不同阶段的参数:
$ dvc exp run \
-S "data_split.test_pct=0.1" -S "train.img_size=384"
超参数调优
你可以为同一参数提供多个值:
$ dvc exp run \
--queue --set-param "train.batch_size=8,16,24"
Queueing with overrides '{'params.yaml': ['train.batch_size=8']}'.
Queueing with overrides '{'params.yaml': ['train.batch_size=16']}'.
Queueing with overrides '{'params.yaml': ['train.batch_size=24']}'.
...
通过修改多个参数,你可以构建一个网格搜索。为了更好地识别来自网格搜索的实验,你还可以提供一个 --name
:
$ dvc exp run --name "arch-size" --queue \
-S 'train.arch=alexnet,resnet34,squeezenet1_1' \
-S 'train.img_size=128,256'
Queueing with overrides '{'params.yaml': ['train.arch=alexnet', 'train.img_size=128']}'.
Queued experiment 'arch-size-1' for future execution.
Queueing with overrides '{'params.yaml': ['train.arch=alexnet', 'train.img_size=256']}'.
Queued experiment 'arch-size-2' for future execution.
Queueing with overrides '{'params.yaml': ['train.arch=resnet34', 'train.img_size=128']}'.
Queued experiment 'arch-size-3' for future execution.
...
了解更多关于 运行实验 的信息
排队实验
你可以使用 --queue
将实验加入队列以稍后执行:
$ dvc exp run --queue --set-param "train.img_size=512"
Queueing with overrides '{'params.yaml': ['train.img_size=512']}'.
一旦将一些实验放入队列,你可以通过以下命令全部运行:
$ dvc exp run --run-all
了解更多关于 实验队列 的信息