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

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

引言:那个撑爆 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 Open Source,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 哈希存储,实现自动去重 — 同一文件在不同版本中只存储一次。你可以配置远程存储以在团队间共享数据:

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

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

3. 流水线 (dvc.yaml) #

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

a
m
l
# 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 安装:

a
s
h
# 核心 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]"     # 所有远程后端

验证安装:

a
s
h
dvc --version
# dvc version 3.67.1

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

a
s
h
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 追踪:

a
s
h
# 添加单个文件
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 文件。提交它:

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

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

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

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

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

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

Amazon S3 #

a
s
h
# 添加 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) #

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

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

Azure Blob Storage #

a
s
h
# 添加 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'

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

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

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

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

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

定义 ML 流水线 #

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

a
m
l
# 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

运行流水线:

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

# 运行特定阶段
dvc repro train

# 可视化流水线
dvc dag

参数定义在 params.yaml 中:

a
m
l
# params.yaml
prepare:
  split: 0.2
  seed: 42

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

实验追踪 #

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

a
s
h
# 运行修改参数的实验
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

比较实验结果:

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

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

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

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

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

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

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

GitHub Actions #

a
m
l
# .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 #

a
m
l
# .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

基准测试与true实用例 #

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

| 指标 | 数值 | 来源 | |——

|——

|——

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

性能基准 #

| 操作 | 1 GB 数据集 | 50 GB 数据集 | 1 TB 数据集 | |——

|————-

|————–

|————-

| | dvc add (本地 SSD) | 2.1s | 45s | 18 分钟 | | dvc push (到 S3) | 8s | 3.2 分钟 | 52 分钟 | | dvc pull (从 S3) | 5s | 2.1 分钟 | 38 分钟 | | dvc checkout (切换版本) | 0.3s | 2.1s | 8.5s |

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

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

true实用例 #

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

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

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

高级用法与生产加固 #

存储优化 #

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

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

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

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

多环境远程存储 #

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

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

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

从外部源导入数据 #

a
s
h
# 导入数据而不复制 (追踪外部 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

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

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

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

# 检查缓存健康状态
dvc fsck

保护敏感数据 #

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

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

与替代方案对比 #

| 功能 | DVC | Git LFS | Pachyderm | LakeFS | MLflow | |——

|—–

|———

|———–

|——–

|——–

| | Open Source | 是 (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, MinIO | S3, GCS, Azure | 无原生存储 | | Git 集成 | 深度 (类 Git 命令) | 扩展 (git lfs 命令) | 独立 | 独立 | 基于插件 | | 实验追踪 | 内置 | 否 | 否 | 否 | 主要功能 | | 去重 | 内容寻址 | 否 | 否 | 写时复制 | 不适用 | | CI/CD 集成 | 原生 | 通过 Git | 通过 API | 原生 | 基于插件 | | 自托管选项 | 是 | 是 (Git LFS 服务器) | 是 (Kubernetes) | 是 (Kubernetes) | 是 | | 社区规模 | 15.6k stars | 5k+ stars | 6k+ stars | 4k+ stars | 19k stars |

何时选择什么 #

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

局限性:诚实的评估 #

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

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

  2. 非 Git 用户的学习曲线: DVC false设你已熟悉 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

h
o
n
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 或共享驱动器上的数据吗? 可以。对网络连接存储使用本地远程:

a
s
h
dvc remote add -d myremote /mnt/shared-nas/dvc-storage

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

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

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

今天就开始:

a
s
h
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+ 全球节点。运行Open Source AI 工具的首选。
  • HTStack — 香港 VPS,国内访问低延迟,dibi8.com 自己也跑在它上面,生产环境验证过。

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

Affiliate 声明 #

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

💬 留言讨论