0
点赞
收藏
分享

微信扫一扫

快速入门DVC(五):数据流水线(Pipelines)

沐之轻语 2022-03-16 阅读 84


在之前的文章中讲述了如何对数据集与模型进行版本管理​以及如何下载数据和模型?

这对于数据科学中的大型数据文件和目录进行版本控制虽然很好,但还不够。

今天我们来讲述下如何过滤、转换或使用数据来训练 ML 模型?

DVC 引入了一种获取 ​数据流水线(生成最终结果的一系列数据过程)​ 的机制。

DVC 流水线及其数据也可以很容易地使用 Git 进行版本控制。 这使您可以更好地组织项目,并在以后​完全按照最初构建的方式​重现您的工作流程和结果。例如,您可以获取一个简单的 ETL 工作流、组织一个数据科学项目或构建一个详细的机器学习流水线。

流水线 Stages

DVC 使用 ​​dvc run​​ 创建 Stages。 这些表示形成流水线步骤(Steps)的过程(使用 Git 跟踪的源代码)。同时,Stages还将代码连接到对应的数据输入和输出。

下面我们将 Python 脚本转换为 Stage :

首先,我们需要先获取样例代码。

$ mkdir get-started
$ cd get-started
$ wget https://code.dvc.org/get-started/code.zip
$ unzip code.zip
$ rm -f code.zip
$ tree

.
├── params.yaml
└── src
├── evaluate.py
├── featurization.py
├── prepare.py
├── requirements.txt
└── train.py

接下来,我们安装依赖库(​强烈建议预先创建一个虚拟环境​)。

$ pip install -r src/requirements.txt

此时,先使用 Git 添加或提交源代码目录。

增加第一个 Stage

然后,使用 ​​dvc run​​ 创建 Stages 。

$ dvc run -n prepare \
-p prepare.seed,prepare.split \
-d src/prepare.py -d data/data.xml \
-o data/prepared \
python src/prepare.py data/data.xml

运行之后,将会生成了一个 ​​dvc.yaml​​​ 文件。 它包括有关我们运行的命令(​​python src/prepare.py data/data.xml​​)、其​依赖(dependencies)​ 和 ​输出(outputs)信息​。其中:


  • 依赖​ 为可能由DVC跟踪的文件或目录,记录在 Stage(在 dvc.yaml 中)或 ​​.dvc​​​ 文件的 ​​deps​​ 部分。当任何依赖项发生变化时,Stage 就会失效(被认为已过时)。
  • 输出(outputs)信息​由 DVC 跟踪的文件或目录,记录在 Stage(在 dvc.yaml 中)或 ​​.dvc​​​ 文件的 ​​outs​​ 部分。 输出信息通常是Stage的结果。

上面使用的命令(dvc run)具体参数的含义如下:


  • ​-n prepare​​​:指定stage的名称。 如果您打开 ​​dvc.yaml​​​ 文件,您将看到一个名为 ​​prepare​​ 的部分。
  • ​-p prepare.seed,prepare.split​​​:定义了指定类型的依赖项——parameters。 其想法是该阶段可以依赖于参数文件(默认为 ​​params.yaml​​)中的字段值:

prepare:
split: 0.20
seed: 20170428

  • ​-d src/prepare.py​​​ 和 ​​-d data/data.xml​​:表示 Stage 依赖于这些文件来工作。 注意:源代码本身被标记为依赖项。如果这些文件中的任何一个稍后进行了更改,DVC 将知道此阶段需要复现。
  • ​-o data/prepared​​:指定此脚本的输出目录,写入了两个文件。 这就是项目的工作空间现在的样子:

.
├── data
│ ├── data.xml
│ ├── data.xml.dvc
+│ └── prepared
+│ ├── test.tsv
+│ └── train.tsv
+├── dvc.yaml
+├── dvc.lock
├── params.yaml
└── src
├── ...
  • ​python src/prepare.py data/data.xml​​​:表示这个Stage要运行的命令,保存到​​dvc.yaml​​中,如下所示:
stages:
prepare:
cmd: python src/prepare.py data/data.xml
deps:
- src/prepare.py
- data/data.xml
params:
- prepare.seed
- prepare.split
outs:
- data/prepared

​prepare​​ Stage 最终包含了上述所有信息。

DVC 不需要使用 ​​dvc add​​​ 来跟踪 Stage 的输出(在当前指定的输出目录为​​data/prepared​​​的情况下)。 因为 ​​dvc run​​​ 已经解决了这个问题。如果您想将它们保存到远程存储库,您只需要运行 ​​dvc push​​​即可(通常,与 ​​git commit​​​ 一起为 ​​dvc.yaml​​ 文件进行版本管理)。

依赖图 (DAG)

通过多次使用 ​​dvc run​​,并将一个 Stage 的输出指定为另一个 Stage 的依赖项,我们可以描述一系列获得所需结果的命令。这就是我们所说的数据流水线或依赖图。

增加第二个 Stage

