什么是 DVC?
数据版本控制 是一款免费、开源的工具,用于数据管理、机器学习流程自动化以及实验管理。它帮助数据科学和机器学习团队管理大型数据集,使项目具备可复现性,并实现更高效的协作。
DVC 充分利用了团队已熟悉的现有软件工程工具集(Git、IDE、CI/CD、云存储等)。其设计遵循以下原则:
- 代码化:以人类可读的元文件形式定义机器学习项目的各个方面(数据与模型版本、机器学习流程和实验)。这使得可以采用最佳实践和成熟的工程工具,缩小数据科学与传统软件工程之间的差距。
- 版本控制:使用 Git(或任何源码管理系统)对整个机器学习项目进行版本管理和共享,包括源代码和配置、参数与指标,以及数据资产和处理流程,只需提交 DVC 元文件(作为占位符)即可。
- 安全协作:控制对项目各个方面的访问权限,并与您选择的人员和团队共享。
特性
-
DVC 提供 VS Code 扩展、命令行接口以及Python API 三种形式。这些选项为广泛的用户提供了熟悉且直观的用户体验。
-
易于使用:DVC 安装迅速,开箱即用。无需特殊基础设施,也不依赖于 API 或外部服务。
支持与现有解决方案和平台(如 Git 托管服务、SSH 和云存储提供商等)进行可选集成。
-
基于 Git 仓库运行,操作体验和流程与 Git 类似。继续使用常规的 Git 工作流(提交、分支、拉取请求等),无需重新发明轮子!
DVC 也可以独立运行,但将不具备版本控制功能。
-
自带资源:可在本地或云端使用已有的资源,包括存储、计算资源、CI 工作节点等,并在其上运行 DVC。您不会被锁定在任何单一供应商!
-
DVC 具备平台无关性:可在所有主流操作系统(Linux、macOS 和 Windows)上运行,且不依赖特定编程语言(Python、R、Julia、Shell 脚本等)或机器学习库(Keras、TensorFlow、PyTorch、Scipy 等)。
相关技术对比
DVC 将多种现有理念整合到一个工具中,旨在将软件工程的最佳实践引入数据科学领域。
DVC 基于 Git 构建,引入了“数据版本控制”的概念——即那些不应直接存入 Git 仓库的大文件,但仍需被追踪和版本化。它利用 Git 的功能来管理不同版本的数据、数据流水线和实验。
DVC 并不强制依赖 Git,也可以在无 Git 环境下运行(但会缺失与版本控制相关的功能)。
DVC 并不能替代 Git! DVC 的元文件(如 dvc.yaml
和 .dvc
文件)用于作为数据和机器学习流程的版本占位符。这些文件会随着你的数据变化而变化,你可以使用 Git 将它们纳入版本控制,以代理实际存储在缓存中(不在 Git 中)的数据。
不过,DVC 确实提供了一些类似于 Git 的命令,例如 dvc init
、dvc add
、dvc checkout
或 dvc push
,这些命令会与底层的 Git 仓库进行交互(如果存在 Git 仓库的话,但这不是必需的)。
-
DVC 可以根据系统情况使用 reflinks* 或硬链接代替符号链接,以提升性能和用户体验。
-
Git-annex 是以数据文件为中心的系统,而 DVC 则专注于为机器学习和可复现实验提供工作流。当通过
git clone
克隆 DVC 或 Git-annex 仓库时,数据文件不会被复制到本地机器,因为文件内容存储在独立的远程位置。然而,DVC 的.dvc
文件始终包含在 Git 仓库中,这些文件提供了可复现的工作流,因此可以轻松地在本地执行。 -
DVC 对文件哈希计算进行了优化。
* (写时复制) 链接或reflinks是现代文件系统中支持的一种文件链接类型。与硬链接或符号链接不同,编辑 reflinks 始终是安全的,因为原始缓存中的数据将保持不变。
-
DVC 支持一种新的实验方法,能够轻松集成标准的 Git 工作流。例如,可以为每个实验创建单独的分支,若实验成功,则可将该分支合并回去。
-
DVC 的创新之处在于,用户可以轻松浏览过往实验,而无需每次都重新计算。
另请参阅实验管理指南。
-
DVC 使用 Git 作为数据、流水线和实验的底层版本控制层。数据版本以元数据形式存在于 Git 中,而不是依赖外部数据库或 API,因此无需额外的服务。
-
DVC 无需运行任何服务。因此没有内置的图形用户界面,但我们有姊妹项目 DVC Studio 来弥补这一空白。
-
DVC 可以生成包含实验工作流可视化内容的图像。
-
DVC 具有透明的设计。DVC 文件采用人类可读的格式,外部工具可以轻松复用。
Make 等工具。
-
文件追踪:
-
DVC 基于文件的哈希值(MD5)而非时间戳来追踪文件。这有助于避免在检出项目早期版本时触发耗时的操作(例如模型重新训练),而 Make 工具则会重新训练模型。
-
DVC 使用文件的时间戳和 inodes* 进行优化。这使得 DVC 能够避免重新计算所有依赖文件的哈希值,从而在处理大文件(数 GB 以上)时避免严重性能问题。
-
-
DVC 使用了 有向无环图(DAG):
-
依赖关系图通过各个 阶段之间的连接隐式定义,依据是它们的 依赖项 和 输出项。
-
每个阶段在 DAG 中定义一个节点,
dvc.yaml
文件包含这些阶段的定义(类似于 Makefile)。所有阶段(及其对应的过程)通过输入和输出隐式关联,从而简化合并时的冲突解决。 -
DVC 阶段可以手动编写在直观的
dvc.yaml
文件中,也可以通过辅助命令dvc stage add
根据终端命令及其输入和输出自动生成。
-
* Inode 是用于定位实际文件内容并存储权限信息的元数据记录。技术细节请参阅 本文档 中的“文件链接”部分(Linux)。