管理机器学习项目会遇到特有难题,特别是当数据集和模型过大,无法放入标准Git仓库时。Git擅长代码版本控制,但跟踪数GB大小的文件会影响其性能并导致仓库膨胀。数据版本控制 (DVC) 解决了这些挑战。DVC是一款开源工具,专门设计用于为数据和模型提供版本控制能力,它与Git协同工作而非取代Git。可以将其视为Git能力的延伸,以应对机器学习中常见的庞大文件。DVC 的工作方式:主要思路DVC背后的基本思路很简单:DVC不会将大文件直接存储在Git仓库中,而是存储轻量级的元数据文件(称为.dvc文件),这些文件充当指向实际数据的指针。这些.dvc文件由Git跟踪。具体情况如下:跟踪数据: 您使用 dvc add 命令告诉DVC需要跟踪哪些大文件或目录。创建元数据: DVC计算数据内容的哈希值(一个独特的指纹,通常是MD5),并创建一个小的.dvc文件。该文件包含哈希值和定位实际数据所需的其他信息。存储数据: DVC将原始数据文件移入一个隐藏的本地缓存(通常在项目目录的.dvc/cache中)。此缓存使用内容寻址存储,即文件根据其哈希值存储。这能防止数据重复;如果同一文件有多个副本(即使名称或位置不同),DVC在缓存中只存储一份。版本元数据: 您将小的.dvc文件提交到Git,就像处理任何其他代码变更一样。您的Git仓库现在包含代码和这些指针,但没有大文件本身。共享数据(可选): 您可以配置DVC,使用 dvc push 命令将本地缓存中的实际数据推送到远程存储(如云存储桶或网络驱动器)。这样可以方便协作和备份,而不会给Git服务器增加负担。DVC 架构组成了解DVC需要认识其主要组成部分以及它们如何协同作用:DVC 命令行界面 (CLI): 这是您与DVC交互的主要界面。dvc init、dvc add、dvc push、dvc pull 和 dvc checkout 等命令用于管理数据版本控制过程。.dvc 文件: 这些小型、易读的文本文件(通常为YAML格式)位于您的Git仓库中。它们包含元数据,包括数据文件的哈希值、大小,以及其在DVC缓存或远程存储配置中的潜在路径。它们充当Git历史记录与特定数据版本之间的链接。DVC 缓存: 一个本地目录(例如 .dvc/cache),DVC在此处存储实际数据文件,并按其内容哈希值进行组织。此机制通过重复数据删除来保证数据完整性和高效存储。默认情况下,DVC会尝试使用优化的文件链接(如reflinks或硬链接)来避免在您的工作区和缓存之间重复数据,从而节省磁盘空间。远程存储: DVC可以存储和获取数据版本的本地机器之外的位置。这可以是云存储(AWS S3、Google Cloud Storage、Azure Blob Storage)、SSH服务器、网络驱动器,甚至是您本地文件系统上的另一个目录。远程存储可以按项目或全局配置。与 Git 紧密配合DVC旨在补充Git,为代码和数据版本控制创建统一的工作流程:Git 跟踪: 您的源代码(.py文件、脚本等)和.dvc元数据文件。DVC 跟踪: .dvc文件引用的那些大文件和模型成果。当您在Git中切换分支或检出某个历史提交时,您会得到与该历史点对应的代码和.dvc文件。然而,您工作区中的大文件可能不会自动与这些.dvc文件匹配。为了使您的工作区数据与当前.dvc文件指定的版本保持一致,您通常需要运行 dvc checkout 或 dvc pull。DVC随后会根据.dvc文件中的信息,从缓存或远程存储中获取正确的数据版本,并将其放入您的工作目录。下图描绘了这种关系:digraph DVC_Git_Integration { rankdir=LR; node [shape=box, style="filled", fontname="sans-serif", fillcolor="#e9ecef"]; edge [fontname="sans-serif"]; subgraph cluster_git { label = "Git 仓库"; bgcolor="#d0bfff20"; git_repo [label="代码 (.py)\n.dvc 文件\n配置", fillcolor="#bac8ff"]; } subgraph cluster_workspace { label = "工作区"; bgcolor="#a5d8ff20"; workspace [label="代码 (.py)\n数据文件\n模型", fillcolor="#a5d8ff"]; } subgraph cluster_dvc { label = "DVC 管理"; bgcolor="#96f2d720"; dvc_cache [label="DVC 缓存\n(.dvc/cache)\n(内容哈希)", fillcolor="#96f2d7"]; remote_storage [label="远程存储\n(S3, GCS, SSH...)", shape=cylinder, fillcolor="#ffec99"]; } git_repo -> workspace [label="git checkout"]; workspace -> git_repo [label="git add/commit\n(.py, .dvc 文件)"]; workspace -> dvc_cache [label="dvc add"]; dvc_cache -> workspace [label="dvc checkout"]; dvc_cache -> remote_storage [label="dvc push"]; remote_storage -> dvc_cache [label="dvc pull"]; git_repo -> dvc_cache [label="通过 .dvc 文件哈希引用", style=dashed, constraint=false, color="#868e96"]; }Git、工作区、DVC 缓存和远程存储之间的关系。Git对代码和.dvc文件进行版本控制,而DVC则根据.dvc文件中的信息,管理工作区、缓存和远程存储之间的数据流动。为何使用 DVC?采用DVC能为您的机器学习项目带来多方面好处:轻量化Git仓库: 由于大文件单独处理,Git历史记录保持整洁,仓库体积小且速度快。数据和模型版本控制: 提供一种系统化的方法,随着时间推移跟踪数据集和模型的变化,类似于Git跟踪代码变化。可复现性: 将特定版本的代码(通过Git提交)与所用数据和模型的精确版本(通过.dvc文件)关联起来,使实验更容易复现。协作: 通过共享远程存储,简化团队成员之间共享大型数据集和模型的过程。存储无关: 可与各种后端存储选项配合使用,提供部署上的灵活性。框架无关: 独立于特定的机器学习库或框架运行。既然您已了解DVC是什么以及它如何与Git配合使用,接下来的部分将指导您完成在项目中设置DVC、跟踪数据、配置远程存储以及管理不同数据版本的实际步骤。