接下来,我们创建第二个 Stage 链接到​​prepare​​ Stage 的输出,以执行特征提取:

$ dvc run -n featurize \
-p featurize.max_features,featurize.ngrams \
-d src/featurization.py -d data/prepared \
-o data/features \
python src/featurization.py data/prepared data/features

​dvc.yaml​​ 文件会自动更新,现在应该包括两个 Stage 了。具体结果如下所示:

stages:
prepare:
cmd: python src/prepare.py data/data.xml
deps:
- data/data.xml
- src/prepare.py
params:
- prepare.seed
- prepare.split
outs:
- data/prepared
+ featurize:
+ cmd: python src/featurization.py data/prepared data/features
+ deps:
+ - data/prepared
+ - src/featurization.py
+ params:
+ - featurize.max_features
+ - featurize.ngrams
+ outs:
+ - data/features

添加更多的 Stage

让我们添加训练Stage。这次没有什么新鲜的事情,只是相同的​​dvc run​​命令且具有同样的参数选项:

$ dvc run -n train \
-p train.seed,train.n_est,train.min_split \
-d src/train.py -d data/features \
-o model.pkl \
python src/train.py data/features model.pkl

下面,我们再次检查 ​​dvc.yaml​​,它现在应该又有一个新的 Stage 了。

这应该是使用 Git 提交更改的好时机。 其中包括 ​​.gitignore​​​、​​dvc.lock​​​和 ​​dvc.yaml​​文件,它们描述了我们的数据流水线。

复现流水线(​​dvc repro​​)

创建 ​​dvc.yaml​​ 文件的重点是能够轻松重现流水线。

$ dvc repro

修改模型训练的参数,重新运行

接下来,我们进行更多的模型训练实验尝试。首先,让我们尝试更改训练阶段的参数之一,首先,打开 ​​params.yaml​​ 文件,并将 ​​n_est​​ 更改为 ​​100​​。

然后,(重新)运行 ​​dvc repro​​。你将看到如下结果:

$ dvc repro

Stage 'prepare' didn't change, skipping
Stage 'featurize' didn't change, skipping
Running stage 'train' with command: ...

DVC 检测到应该只运行 ​​train​​​ Stage,并跳过其他所有内容!所有中间结果(​​prepare​​​和​​featurize​​ Stage 产生的结果)都被重用。

改回修改之前模型的参数,并重新运行

现在,让我们将​​n_est​​​ 改回 ​​50​​​,并再次运行 ​​dvc repro​​:

$ dvc repro

Stage 'prepare' didn't change, skipping
Stage 'featurize' didn't change, skipping

和以前一样,不需要重新运行​​prepare​​​,​​featurize​​​等 Stage 。但是这次它也没有重新运行​​train​​ Stage !先前使用相同​输入参数​和​数据集​的运行结果保存在 DVC 的运行缓存中,并在此处重用。

​dvc repro​​​ 依赖于 ​​dvc.yaml​​​ 中 DAG 的定义,并使用 ​​dvc.lock​​ 来确定究竟需要运行什么。

​dvc.lock​​​ 文件类似于 ​​.dvc​​ 文件,它获取我们所使用的依赖项和参数值的哈希(在大多数情况下是 MD5 )。它可以被认为是流水线的一种状态:

schema: '2.0'
stages:
prepare:
cmd: python src/prepare.py data/data.xml
deps:
- path: data/data.xml
md5: a304afb96060aad90176268345e10355
- path: src/prepare.py
md5: 285af85d794bb57e5d09ace7209f3519
params:
params.yaml:
prepare.seed: 20170428
prepare.split: 0.2
outs:
- path: data/prepared
md5: 20b786b6e6f80e2b3fcf17827ad18597.dir

DVC 流水线(​​dvc.yaml​​​ 文件、​​dvc run​​​ 和 ​​dvc repro​​ 命令)解决了几个重要问题:


  • 自动化:以“智能”的方式运行一系列步骤(Step),使您的项目迭代更快。 DVC 自动确定需要运行项目的哪些部分,并​缓存“运行”及其结果​以避免不必要的重新运行。
  • 可重现性:​​dvc.yaml​​​ 和 ​​dvc.lock​​ 文件描述了要使用的数据以及哪些命令来生成流水线结果(例如, ML 模型)。 将这些文件存储在 Git 中可以轻松进行版本控制和共享。
  • 机器学习的持续交付和持续集成 (CI/CD):以​可复制构建​的方式描述项目是引入 CI/CD 系统之前第一个必要的步骤。

可视化

建立了我们的流水线之后,我们需要一种很好的方法来理解它的结构。 查看连接 Stages 的图表会对你理解它的结构有所帮助。 DVC 让您无需离开终端即可完成操作!

$ dvc dag

+---------+
| prepare |
+---------+
*
*
*
+-----------+
| featurize |
+-----------+
*
*
*
+-------+
| train |
+-------+

如果你想探索此命令可视化管道的其他方式,请查看官网 ​​​dvc dag​​​。



举报

相关推荐

0 条评论