这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战
在机器学习项目中,实验数量快速增长。 DVC 可以跟踪这些实验,列出并比较它们最相关的参数和指标,在它们之间找到最合适的实验,并仅将我们需要的那些实验信息提交到 Git。
在上一篇文章快速入门DVC(六):指标跟踪、更新训练参数以及可视化模型表现中,我们讲述了如何进行指标跟踪、更新训练参数以及可视化模型表现。
本文,我们将通过 example-dvc-experiments 项目来探索 DVC 实验管理的基本功能。
环境准备
克隆项目、创建虚拟环境并安装依赖库
我们强烈建议创建一个虚拟环境,以使我们使用的库与系统的其余部分隔离,这可以有效防止版本冲突。
$ 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 的情况下共享它们或获取两个实验之间的差异。