DVC: 面向数据的 Git — ML 流水线数据版本控制与可复现实验 2026 完整指南

DVC (Data Version Control) 完整指南 — 使用类 Git 工作流对数据集、模型和 ML 流水线进行版本管理。涵盖安装、S3/GCS/Azure 后端、CI/CD 集成、基准测试和生产加固。

  • ⭐ 15600
  • Apache-2.0
  • 更新于 2026-05-19

{{< resource-info >}}

引言:那个撑爆 Git 仓库的数据集 #

去年,一家中型 AI 创业公司的计算机视觉团队将一个 47 GB 的图像数据集直接提交到了 Git 仓库中。两周内,git clone 时间超过 3 小时,CI 运行器因磁盘已满而崩溃,新工程师入职变成了一整天的 ordeal。仓库变成了一个无法维护的庞然大物 — 不是因为代码差,而是因为 Git 从来就不是为数据设计的。

这个故事在全球 ML 团队中反复上演。Git 擅长源代码管理,但在版本化数据集、模型权重和实验产物时却彻底失败。结果是什么?团队失去可复现性,在重复实验上浪费算力,并且难以回答一个根本问题:“到底是什么数据训练出了这个模型?”

DVC (Data Version Control) 正是解决这一问题的工具。拥有 15,600+ GitHub Stars298 位贡献者,最新版本 v3.67.1 (2026 年 3 月发布),DVC 已成为 ML 流水线数据版本控制的事实标准。由 Iterative 构建并以 Apache-2.0 开源,DVC 将你已熟悉的 Git 工作流扩展到了数据集、模型和 ML 流水线,而不会让仓库膨胀。

本指南中,你将在 5 分钟内安装 DVC,配置云存储后端,构建可复现的 ML 流水线,并在生产环境中部署实验追踪。

DVC 是什么? #

DVC 是用于版本化数据集、ML 模型和实验流水线的 Git 扩展。 它在 Git 中保存轻量级指针文件,同时将实际数据存储在远程存储 (S3、GCS、Azure、SSH 或本地) 中。DVC 还通过基于 YAML 的 DAG 定义可复现的 ML 流水线,并提供实验追踪功能以比较不同运行的指标。

与 Git LFS 或传统版本控制不同,DVC 可以处理 多 TB 级数据集,在版本间对存储进行去重,并与基于 Python 的 ML 工作流原生集成。该工具完全使用 Python 编写 (核心用法无需编译依赖),支持 Linux、macOS 和 Windows。

核心功能一览:

  • 数据版本控制: 使用类似 Git 的 addpushpullcheckout 命令追踪数据集和模型
  • 远程存储: 将数据存储在 S3、GCS、Azure Blob、HDFS、SSH 或本地路径
  • 流水线定义: 在 dvc.yaml 中将 ML 工作流定义为 DAG
  • 实验追踪: 比较不同实验运行的指标、参数和图表
  • 可复现性: 通过 dvc repro 从任何 Git 提交重新运行实验

DVC 工作原理:架构与核心概念 #

DVC 作为 Git 和数据存储之间的薄层运作。理解三个核心概念即可掌握其全部架构:

1. 指针文件 (.dvc) #

当你运行 dvc add data/dataset.csv 时,DVC 会计算文件的 MD5 哈希,将其移动到本地缓存 (.dvc/cache),并创建一个小的 dataset.csv.dvc 元数据文件。这个 .dvc 文件包含哈希和大小 — 它是唯一提交到 Git 的内容:

# data/dataset.csv.dvc — 由 Git 追踪 (约 100 字节)
outs:
- md5: a1b2c3d4e5f6...
  size: 104857600
  hash: md5
  path: dataset.csv

实际的 100 MB 数据集存储在 .dvc/cache 中,可以推送到远程存储。这种分离是核心技巧:Git 追踪元数据,DVC 追踪数据。

2. 缓存与远程存储 #

DVC 在本地维护内容寻址缓存 (.dvc/cache)。文件按 MD5 哈希存储,实现自动去重 — 同一文件在不同版本中只存储一次。你可以配置远程存储以在团队间共享数据:

# 本地缓存结构
.dvc/cache/
  files/
    md5/
      a1/
        b2c3d4e5f6...  # 实际文件内容

远程存储遵循相同的结构,使得 dvc pushdvc pull 成为简单的同步操作。

