DVC:机器学习项目的数据与实验版本控制

FreeGuideOnline 最新 2026-06-20

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/.gitignoredvc.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 协作的完整示例

设想一个典型的合作流程:

  1. 数据提供者

    dvc add data/images/
    git add data/images.dvc .gitignore
    git commit -m "添加图像数据集 v1"
    dvc push
    git push
    
  2. 数据使用者(其他开发者):

    git clone <repo-url>
    dvc pull   # 自动根据 .dvc 文件下载对应版本的数据
    
  3. 数据更新: 当数据集变化后,重新执行 dvc add,提交新的 .dvc 文件,然后 dvc push。历史版本数据仍安全保留在远程存储中,可随时通过 Git 历史恢复。


管理实验:管道、指标与参数

DVC 不仅能管理数据,还能定义并执行可重复的实验管道,并跟踪实验参数、指标和中间产物。

定义管道

通过 dvc stagedvc.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