环境准备
克隆项目、创建虚拟环境并安装依赖库
我们强烈建议创建一个虚拟环境,以使我们使用的库与系统的其余部分隔离,这可以有效防止版本冲突。
$ git clone https://github.com/iterative/example-dvc-experiments -b get-started $ cd example-dvc-experiments $ virtualenv .venv $ . .venv/bin/activate $ python -m pip install -r requirements.txt 复制代码
下载数据集
我们克隆的 Git 远程仓库不包含数据集。因为,我们没有将数据存储在 Git 存储仓库中,而是使用 DVC 从共享数据存储中检索。 在这种情况下,我们使用 dvc pull
来下载缺失的数据文件。
$ dvc pull 复制代码
数据集下载完成之后,存储库已经包含了运行实验所需的所有配置。
运行实验
使用默认的项目设置运行实验只需要执行以下命令:
$ dvc exp run ... Reproduced experiment(s): exp-b28f0 Experiment results have been applied to your workspace. ... 复制代码
它在 dvc.yaml
中运行指定的命令(python train.py
)。 该命令将指标值写入metrics.json
文件。
然后将该实验与在参数文件 (params.yaml
) 中找到的值以及具有这些生成的指标的其他依赖项 (data/images/
) 相关联。
dvc exp
命令的目的是让您在迭代项目时立即运行、捕获和比较机器学习实验。每个实验产生的模型和指标等制品都由 DVC 跟踪,相关的参数和指标可以作为文本文件提交到 Git。
您可以使用 dvc exp show
来查看实验结果,并在格式良好的表格中查看这些指标和结果:
$ dvc exp show ───────────────────────────────────────────────────────────────────────────────────────────── Experiment Created loss acc train.epochs model.conv_units ───────────────────────────────────────────────────────────────────────────────────────────── workspace - 0.23282 0.9152 10 16 7317bc6 Jul 18, 2021 - - 10 16 └── 1a1d858 [exp-6dccf] 03:21 PM 0.23282 0.9152 10 16 ───────────────────────────────────────────────────────────────────────────────────────────── 复制代码
其中,表中的工作空间行显示工作空间中可用的最新实验的结果。
除此之外,该表还在单独的行中显示了每个实验,以及它们提交到的 Git 的 Commit ID
。 我们可以看到我们运行的实验名称为 exp-6dccf
,并且是从 Commit ID
为 7317bc6
运行的。
现在,我们来做更多的实验。DVC 允许更新流水线中定义的参数,并且无需手动修改文件。 我们使用此功能在 train.py
中设置卷积单元。
$ dvc exp run --set-param model.conv_units=24 ... Reproduced experiment(s): exp-7b56f Experiment results have been applied to your workspace. ... 复制代码
有关(超)参数的更多信息说明:
数据科学项目包含定义可以调整的参数(以训练模型、调整模型架构、进行预处理等)的配置文件是很常见的。DVC 为实验提供了一种机制,以依赖文件中的特定变量。
默认情况下,DVC 假定您的项目中有一个名为 params.yaml
的参数文件。 DVC 解析此文件并创建对其中找到的变量的依赖关系:model.conv_units
和 train.epochs
。 例如:
train: epochs: 10 model: conv_units: 16 复制代码
当您使用 dvc exp run --set-param
时,DVC 会使用您在运行实验之前在命令行中设置的值更新 params.yaml
中的参数。
并行运行多个实验
我们可以将它们定义为批量运行,而不是一个一个地运行实验。 当您进行长时间运行的实验时,这尤其方便。
我们使用 dvc exp run
的 --queue
参数将实验添加到队列中。 我们还可以使用 -S
(--set-param
) 来设置参数的值。
$ dvc exp run --queue -S model.conv_units=32 Queued experiment '3cac8c6' for future execution. $ dvc exp run --queue -S model.conv_units=64 Queued experiment '23660b6' for future execution. $ dvc exp run --queue -S model.conv_units=128 Queued experiment '6591a57' for future execution. $ dvc exp run --queue -S model.conv_units=256 Queued experiment '9109ea9' for future execution. 复制代码
接下来,使用 --run-all
参数并行运行所有排队的实验。 您可以使用 --jobs
指定并行进程的数量:
dvc exp run --run-all --jobs 2 复制代码
比较并且持久化实验
实验以不同的参数运行数次之后。 我们使用 dvc exp show
命令来比较所有的这些实验。
$ dvc exp show ┏━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┓ ┃ Experiment ┃ Created ┃ loss ┃ acc ┃ train.epochs ┃ model.conv_units ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━┩ │ workspace │ - │ 0.23508 │ 0.9151 │ 10 │ 24 │ │ 7317bc6 │ Jul 18, 2021 │ - │ - │ 10 │ 16 │ │ ├── e2647ef [exp-ee8a4] │ 05:14 PM │ 0.23146 │ 0.9145 │ 10 │ 64 │ │ ├── 15c9451 [exp-a9be6] │ 05:14 PM │ 0.25231 │ 0.9102 │ 10 │ 32 │ │ ├── 9c32227 [exp-17dd9] │ 04:46 PM │ 0.23687 │ 0.9167 │ 10 │ 256 │ │ ├── 8a9cb15 [exp-29d93] │ 04:46 PM │ 0.24459 │ 0.9134 │ 10 │ 128 │ │ ├── dfc536f [exp-a1bd9] │ 03:35 PM │ 0.23508 │ 0.9151 │ 10 │ 24 │ │ └── 1a1d858 [exp-6dccf] │ 03:21 PM │ 0.23282 │ 0.9152 │ 10 │ 16 │ └─────────────────────────┴──────────────┴─────────┴────────┴──────────────┴──────────────────┘ 复制代码
默认情况下,它显示所有的参数和带有时间戳的指标。 如果您有大量参数、指标或实验,这可能会导致视图混乱。 您可以使用命令的 --drop
参数将表限制为查看特定的指标或参数,或隐藏时间戳列(Created
列)。
$ dvc exp show --drop 'Created|train|loss' ───────────────────────────────────────────────────── Experiment acc model.conv_units ───────────────────────────────────────────────────── workspace 0.9151 24 7317bc6 - 16 ├── e2647ef [exp-ee8a4] 0.9145 64 ├── 15c9451 [exp-a9be6] 0.9102 32 ├── 9c32227 [exp-17dd9] 0.9167 256 ├── 8a9cb15 [exp-29d93] 0.9134 128 ├── dfc536f [exp-a1bd9] 0.9151 24 └── 1a1d858 [exp-6dccf] 0.9152 16 ───────────────────────────────────────────────────── 复制代码
从表中选择其中一个实验,然后创建一个 Git 分支,其中包含该实验及其所有相关文件。
$ dvc exp branch exp-17dd9 "cnn-256" Git branch 'cnn-256' has been created from experiment 'exp-17dd9'. To switch to the new branch run: git checkout cnn-256 复制代码
然后,您可以切换分支 git checkout
并从该分支继续工作,或者使用常用的 Git 命令将该分支合并到您的主分支(main
)中。
实验管理的其他操作
dvc exp
还有许多其他功能,例如,清理未使用的实验、在不提交到 Git 的情况下共享它们或获取两个实验之间的差异。
请参考用户指南中的实验管理部分或参考命令说明中的 dvc exp
命令及其子命令。