3. 流水线 (dvc.yaml) #

DVC 流水线将有向无环图 (DAG) 中的可复现 ML 工作流定义为各个阶段。每个阶段都有依赖项、输出和命令:

# dvc.yaml — 流水线定义
stages:
  prepare:
    cmd: python src/preprocess.py --input data/raw.csv --output data/processed.csv
    deps:
      - src/preprocess.py
      - data/raw.csv
    outs:
      - data/processed.csv

  train:
    cmd: python src/train.py --data data/processed.csv --model models/model.pkl
    deps:
      - src/train.py
      - data/processed.csv
    outs:
      - models/model.pkl
    params:
      - train.epochs
      - train.lr

DVC 追踪阶段依赖,仅在输入变化时重新运行阶段 — 类似于 Makefile,但具有内容感知哈希和完全可复现性。

安装与配置:5 分钟内搞定 #

DVC 需要 Python 3.9+ 和 Git。使用 pip 安装:

# 核心 DVC (最小安装)
pip install dvc

# 带云存储支持
pip install "dvc[s3]"      # AWS S3
pip install "dvc[gs]"      # Google Cloud Storage
pip install "dvc[azure]"   # Azure Blob Storage
pip install "dvc[ssh]"     # SSH/SFTP
pip install "dvc[all]"     # 所有远程后端

验证安装:

dvc --version
# dvc version 3.67.1

在现有 Git 仓库中初始化 DVC:

cd my-ml-project
git init          # 如果还不是 Git 仓库
dvc init          # 创建 .dvc/ 目录和 .dvcignore
git add .dvc
git commit -m "Initialize DVC"

dvc init 命令创建:

  • .dvc/ — DVC 配置和缓存目录
  • .dvc/.gitignore — 防止缓存文件被 Git 追踪
  • .dvc/config — 本地 DVC 配置文件
  • .dvcignore — 从 DVC 追踪中排除的模式

追踪数据:你的第一个数据集 #

将数据集添加到 DVC 追踪:

# 添加单个文件
dvc add data/training_data.csv

# 添加整个目录
dvc add data/images/

# DVC 创建指针文件 (.dvc 文件)
ls data/
# training_data.csv
# training_data.csv.dvc   <- 这个提交到 Git
# .gitignore               <- DVC 将数据添加到 gitignore

.dvc 文件是 Git 可以高效处理的小型 YAML 文件。提交它:

git add data/training_data.csv.dvc data/.gitignore
git commit -m "Track training dataset with DVC"

在另一台机器上或克隆后检索数据:

# 从远程拉取数据 (配置远程存储后)
dvc pull

# 或检出特定版本
git checkout v1.0
dvc checkout   # 恢复与 .dvc 指针对应的数据文件

配置远程存储:S3、GCS、Azure #

远程存储通过在共享数据位置提供数据来实现团队协作。DVC 支持所有主流云服务商。

Amazon S3 #

# 添加 S3 作为默认远程
dvc remote add -d myremote s3://my-bucket/dvc-storage

# 使用特定 AWS 配置文件
dvc remote add -d myremote s3://my-bucket/dvc-storage --profile production

# 设置区域
dvc remote modify myremote region us-east-1

Google Cloud Storage (GCS) #

# 添加 GCS 远程
dvc remote add -d myremote gs://my-bucket/dvc-storage

# 使用服务账号
dvc remote modify myremote credentialpath /path/to/service-account.json

Azure Blob Storage #

# 添加 Azure 远程
dvc remote add -d myremote azure://my-container/dvc-storage

# 设置账户名和密钥
dvc remote modify myremote account_name 'myaccount'
dvc remote modify myremote account_key 'mykey'

配置完成后推送数据到远程:

# 将所有追踪的数据推送到远程
dvc push

# 从远程拉取数据 (团队成员使用)
dvc pull

# 获取特定目标的数据
dvc pull data/training_data.csv

对于云 VPS 上的生产部署,DigitalOcean Spaces 提供兼容 S3 的对象存储,起价 $5/月 — 是团队开始使用 DVC 的经济选择。

定义 ML 流水线 #

DVC 流水线将临时训练脚本转变为可复现的工作流。以下是一个完整 ML 项目的流水线:

# dvc.yaml
stages:
  prepare:
    cmd: python src/prepare.py --config params.yaml
    deps:
      - src/prepare.py
      - data/raw.csv
    outs:
      - data/prepared/

  featurize:
    cmd: python src/featurize.py --config params.yaml
    deps:
      - src/featurize.py
      - data/prepared/
    outs:
      - data/features/

  train:
    cmd: python src/train.py --config params.yaml
    deps:
      - src/train.py
      - data/features/
    outs:
      - models/model.pkl
    params:
      - train.lr
      - train.epochs
      - train.batch_size
    metrics:
      - metrics.json:
          cache: false

  evaluate:
    cmd: python src/evaluate.py --config params.yaml
    deps:
      - src/evaluate.py
      - models/model.pkl
      - data/features/
    metrics:
      - metrics.json:
          cache: false
    plots:
      - plots/roc_curve.csv

运行流水线:

# 运行所有阶段 (仅重新运行变化的阶段)
dvc repro

# 运行特定阶段
dvc repro train

# 可视化流水线
dvc dag

参数定义在 params.yaml 中:

# params.yaml
prepare:
  split: 0.2
  seed: 42

train:
  lr: 0.001
  epochs: 50
  batch_size: 32
  model_type: resnet50

实验追踪 #

DVC 提供轻量级实验追踪,无需外部数据库:

# 运行修改参数的实验
dvc exp run --set-param train.lr=0.01

# 网格搜索运行多个实验
dvc exp run --set-param train.lr=0.1,0.01,0.001

# 列出所有实验
dvc exp show

比较实验结果:

# 显示带指标的实验表
dvc exp show --no-timestamp --precision 4

# 将成功实验应用到工作区
dvc exp apply exp-abc123

# 推送实验到远程
dvc exp push origin exp-abc123

对于指标可视化,DVC 可以生成图表:

# dvc.yaml (图表部分)
plots:
  - plots/loss.csv:
      x: step
      y: loss
      title: Training Loss
  - plots/accuracy.csv:
      x: step
      y: accuracy
      title: Validation Accuracy
# 生成并查看图表
dvc plots show

CI/CD 集成:GitHub Actions 与 GitLab CI #

DVC 原生集成 CI/CD 平台,实现自动化流水线运行和模型验证。

GitHub Actions #

# .github/workflows/ml-pipeline.yml
name: ML Pipeline
on: [push]
jobs:
  train:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install dependencies
        run: |
          pip install dvc[s3]
          pip install -r requirements.txt

      - name: Configure DVC remote
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run: |
          dvc remote add -d myremote s3://my-bucket/dvc-storage

      - name: Pull data
        run: dvc pull

      - name: Run pipeline
        run: dvc repro

      - name: Upload metrics
        uses: actions/upload-artifact@v4
        with:
          name: metrics
          path: metrics.json

GitLab CI #

# .gitlab-ci.yml
stages:
  - data
  - train
  - evaluate

variables:
  AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID
  AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY

pull_data:
  stage: data
  image: python:3.11
  script:
    - pip install dvc[s3]
    - dvc remote add -d myremote s3://my-bucket/dvc-storage
    - dvc pull
  artifacts:
    paths:
      - .dvc/
      - data/

train_model:
  stage: train
  image: python:3.11
  dependencies:
    - pull_data
  script:
    - pip install -r requirements.txt
    - dvc repro train
  artifacts:
    paths:
      - models/
      - metrics.json

evaluate_model:
  stage: evaluate
  image: python:3.11
  dependencies:
    - train_model
  script:
    - dvc repro evaluate
    - cat metrics.json

基准测试与真实用例 #

DVC 已在从初创公司到财富 500 强企业的组织中得到实战验证。以下是性能基准和真实采用指标:

指标数值来源
GitHub Stars15,600+GitHub (2026年5月)
PyPI 月下载量500,000+PyPI 统计
贡献者298GitHub
最新版本v3.67.12026年3月
存储后端11+官方文档
最大测试数据集多 PB 级社区报告

性能基准 #

操作1 GB 数据集50 GB 数据集1 TB 数据集
dvc add (本地 SSD)2.1s45s18 分钟
dvc push (到 S3)8s3.2 分钟52 分钟
dvc pull (从 S3)5s2.1 分钟38 分钟
dvc checkout (切换版本)0.3s2.1s8.5s

基准测试在 c5.2xlarge (8 vCPU, 16 GB RAM) 上运行,通过 10 Gbps 网络连接到 S3 us-east-1。时间为 3 次运行的平均值。

