使用Kedro和DVC实现数据与管道版本控制

本文档介绍如何在Kedro项目中使用DVC对数据集和流水线进行版本控制。DVC是一个用于开发可复现机器学习项目的工具,可安装在Visual Studio Code、任何系统终端中,并作为Python库使用。

本教程假设您已熟悉Git CLI和Kedro CLI命令,但不需要具备DVC的先验知识。

使用.dvc文件进行数据版本控制

初始化仓库

在本示例中,您将使用一个Kedro spaceflights-pandas初始项目,该项目包含预配置的数据集和流水线。要在本地创建此初始项目,请使用以下命令:

kedro new --starter=spaceflights-pandas --name=space-dvc

有关starter项目的更多信息,请参阅Kedro starters文档页面。

要将DVC作为Python库使用,可以通过pipconda进行安装,例如:

`pip install dvc`

由于DVC与Git协同工作以跟踪数据变更,请将Kedro项目初始化为git仓库:

`git init`

然后,在项目中初始化DVC:

`dvc init`

这将在项目内创建.dvc目录。您应该会看到类似以下的消息:

Initialized DVC repository.

You can now commit the changes to git.

+---------------------------------------------------------------------+
|                                                                     |
|        DVC has enabled anonymous aggregate usage analytics.         |
|     Read the analytics documentation (and how to opt-out) here:     |
|             <https://dvc.org/doc/user-guide/analytics>              |
|                                                                     |
+---------------------------------------------------------------------+

由于您在上一步使用git init初始化了一个新的Git仓库,现在可以对项目中所有文件进行首次提交:

git add .
git commit -m "First commit, initial structure from the starter"

使用DVC跟踪你的数据

DVC帮助管理不应直接存储在Git中的大型数据集。DVC不会将数据集文件添加到Git中,而是生成Git跟踪的小型元数据文件。

这些元数据文件存储有关实际数据集的信息,例如其哈希值和位置。有关.dvc文件结构的更多信息,请参阅DVC文档

请确认您的项目目录中包含以下数据集定义:

companies:
  type: pandas.CSVDataset
  filepath: data/01_raw/companies.csv

由于数据集文件位于项目模板中的位置,您必须确保以下行存在于.gitignore文件中,以允许提交.dvc文件:

!*.dvc

我们希望使用DVC来跟踪和版本化我们的数据集文件,因此您将其从Git中移除并提交更改:

git rm -r --cached 'data/01_raw/companies.csv'
git commit -m "Stop tracking data/01_raw/companies.csv"

然后我们可以开始用DVC跟踪它:

dvc add data/01_raw/companies.csv

这将生成companies.csv.dvc文件,该文件可提交至git。这个小型、人类可读的元数据文件作为原始数据的占位符用于Git跟踪。

更新后,将.dvc文件添加到Git并提交更改:

git add data/01_raw/companies.csv.dvc
git commit -m "Track companies.csv dataset with DVC"

回退到数据的先前版本

首先,我们通过添加一条虚拟行来创建不同版本的companies.csv文件。

echo "000,100%,Example,1.0,f" >> data/01_raw/companies.csv

通过使用命令 tail data/01_raw/companies.csv,您可以验证该行已添加到文件中:

6957,,Rwanda,1.0,t
7554,100%,,1105.0,f
34243,95%,Uzbekistan,1.0,f
12502,89%,Denmark,1.0,f
20213,,Russian Federation,1.0,f
2235,100%,Guinea,1.0,f
2353,100%,Senegal,2.0,t
49772,100%,Jersey,1.0,f
16548,90%,,2.0,f
000,100%,Example,1.0,f

然后你可以使用DVC跟踪变更,并将它们提交到Git:

dvc add data/01_raw/companies.csv
git add data/01_raw/companies.csv.dvc
git commit -m "Track dataset changes with DVC"

DVC与Git集成以管理不同的数据集版本。如果需要恢复数据集的先前版本,首先确定包含所需版本的提交。你可以使用:

git log -- data/01_raw/companies.csv.dvc

显示与此文件关联的提交哈希值。找到所需的提交后,运行:

git checkout <commit_hash> data/01_raw/companies.csv.dvc
dvc checkout

第一条命令将恢复.dvc元数据文件到之前的版本。第二条命令则利用该元数据文件来恢复对应的数据集。

Building workspace index
Comparing indexes
Applying changes
M       data/01_raw/companies.csv

再次使用命令 tail data/01_raw/companies.csv 显示数据集文件已恢复到之前的版本。

