在 GitHub 上编辑

开始使用 DVC

点击播放即表示您同意 YouTube 的 隐私政策服务条款

能够像跟踪代码一样跟踪大型数据集和机器学习模型,同时避开将其存储在 Git 中的所有限制,这将是多么酷啊?想象一下克隆一个仓库并立即在工作区看到数据集、检查点和模型。想象一下用 git checkout 在不到一秒钟的时间内切换到 100GB 文件的不同版本。

💫 DVC 就是你的"数据的 Git"

初始化项目

开始之前,选择一个目录用于本指南。我们将在此处完成的所有操作都将包含在该目录中。

假设我们要从头开始构建一个 ML 项目。让我们首先创建一个 Git 仓库:

$ mkdir example-get-started
$ cd example-get-started
$ git init

此目录名在我们的 example-get-started 仓库中使用。

在选定的目录内,我们将使用当前工作目录作为 DVC 项目。让我们通过在 Git 项目内运行 dvc init 来初始化它:

$ dvc init

将创建一些 内部文件,这些文件应添加到 Git 中:

$ git status
Changes to be committed:
        new file:   .dvc/.gitignore
        new file:   .dvc/config
        ...
$ git commit -m "Initialize DVC"

现在你已经准备好使用 DVC!

跟踪数据

已初始化的项目 目录内工作,让我们选择要处理的数据。我们将使用示例 data.xml 文件,尽管任何文本或二进制文件(或目录)都可以。首先运行:

$ dvc get https://github.com/iterative/dataset-registry \
          get-started/data.xml -o data/data.xml

我们在上面使用了 dvc get 来展示 DVC 如何将任何 Git 仓库变成"数据注册表"。dvc get 可以下载 DVC 仓库 中跟踪的任何文件或目录。

使用 dvc add 开始跟踪数据集文件:

$ dvc add data/data.xml

DVC 将有关添加文件的信息存储在名为 data/data.xml.dvc 的特殊 .dvc 文件中。这个小的、人类可读的元数据文件作为原始数据的占位符,用于 Git 跟踪。

接下来,运行以下命令来跟踪 Git 中的更改:

$ git add data/data.xml.dvc data/.gitignore
$ git commit -m "Add raw data"

现在,关于数据的元数据 与源代码一起进行版本控制,而原始数据文件已添加到 .gitignore 中。

dvc add 将数据移动到项目 缓存,并将其 链接工作区.dvc/cache 将如下所示:

.dvc/cache/files/md5
└── 22
    └── a1a2931c8370d3aeedd7183606fd7f

刚刚添加的 data.xml 文件的哈希值(22a1a29...)决定了上面显示的缓存路径。如果你检查 data/data.xml.dvc,也会在那里找到它:

outs:
  - md5: 22a1a2931c8370d3aeedd7183606fd7f
    path: data.xml

存储和共享

你可以将 DVC 跟踪的数据上传到各种存储系统(远程或本地),这些系统被称为 "远程存储"。为了简单起见,本指南我们将使用"本地远程存储",它只是本地文件系统中的一个目录。

配置远程存储

在将数据推送到远程存储之前,我们需要使用 dvc remote add 命令进行设置:

$ mkdir /tmp/dvcstore
$ dvc remote add -d myremote /tmp/dvcstore
$ mkdir %TEMP%/dvcstore
$ dvc remote add -d myremote %TEMP%\dvcstore

DVC 支持多种远程存储类型,包括 Amazon S3、NFS、SSH、Google Drive、Azure Blob Storage 和 HDFS。

一个常见的用例示例是配置 Amazon S3 远程存储:

$ dvc remote add -d storage s3://mybucket/dvcstore

要使其正常工作,您需要一个 AWS 账户并设置凭据以允许访问。

要了解更多关于存储远程的信息,请参阅远程存储指南

上传数据

现在已配置了存储远程,运行 dvc push 来上传数据:

$ dvc push

dvc push 将本地缓存的数据复制到我们之前设置的远程存储中。远程存储目录应该如下所示:

.../dvcstore/files/md5
└── 22
    └── a1a2931c8370d3aeedd7183606fd7f

通常,我们还希望使用 Git 跟踪导致数据更改的任何代码更改(git addgit commitgit push)。

检索数据

一旦 DVC 跟踪的数据和模型存储在远程,就可以在需要时使用 dvc pull 下载(例如在该项目的其他副本中)。通常,我们在 git pullgit clone 之后运行它。

现在让我们尝试一下:

$ dvc pull

运行上面的 dvc push 后,dvc pull 命令被 DVC 为了效率而短路了。项目的 data/data.xml 文件、我们的缓存和远程存储都已同步。如果我们希望 DVC 实际传输数据,需要清空缓存并从项目中删除 data/data.xml。现在让我们这样做:

$ rm -rf .dvc/cache
$ rm -f data/data.xml
$ rmdir .dvc\cache
$ del data\data.xml

现在我们可以运行 dvc pull 从远程检索数据:

$ dvc pull

进行本地更改

接下来,假设我们从某些外部源获取了更多数据。我们将通过将数据集内容翻倍来模拟这一点:

$ cp data/data.xml /tmp/data.xml
$ cat /tmp/data.xml >> data/data.xml
$ copy data\data.xml %TEMP%\data.xml
$ type %TEMP%\data.xml >> data\data.xml

修改数据后,再次运行 dvc add 来跟踪最新版本:

$ dvc add data/data.xml

现在我们可以运行 dvc push 将更改上传到远程存储,然后使用 git commit 来跟踪它们:

$ dvc push
$ git commit data/data.xml.dvc -m "Dataset updates"

切换版本

一个常用的 工作流程是使用 git checkout 切换到一个分支或检出特定的 .dvc 文件修订版本,然后使用 dvc checkout 将数据同步到您的工作区

$ git checkout <...>
$ dvc checkout

返回数据集的先前版本

让我们回到数据的原始版本:

$ git checkout HEAD~1 data/data.xml.dvc
$ dvc checkout

让我们提交它(这次无需执行 dvc push,因为数据集的这个原始版本已经保存):

$ git commit data/data.xml.dvc -m "Revert dataset updates"

如您所见,DVC 从技术上讲本身并不是一个版本控制系统!它操作 .dvc 文件,其内容定义了数据文件版本。Git 已经用于版本控制您的代码,现在它还可以与您的数据一起进行版本控制。

遵循本指南

为了帮助您更好地理解和使用 DVC,我们提供了以下三个使用场景:数据管道实验跟踪模型管理。您可以任选其一,开始学习 DVC 如何帮助您“解决”该场景!

选择一条路径,进入它的第一章:

  • 数据管道 - 将 DVC 用作可复现的、以数据驱动的管道的构建系统。

  • 实验管理 - 只需对代码进行简单插桩,即可轻松跟踪您的实验及其进展,并像软件工程师管理代码一样协作开展机器学习实验。

  • 模型注册表 - 使用 DVC 模型注册表以可审计的方式管理模型的生命周期。轻松访问您的模型,并将模型注册表操作集成到 CI/CD 管道中,遵循 GitOps 最佳实践。

内容

🐛 发现问题?告诉我们!或者修复它:

在 GitHub 上编辑

有疑问?加入我们的聊天,我们会为您提供帮助:

Discord 聊天