使用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库使用,可以通过pip或conda进行安装,例如:
`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 push和dvc 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