Skip to main content

从任务构建管道

视频教程


你好,欢迎来到ClearML。在本视频中,我们将看看如何从任务创建管道,而不是像我们在上一个视频中看到的那样从代码创建。

任务本身已经通过使用实验管理器存在于系统中。这里需要注意的是,超参数、标量和工件应该正确报告,因为管道会将它们视为每个步骤的输入和输出。这样,一个步骤可以轻松访问例如前一个步骤的工件。

因此,这次以任务为我们的步骤,我们实际上只需要添加我们的控制逻辑。由于我们没有像上一个视频中那样的主函数,我们将把我们的控制逻辑代码放在一个专门的PipelineController脚本中。让我们从一个小的例子开始。

我们的示例管道将由三个不同的任务组成。第一个任务下载一些数据,然后将其作为工件上传到ClearML。

在未来的视频中,我将向您介绍ClearML Data,这实际上是我们处理数据的首选方式,而不是将其作为工件上传。所以如果您想了解更多,请继续观看这个入门播放列表。

下一个任务将预处理这些数据。这里有一些超参数配置预处理的方式。如你所见,数据集url参数仍然是空的。当管道运行时,这些超参数可以被前一步的输出覆盖。我们稍后会在视频中看到这是如何完成的。预处理后,我们将再次将生成的训练和测试数据作为工件上传。

最终任务将通过从上一步下载训练和测试工件来在预处理数据上训练模型。再次强调,当管道运行时,实际参数(在这种情况下是预处理任务ID)将被实际ID覆盖。你可以在这里看到我的实验列表中,我已经记录了这3个任务。

现在轮到我们的控制逻辑了。让我们从一个简单的Python脚本开始。我们可以创建一个PipelineController对象,并给它一个名称和一个项目,它将以该名称在实验列表中可见,因为就像ClearML中的任何东西一样,控制器只是一个任务,尽管在这种情况下是一个特殊类型的任务。

接下来,我们可以添加一些管道级别的参数。这些参数可以在管道的每一步中轻松访问。它们基本上是全局变量。在这种情况下,我们将添加一个参数,该参数将告诉第一步从哪里获取原始数据。这非常有用,因为我们稍后会看到,我们可以轻松地使用不同的URL重新运行我们的管道。

现在我们可以定义我们的步骤。每个步骤都需要一个名称和一些与原始任务的链接。我们可以提供原始任务的ID,或者提供任务名称和项目,在这种情况下,控制器将使用该项目中具有该名称的最新任务。

在下一步中,我们做同样的事情,只是现在,我们希望控制器知道我们只希望在前一步完成后才运行这一步。我们可以通过将前一步的名称作为列表提供给parents参数来轻松实现这一点。

您的管道结构将通过查看这个parents参数来推导,因此您可以通过将前面的步骤定义为管道中每个后续步骤的父步骤来构建您的流程。

现在我们为最后一步做同样的事情。然而,还记得我们之前看到的空超参数吗?我们仍然需要覆盖这些。我们可以使用parameter_override参数来实现这一点。

例如,我们可以告诉第一步使用全局管道参数原始数据URL。但我们也可以通过使用其名称引用前一步骤的输出工件,当然我们也可以直接用正常值覆盖参数。最后,我们甚至可以传递前一步骤的唯一任务ID,这样您就可以根据该ID获取任务对象,并访问该任务中的任何内容。

就这样!我们现在有了我们的第一个管道!

就像在前一个视频中一样,我们可以先在本地运行整个管道,以调试我们的流程并确保一切正常。如果一切按计划进行,我们就可以正常启动它,所有内容都将被排队。监听服务队列的代理将拾取管道控制器,克隆构成步骤的任务,覆盖必要的参数并将它们排入default队列,以便其他代理开始工作。

运行脚本后,您可以转到流水线屏幕,并看到与上一个视频中相同的输出:流水线运行的列表,当我们点击它时,我们会得到一个漂亮的流水线可视化表示。

现在我们可以做所有与通过代码构建的管道相同的事情。我们可以查看管道本身的整体详细信息以及管道控制器的日志。

当我们选择一个特定的步骤时,我们可以在这里看到它的输入和输出以及它的日志,甚至原始代码。

最后,我们还可以通过点击+ 新建运行按钮来克隆整个管道并更改其参数。这是所有功能中最强大的一个,因为它允许我们从用户界面快速重新运行整个管道,并使用不同的参数。代理将处理其余的工作!

在本入门系列的下一段视频中,我们将真正地了解ClearML数据。在此期间,您可以在app.clear.ml免费启动一些管道控制器,并且如果需要任何帮助,别忘了加入我们的Slack频道