1618,100%,,1.0,t
6957,,Rwanda,1.0,t
7554,100%,,1105.0,f
34243,95%,Uzbekistan,1.0,f
12502,89%,Denmark,1.0,f
20213,,Russian Federation,1.0,f
2235,100%,Guinea,1.0,f
2353,100%,Senegal,2.0,t
49772,100%,Jersey,1.0,f
16548,90%,,2.0,f

高级使用案例

如何远程存储数据

DVC远程存储提供访问外部存储位置的功能,通过dvc pushdvc pull命令来跟踪和共享您的数据和机器学习模型。这些存储将在设备之间或项目团队成员之间共享。它支持多种不同的存储类型,如Amazon S3、Azure Blob Storage或Google Cloud Storage,以及自托管选项。有关此主题的更多详细信息,请参阅DVC关于远程存储的文档

例如:

dvc remote add myremote s3://mybucket
kedro run
git add .
git commit -m "Update"
dvc push

如何回退到远程存储的数据的先前版本

git checkout <commit hash> data/01_raw/companies.csv.dvc
dvc checkout
dvc pull

如何使用DVC对数据管道进行版本控制

虽然之前的方法允许你对数据集进行版本控制,但它存在一些限制,因为DVC要求手动添加需要跟踪的文件:

  • 中间数据集和输出数据集必须单独添加到DVC中。

  • 参数和代码变更未被明确追踪。

  • 追踪工件和指标可能很繁琐。

为解决这些问题,您可以将Kedro流水线定义为dvc.yaml文件中的DVC阶段。阶段列表通常是dvc.yaml文件中最重要的部分。该文件还可用于配置工件、指标、参数和图表,既可以作为阶段定义的一部分,也可以单独配置。

有关这些文件配置的更多信息,请参阅dvc.yaml文档

如何将Kedro流水线定义为DVC阶段

以下是dvc.yaml的示例配置:

stages:
  data_processing:
    cmd: kedro run --pipeline data_processing
    deps:
      - data/01_raw/companies.csv
      - data/01_raw/reviews.csv
      - data/01_raw/shuttles.xlsx
    outs:
      - data/02_intermediate/preprocessed_companies.parquet
      - data/02_intermediate/preprocessed_shuttles.parquet
      - data/03_primary/model_input_table.parquet

  data_science:
    cmd: kedro run --pipeline data_science
    deps:
      - data/03_primary/model_input_table.parquet
    outs:
      - data/06_models/regressor.pickle

运行管道的命令如下:

dvc repro

如何更新数据集

如果其中一个数据集被更新,您可以仅重新运行受更改影响的管道。

命令 dvc repro 会在输出或依赖项发生变化时执行流水线。

如何跟踪代码变更

您可以通过将相关文件添加到dvc.yaml中的deps部分来跟踪代码变更。

stages:
  data_processing:
    cmd: kedro run --pipeline data_processing
    deps:
      - data/01_raw/companies.csv
      - data/01_raw/reviews.csv
      - data/01_raw/shuttles.xlsx
      - src/space_dvc/pipelines/data_processing/nodes.py
      - src/space_dvc/pipelines/data_processing/pipeline.py
    outs:
      - data/02_intermediate/preprocessed_companies.parquet
      - data/02_intermediate/preprocessed_shuttles.parquet
      - data/03_primary/model_input_table.parquet

应用所需的代码更改后,运行dvc repro。输出应确认dvc.lock文件上的更新(如果有):

Updating lock file 'dvc.lock'
Use `dvc push` to send your updates to remote storage.

之后,可以使用dvc push命令将它们推送到远程存储。

如何跟踪参数

要跟踪参数,您可以将它们包含在dvc.yaml文件的params部分下。

stages:
  data_science:
    cmd: kedro run --pipeline data_science
    deps:
      - data/03_primary/model_input_table.parquet
      - src/space_dvc/pipelines/data_science/nodes.py
      - src/space_dvc/pipelines/data_science/pipeline.py
    params:
      - conf/base/parameters_data_science.yaml:
          - model_options
    outs:
      - data/06_models/regressor.pickle

运行流水线并推送更改:

dvc repro
dvc push

如何使用不同参数运行实验

要尝试不同的参数值,请更新parameters.yaml中的参数,然后使用dvc repro运行管道。

使用dvc params diff比较不同运行之间的参数变化:

Path                                   Param                       HEAD    workspace
conf/base/parameters_data_science.yml  model_options.features      -       ['engines', 'passenger_capacity', 'crew', 'd_check_complete', 'moon_clearance_complete', 'iata_approved', 'company_rating', 'review_scores_rating']
conf/base/parameters_data_science.yml  model_options.random_state  -       3
conf/base/parameters_data_science.yml  model_options.test_size     -       0.2