开始使用 DVC
能够像跟踪代码一样跟踪大型数据集和机器学习模型,同时避开将其存储在 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 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 push
来上传数据:
$ dvc push
dvc push
将本地缓存的数据复制到我们之前设置的远程存储中。远程存储目录应该如下所示:
.../dvcstore/files/md5
└── 22
└── a1a2931c8370d3aeedd7183606fd7f
通常,我们还希望使用 Git 跟踪导致数据更改的任何代码更改(git add
、git commit
和 git push
)。
检索数据
一旦 DVC 跟踪的数据和模型存储在远程,就可以在需要时使用 dvc pull
下载(例如在该项目的其他副本中)。通常,我们在 git pull
或 git clone
之后运行它。
现在让我们尝试一下:
$ 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 如何帮助您“解决”该场景!
选择一条路径,进入它的第一章: