从任务构建流水线
视频教程
大家好,欢迎来到 ClearML。在本视频中,我们将了解如何从任务而不是像上个视频中那样从代码创建流水线。
这些任务本身已经通过实验管理器在系统中。需要注意的是,超参数、标量和工件应该正确报告,因为流水线将把它们视为每个步骤的输入和输出。通过这种方式,一个步骤可以轻松访问例如前一个步骤的工件。
因此,这次我们将任务作为步骤,我们只需要添加我们的控制逻辑。而且由于我们没有像上个视频中的 main
函数,我们将把我们的控制逻辑代码放在一个专门的 PipelineController
脚本中。让我们从一个小的例子开始。
我们的示例流水线将由三个不同的任务组成。第一个任务下载一些数据,然后将其作为工件上传到 ClearML。
在未来的视频中,我将向您介绍 ClearML Data,这实际上是我们处理数据的首选方式,而不是将其作为工件上传。如果您想了解更多,请继续观看本入门系列播放列表。
下一个任务将预处理该数据。它有一些超参数,用于配置预处理的方式。正如您所见,数据集 url
参数仍然为空。当流水线运行时,这些超参数可以被前一个步骤的输出覆盖。我们将在视频稍后看到如何做到这一点。预处理后,我们将再次把生成的训练和测试数据作为工件上传。
最终任务将通过从前一个步骤下载训练和测试工件来在预处理后的数据上训练模型。同样,实际参数(在本例中是预处理任务 ID)在流水线运行时将被真实 ID 覆盖。您可以在我的实验列表中看到,我已经记录了这 3 个任务。
现在是我们的控制逻辑部分。让我们从创建一个简单的 Python 脚本开始。我们可以创建一个 PipelineController
对象并为其命名和指定项目,它将在实验列表中以该名称显示,因为就像 ClearML 中的任何事物一样,控制器也只是一个任务,尽管在这种情况下是一个特殊类型的任务。
接下来,我们可以添加一些流水线级别的参数。这些参数可以在流水线的每个步骤中轻松访问。它们基本上是全局变量。在这种情况下,我们将添加一个参数,该参数将告诉第一个步骤从哪里获取原始数据。这非常有用,因为稍后我们会看到我们可以轻松地使用不同的 URL 重新运行我们的流水线。
现在我们可以定义我们的步骤。每个步骤都需要一个名称以及与原始任务的链接。我们可以为其提供原始任务的 ID,或者提供任务名称和项目,在这种情况下,控制器将使用该项目中同名任务中最新的那个。
对于下一个步骤,我们也做同样的事情,只是现在,我们希望控制器知道我们只在前一个步骤完成后才运行此步骤。我们可以轻松地通过将前一个步骤的名称作为列表提供给 parents
参数来做到这一点。
您的流水线结构将通过查看此 parents
参数来派生,因此您可以通过将前一个步骤定义为流水线中每个后续步骤的父步骤来构建流程。
现在我们对最后一步做同样的事情。但是,还记得我们之前看到的空超参数吗?我们仍然需要覆盖它们。我们可以使用 parameter_override
参数来做到这一点。
例如,我们可以告诉第一个步骤使用全局流水线参数 raw data url,就像这样。但我们也可以通过使用名称引用前一个步骤的输出工件,当然也可以简单地用一个普通值覆盖参数。最后,我们甚至可以传递前一个步骤的唯一任务 ID,这样您就可以根据该 ID 获取任务对象并访问该任务中的任何和所有内容。
就是这样!我们现在有了我们的第一个流水线!
就像在上个视频中一样,我们可以先在本地运行整个流水线,以调试流程并确保一切正常。如果一切按计划进行,那么我们可以正常启动它,一切都将排队。监听服务队列的 Agent 会拾取流水线控制器,克隆构成步骤的任务,覆盖必要的参数,并将它们加入 default
队列,供您的其他 Agent 开始工作。
运行脚本后,您可以转到流水线屏幕,看到与我们在上个视频中看到的相同的输出:一个流水线运行列表,当我们点击它时,我们会得到一个漂亮的流水线可视化表示。
现在我们可以做与从代码构建的流水线相同的全部事情。我们可以查看流水线本身的总体详情以及流水线控制器的日志。
当我们选择特定步骤时,我们可以在下方看到其输入和输出以及日志,甚至还可以看到原始代码。
最后,我们还可以通过点击 + 新建运行 按钮克隆整个流水线并更改其参数。这是所有功能中最强大的一个,因为它允许我们从 UI 快速地使用不同的参数重新运行整个流水线。Agent 会处理其余的事情!
在本入门系列教程的下一个视频中,我们将真正了解 ClearML Data。与此同时,您可以免费在 app.clear.ml 启动一些流水线控制器,如果需要任何帮助,别忘了加入我们的 Slack 频道。