Skip to main content

ClearML 数据

视频教程


你好,欢迎来到ClearML。在本视频中,我们将介绍我们称为clearml-data的数据版本控制工具的命令行和Python接口。

在机器学习的世界中,你很可能会处理大量需要放入数据集的数据。ClearML Data 解决了在这种情况下出现的两个重要挑战:

一个是可访问性,确保数据可以从你使用的每台机器上访问。另一个是版本控制,将哪个数据集版本用于哪个任务进行链接。这有助于使实验更具可重复性。此外,像git这样的版本控制系统从未真正为机器学习数据集中的文件大小和数量设计。我们需要其他东西。

ClearML 数据内置在 clearml Python 包中,并且提供了一个命令行界面以便进行简单快速的操作,如果您需要更多的灵活性,还提供了一个 Python 接口。这两个界面非常相似,因此我们将在视频中同时介绍它们。

让我们从一个例子开始。假设我这里有一些文件,我想把它们放入一个数据集中并开始跟踪。

首先,我们需要实际创建一个初始数据集版本。最简单的方法是使用命令行界面。使用命令clearml-data create,然后给它一个名称和一个项目,就像使用ClearML任务一样。它将返回数据集ID,我们将复制该ID以备后用。数据集现在已初始化,但仍然为空,因为我们还没有添加任何文件。

我们可以通过使用clearml-data add命令并提供我们想要添加的文件的路径来实现这一点。这将递归地将该路径中的所有文件添加到数据集中。

现在我们需要告诉服务器我们在这里完成了。我们可以调用clearml-data close来上传文件并将数据集状态更改为完成,这将最终确定此版本的数据集。

使用python接口执行此过程非常相似。

你可以通过从clearml pip包中导入Dataset对象并调用其create方法来创建一个新的数据集。现在我们需要像使用命令行工具一样为数据集命名并指定一个项目。create方法返回一个数据集实例,我们将使用它来执行所有操作。

要向这个新创建的数据集版本添加一些文件,请在数据集对象上调用add_files方法,并提供本地文件或文件夹的路径。请记住,目前还没有上传任何内容,我们只是在指示数据集对象在我们最终确实想要上传时应该做什么。

我们可以使用python接口做的一件非常有用的的事情是添加一些关于数据集本身的有趣统计信息,例如一个图表。这里我们简单地报告了训练和测试文件夹中文件数量的直方图。你可以向数据集中添加任何你可以添加到ClearML任务中的内容,所以尽情发挥吧!

最后,上传数据集并完成它,或者只需将auto_upload设置为true,使其成为一行代码。

在网络用户界面中,我们现在可以通过点击左侧的数据集按钮来查看数据集版本的详细信息。当我们点击这里新创建的数据集时,我们会得到最新版本的概览,当然目前我们只有一个版本。

一眼望去,您可以看到数据集ID、其大小以及在此特定版本中已更改的文件。如果您点击详细信息,您将在内容选项卡中看到这些文件的列表。让我们用这个按钮将视图放大一点,这样更容易查看。当我们切换到预览选项卡时,我们可以看到之前制作的直方图以及我们数据集版本中一些文件的自动生成预览。请随意在此处添加您想要的任何内容!最后,您可以查看原始控制台日志,这些日志对于调试非常有用。

现在想象我们在另一台机器上。可能是团队成员的、同学的,或者只是你的远程代理之一,你想要获取数据集来做一些很酷的事情。

使用命令行工具,您可以通过使用clearml-data get命令并提供其唯一ID来本地下载数据集版本。您可以在此处的UI中找到数据集的ID,或者,您可以通过提供数据集名称、其项目、附加到数据集的一些标签或这三者的任意组合来搜索特定数据集。运行该命令将为您提供数据下载的系统路径。

该路径将是一个本地缓存文件夹,这意味着如果您尝试再次获取相同的数据集,或任何基于此数据集的其他数据集,它将检查系统中已经存在的文件,并且不会再次下载这些文件。

Python接口类似,但有一个主要区别。你也可以使用名称、项目、ID或标签的任何组合来获取数据集,但获取数据集并不意味着它被下载了,我们只是获取了所有的元数据,现在我们可以从数据集对象中访问这些元数据。这很重要,因为这意味着你不需要下载数据集就可以对其进行更改或添加文件。稍后我们会详细讨论这一点。

如果您确实想下载数据集的本地副本,必须通过调用get_local_copy来明确完成,该函数将返回数据下载到的路径。

当您只想下载并使用数据时,这是一个很好的方法。但它一个只读副本,所以如果我们想添加或删除一些数据以创建新版本,我们必须获取一个可变的副本,我们可以通过使用get_local_mutable_copy来实现。我们可以给它一个本地路径,它会将数据集下载到该路径中,但这次,我们对内容有完全的控制权。

我们也可以通过命令行工具做到这一点,只需在命令中添加一个--copy标志

现在我们有了这个可变的副本,让我们尝试更改我们的数据集并创建一个新版本。

假设我们在这里发现了一个关于汉堡的问题,所以我们从文件夹中删除了它们。然后我们添加了新的巧克力蛋糕图片。本质上,我们现在已经删除了3个文件并添加了4个新文件。

现在我们可以告诉ClearML,我们对此文件夹所做的更改应成为之前数据集的新版本。我们首先像之前看到的那样创建一个新的数据集,但现在,我们将之前的数据集ID添加为父级。这告诉ClearML,我们正在创建的这个新数据集版本是基于之前的版本,因此我们这里的数据集对象将已经包含父级所包含的所有文件。

现在我们可以手动删除和添加我们想要的文件,甚至不需要实际下载数据集。它只会更改python对象中的元数据,并在最终确定时同步所有内容。

也就是说,在这种情况下,我们确实有数据集的本地副本,所以我们有更好的选择。

使用python SDK,我们可以调用sync_folder方法。该方法基本上会将数据集对象的元数据与您提供的local_path的内容进行比较。因此,当我们现在调用finalize并上传时,它只会上传或删除已更改的文件。

命令行界面没有用于元数据的python对象,因此它只能使用同步命令处理本地数据。但它将整个过程整合到一个命令中。调用clearml-data sync,为其提供新版本的数据集名称和项目,如果适用的话,还可以添加一些父数据集。这个单一调用将创建一个新的数据集版本,同步它,然后一次性上传所有更改。很简洁,对吧?

现在我们可以再次查看数据集用户界面。我们将看到我们的原始数据集以及我们刚刚基于它创建的新版本。

当我们在线性视图中点击最新版本时,我们可以看到我们确实添加了4个文件并删除了3个。

如果我们现在再次点击详细信息查看内容,我们可以看到我们的巧克力蛋糕已经正确添加。你还会注意到,当我们转到预览标签时,我们只看到巧克力蛋糕。这是因为数据集版本只存储了它与其父版本之间的差异。所以在这种情况下,只添加了巧克力蛋糕。

在本视频中,我们已经介绍了ClearML Data的最重要用途,希望你现在对其可能性和价值有了很好的直觉。从代码构建和更新你的数据集版本是保持一切更新并确保数据不会丢失的最佳方式。我们强烈建议你探索尽可能自动化这一过程的方法,查看我们的文档以了解所有可能性。

那么你还在等什么呢?开始使用clearml-data跟踪你的数据集,如果你需要任何帮助,别忘了加入我们的Slack频道