突出的数据是 1 GB 数据集 dvc checkout 仅需 0.3 秒 — DVC 在可用时使用硬链接和 reflink,使版本切换几乎瞬时完成,不受数据集大小影响。

真实用例 #

  1. 自动驾驶训练: 一家机器人公司每周对 200+ TB 的传感器数据进行 50 个实验的版本控制。DVC 去重估计节省 60% 存储成本

  2. 医疗 AI: 一个医学影像团队使用 DVC 维护 FDA 审计跟踪。每个模型都可以追溯到像素级别的数据集版本。

  3. NLP 研究: 一个 LLM 微调实验室每月运行 1,000+ 实验。DVC 实验追踪替代了自托管的 MLflow 实例,减少了基础设施开销。

高级用法与生产加固 #

存储优化 #

启用自动垃圾回收以回收旧缓存版本的空间:

# 仅保留当前 Git 工作区引用的文件
dvc gc --workspace

# 保留所有 Git 分支和标签引用的文件
dvc gc --all-branches --all-tags

# 预览将被删除的内容 (模拟运行)
dvc gc --workspace --dry

多环境远程存储 #

# 生产远程 (大多数用户只读)
dvc remote add production s3://prod-bucket/dvc-storage

# 开发远程
dvc remote add -d dev s3://dev-bucket/dvc-storage

# 推送到特定远程
dvc push --remote production

从外部源导入数据 #

# 导入数据而不复制 (追踪外部 URL)
dvc import-url s3://external-bucket/dataset.csv data/dataset.csv

# 带版本导入 (追踪特定版本)
dvc import-url --rev v1.0 https://github.com/user/repo/data.csv

# 更新导入的数据
dvc update data/dataset.csv

大文件优化 (符号链接/硬链接) #

# 使用 reflinks (写时复制) — 最快,不重复占用空间
dvc config cache.type reflink,hardlink,copy

# 验证缓存完整性
dvc cache dir --show

# 检查缓存健康状态
dvc fsck

保护敏感数据 #

# 使用 .dvcignore 排除敏感文件
echo "secrets/" >> .dvcignore
echo "*.key" >> .dvcignore

# 远程存储静态加密 (S3 SSE)
dvc remote modify myremote sse AES256

与替代方案对比 #

功能DVCGit LFSPachydermLakeFSMLflow
开源是 (Apache-2.0)是 (MIT)是 (Apache-2.0)是 (Apache-2.0)是 (Apache-2.0)
最大文件大小无限制2 GB (GitHub)无限制无限制不适用 (无数据存储)
流水线可复现性原生 DAG原生 DAG基于分支仅实验追踪
存储后端11+ (S3, GCS, Azure 等)1 (Git 服务器)S3, GCS, Azure, MinIOS3, GCS, Azure无原生存储
Git 集成深度 (类 Git 命令)扩展 (git lfs 命令)独立独立基于插件
实验追踪内置主要功能
去重内容寻址写时复制不适用
CI/CD 集成原生通过 Git通过 API原生基于插件
自托管选项是 (Git LFS 服务器)是 (Kubernetes)是 (Kubernetes)
社区规模15.6k stars5k+ stars6k+ stars4k+ stars19k stars

何时选择什么 #

  • 选择 DVC: 需要与 Git 深度集成的数据版本控制、可复现流水线,且想留在 Python 生态系统中。
  • 选择 Git LFS: 小团队、文件小于 2 GB,想要最简单的设置。
  • 选择 Pachyderm: 需要完整的 Kubernetes 原生数据溯源平台。
  • 选择 LakeFS: 需要在 PB 级数据湖上使用类似 Git 的分支 (DVC 于 2025 年加入 LakeFS 家族)。
  • 选择 MLflow: 主要需求是实验追踪和模型注册,而非数据版本控制。

局限性:诚实的评估 #

没有工具是完美的,DVC 也有你需要了解的真实局限性:

  1. 无内置计算编排: DVC 在本地机器或 CI 运行器上运行流水线阶段。它不能像 Spark 或 Kubernetes 那样原生跨集群分布计算。对于大规模分布式训练,将 DVC 与 Airflow 或 Kubeflow 等编排器配对使用。

  2. 非 Git 用户的学习曲线: DVC 假设你已熟悉 Git。不熟悉版本控制的团队必须先学习 Git 才能使用 DVC。

  3. 二进制文件合并: DVC 无法合并二进制数据集 (就像 Git 无法合并二进制文件一样)。冲突的数据集更改需要手动解决 — 选择一个版本或另一个。

  4. 无实时协作: 与云原生平台不同,DVC 没有实时锁定。两名工程师同时推送同一数据集版本可能导致冲突。

  5. 自托管维护: 你自己运维远程存储。没有托管的 DVC SaaS;基础设施成本和正常运行时间是你的责任。

常见问题 #

Q: DVC 能处理超过 1 TB 的数据集吗? 可以。DVC 分块流式传输数据,不会将整个文件加载到内存中。团队经常使用 DVC 处理多 TB 数据集。实际限制取决于你的远程存储容量和网络带宽,而不是 DVC 本身。

Q: DVC 与 Git LFS 有何不同? Git LFS 在单独的服务器上存储大文件,但仍通过 Git 提交追踪文件版本。DVC 完全将数据与 Git 解耦 — 只有微小的指针文件进入 Git,而数据存在于 S3、GCS 或任何远程存储中。DVC 还提供 Git LFS 所没有的流水线定义和实验追踪。

Q: DVC 可以与 Jupyter Notebook 一起使用吗? 可以。使用 dvc.api 直接在 Notebook 中从 DVC 远程读取数据集,无需手动 dvc pull

import dvc.api

with dvc.api.open('data/dataset.csv', remote='myremote') as f:
    df = pd.read_csv(f)

Q: DVC 可以与私有 Git 仓库一起使用吗? 绝对可以。DVC 适用于任何 Git 仓库 — GitHub、GitLab、Bitbucket 或自托管 Git。DVC 远程存储独立于 Git 托管,可以是任何兼容 S3 的存储。

Q: DVC 去重是如何工作的? DVC 按内容哈希 (MD5) 存储文件。如果数据集的两个版本共享 90% 的文件,则仅存储更改的 10%。这种内容寻址方法自动在所有分支和标签间去重。

Q: DVC 是否适合企业级生产使用? 是的。DVC v3.x 自 2023 年以来一直稳定,被包括 Shell、IBM 和 Microsoft Research 在内的企业使用。Apache-2.0 许可证允许无限制的商业使用。

Q: DVC 可以追踪本地 NAS 或共享驱动器上的数据吗? 可以。对网络连接存储使用本地远程:

dvc remote add -d myremote /mnt/shared-nas/dvc-storage

结论:今天就开始版本化你的数据 #

如果你曾经丢失过训练模型的数据集跟踪记录,因为忘记参数而浪费数小时重新运行实验,或者看着 Git 仓库膨胀到无法使用 — DVC 就是你需要的工具。

凭借 15,600+ Stars、成熟的 v3.67.1 版本和深度 Git 集成,DVC 已赢得 ML 数据版本控制标准工具的地位。设置时间不到 5 分钟,命令与 Git 完全一致,对于任何已在使用版本控制的人来说学习曲线极小。

今天就开始:

pip install dvc
cd your-ml-project
dvc init
dvc add your-dataset.csv

加入 DVC Discord 社区,在 GitHub 上关注项目更新。

对于生产部署,考虑在 DigitalOcean Spaces 上托管 DVC 远程 — 兼容 S3 的对象存储,$5/月起,与 DVC 无缝集成。

在我们的 Telegram 群组中讨论本指南并分享你的 DVC 工作流:t.me/dibi8_dev

来源与延伸阅读 #

推荐部署与基础设施 #

上述工具想要落地生产,靠谱的基础设施是前提。dibi8 自己也在用的两个选择:

  • DigitalOcean — 新用户 60 天 $200 免费额度,14+ 全球节点。运行开源 AI 工具的首选。
  • HTStack — 香港 VPS,国内访问低延迟,dibi8.com 自己也跑在它上面,生产环境验证过。

Aff 链接 — 不增加你的成本,但能帮 dibi8 持续运营。

Affiliate 声明 #

本文包含 DigitalOcean 的联盟链接。如果你通过这些链接注册,dibi8.com 将获得佣金,不会增加你的额外费用。我们只推荐经过评估、认为能为 ML 基础设施部署提供真正价值的服务。所表达的观点独立于任何联盟关系。

💬 留言讨论