DVC:机器学习项目的数据与实验版本控制
bash
使用 pip 安装(推荐)
pip install dvc
macOS(使用 Homebrew)
brew install dvc
Linux(使用 snap)
snap install dvc
安装完成后,验证版本:
```bash
dvc version
在项目中初始化 DVC
进入你的 Git 项目根目录(如果还没有项目,先创建一个并用 git init 初始化 Git 仓库),然后运行:
dvc init
该命令会:
- 创建
.dvc目录,用于存储 DVC 内部配置和缓存。 - 生成
.dvc/.gitignore和dvc.yaml等基础文件。 - 将
.dvc/加入 Git 跟踪(但缓存文件会被忽略)。
初始化后,记得将生成的 DVC 元数据文件提交到 Git:
git add .dvc .dvcignore dvc.yaml
git commit -m "初始化 DVC"
核心概念速览
- DVC 文件(.dvc):轻量级的元数据文件,记录数据文件或目录的哈希值、远程存储路径等信息。它才是真正被 Git 版本控制的对象。
- 缓存:DVC 会在项目中的
.dvc/cache目录下保存所有数据的拷贝,通过哈希值索引,实现去重和快速恢复。 - 远程存储:数据实际存放的位置(本地路径、SSH、Amazon S3、GCS、Azure 等)。DVC 负责将缓存中的数据与远程存储同步。
- 管道(Pipeline):定义数据处理和模型训练的步骤,实现实验的可重复执行(可选,进阶使用)。
类比:Git 跟踪
.dvc文件,而 DVC 负责管理这些文件对应的大文件,如同一个“数据版本的 Git LFS”。
基础数据版本控制工作流
假设你的项目目录下有一个大型数据集文件 data/dataset.csv,你希望用 DVC 管理它。
1. 跟踪数据文件
dvc add data/dataset.csv
运行后,DVC 会:
- 计算
dataset.csv的 MD5 哈希,并将其存入缓存(.dvc/cache)。 - 生成
data/dataset.csv.dvc文件,内容类似:
outs:
- md5: 2e937f1b7b3e2b6e1c0e4f0a5f20a0e8
size: 1048576
path: dataset.csv
- 将
dataset.csv添加进.gitignore(推荐),以确保大文件不会被意外提交到 Git。
2. 将 DVC 元数据提交到 Git
git add data/dataset.csv.dvc .gitignore
git commit -m "添加数据集 dataset.csv 版本 1"
此时 Git 仓库中只有小巧的 .dvc 文件,真正的数据文件留在 DVC 缓存中。
3. 配置远程存储
要将数据共享给团队或备份到云端,需要设置远程存储。例如使用本地目录作为练习:
# 设置一个本地远程存储路径
dvc remote add -d myremote /tmp/dvc-storage
-d 表示将该远程设为默认远程。你可替换为云端存储,如 s3://mybucket/data。
4. 推送数据到远程
dvc push
该命令会将缓存中本版本的数据上传到远程存储。其他团队成员从 Git 拉取代码后,只需执行:
dvc pull
即可下载匹配当前 .dvc 文件哈希的数据。
与 Git 协作的完整示例
设想一个典型的合作流程:
-
数据提供者:
dvc add data/images/ git add data/images.dvc .gitignore git commit -m "添加图像数据集 v1" dvc push git push -
数据使用者(其他开发者):
git clone <repo-url> dvc pull # 自动根据 .dvc 文件下载对应版本的数据 -
数据更新: 当数据集变化后,重新执行
dvc add,提交新的.dvc文件,然后dvc push。历史版本数据仍安全保留在远程存储中,可随时通过 Git 历史恢复。
管理实验:管道、指标与参数
DVC 不仅能管理数据,还能定义并执行可重复的实验管道,并跟踪实验参数、指标和中间产物。
定义管道
通过 dvc stage 或 dvc.yaml 文件定义处理步骤,例如:
dvc stage add -n preprocess \
-d src/preprocess.py -d data/raw \
-o data/processed \
python src/preprocess.py
该命令在 dvc.yaml 中记录:
- 依赖项(
-d):代码脚本和原始数据 - 输出项(
-o):处理后的数据
执行管道:
dvc repro
DVC 会自动检查依赖是否变化,仅重新运行变更的步骤,并从缓存中恢复未变的输出。
跟踪指标与参数
你可以在 dvc.yaml 中指定参数文件(如 params.yaml)和指标文件(如 metrics.json),让 DVC 自动记录每次实验的结果。执行 dvc repro 后,运行:
dvc metrics show
dvc params diff