Kedro vs ZenML vs Metaflow:你应该选择哪种管道协调工具?

1,057 阅读22分钟

在这篇文章中,我将对Kedro、Metaflow和ZenML进行比较,但在此之前,我认为值得退后几步。为什么还要使用这三种ML协调工具呢?启动一个机器学习项目并不难。你安装一些python库,启动模型,训练它,然后就可以了。它已经准备好了。也有很多人告诉你,这就是数据科学,在你本地运行的Jupyter笔记本中输入model.fit 就能保证你获得梦想中的工作,解决宇宙中的所有问题。但这只是事实的一小部分。

我想说的是,用Jupyter笔记本做实验和报告并没有错。问题是,他们不能提供一个可以用于大多数行业ML项目的软件开发框架。

实施机器学习项目(以及创建基于ML的产品)与其他软件开发一样复杂。例如,在现实世界的ML项目中,你必须能够。

  • 摄取多种格式的数据
  • 对数据进行预处理,清理数据集,等等。
  • 进行特征工程
  • 训练你的模型
  • 测试它们
  • 部署你的模型
  • 实施CI/CD
  • 使用git跟踪你的代码
  • 追踪你的模型的度量

还有很多其他的东西,使用笔记本是不可能做到的(如果有人这么说,他们可能在误导你)。因此,你的代码必须是可维护的,可扩展的,可追踪的,并且在一个超过一人的团队中工作是可行的。

这就是为什么数据科学家必须学习机器学习协调工具,这篇文章的目的是深入了解一些最常用的MLOps协调工具- Kedro、MetaFlow和ZenML。我们将对它们进行考察。

  • 主要目的
  • 代码结构
  • 主要功能
  • 以及优点和缺点

我们还将展示。

  • 如何容易(以及如何)开始使用它们中的每一个
  • 并展示他们的实际能力

好吧......但为什么特别是这三个--Kedro、Metaflow和ZenML?

有很多框架都是为了解决之前提出的问题而实施的。我们选择Kedro、Metaflow和ZenML是因为它们是一些最常用的协调机器学习管道的工具。

  • 它们有免费使用的许可证:你不会为构建你的ML项目支付高额的费用。
  • 它们很普遍:有很多人在使用它们,在需要时很容易找到人帮助你。
  • 他们在网上有很多学习材料。这样,你(和下面加入你的团队的人)可以跳入并开始你的第一个项目或维护现有的项目
  • 它们与行业中最常用的工具有许多集成:你将能够把它们集成到现有的云框架中,甚至扩展它来做更多的事情。

因此,这些是让你的机器学习走出你的Jupyter笔记本的最简单的方法,让它面对现实世界,为真正的人解决真正的问题。

明白了。现在,我应该选择哪一个--Kedro、Metaflow,还是ZenML?

在选择协调工具时,有很多因素需要考虑。它将成为你的机器学习项目的基础。这个选择会影响到,比如说。

  • 设置一个项目所需的时间
  • 改变项目的特定部分(如数据源、代码片段等)所需的时间
  • 培训新员工了解运行项目所需的时间
  • 项目的成本,包括(但不限于)云、处理能力和人力的成本

这就是为什么注意你使用的协调工具是如此重要。而这正是我们要帮助你找出的原因。

TL;DR

如果你没有时间阅读全部内容,你可以直接跳到这里进行快速总结

现在,让我们深入了解一下!

原始文件

定义

首先,让我们看一下每个文档是如何定义其工具的。

KedroKedro

"Kedro 是一个开源的Python框架,用于创建可重复、可维护和模块化的数据科学代码。它借用了软件工程的概念,并将其应用于机器学习代码;应用的概念包括模块化、关注点分离和版本管理。Kedro由LF人工智能和数据基金会主办"。

它可以在这个链接中找到。

ZenMLZenML

"ZenML 是一个可扩展的、开源的MLOps框架,用于创建生产就绪的机器学习管道。它为数据科学家而建,有一个简单、灵活的语法,与云和工具无关,并有迎合ML工作流程的接口/抽象。"

可以在这个链接中找到。

"Metaflow 是一个对人类友好的Python库,帮助科学家和工程师建立和管理现实生活中的数据科学项目。Metaflow最初是在Netflix开发的,以提高数据科学家的生产力,他们从事的项目种类繁多,从经典的统计学到最先进的深度学习。"

可以在这个链接上找到。

到此为止,一切看起来都非常相似。但是这些工具之间有什么不同呢?是的,有一些重要的区别需要注意。

谁建造的?

这三个都是开源的免费使用的框架,但都是由公司开发的。

  • 1Kedro是由麦肯锡公司的QuantumBlack创建的,最近被捐赠给了Linux基金会
  • 2ZenML,则是由一家位于德国慕尼黑的小公司开发的。
  • 3Metaflow是在Netflix内部开发的。

它们有很好的文档吗?

这3个工具都有文档,以提供可作为其实施基础的信息。代码文档对于软件开发尤其重要,因为它是由实际创建软件的人编写的指南,所以没有其他更好的媒介来解释如何使用它。

在维护一个正在运行的项目时,它变得更加重要,因为总是有一些需要检查框架的某个部分的一些特殊性和代码样本,例如理解语法或首字母缩写词。

Kedro

Kedro有大量的文档,其中包含了教程和示例项目。该软件的每一部分都有自己的部分,包括代码片段和样本,从最简单的功能到高级的功能。你可以安装一个模板项目,并使用样本数据集开始你的第一个项目,并在你的终端上用几行字训练你的第一个模型。

ZenML

ZenML的文档也非常完整。所有的东西都写得很好,而且还有一些有用的图片,帮助我们理解那里发生的事情。也有一些复制粘贴的教程,可以让我们在实践中看到ZenML的工作。不过,在我看来,它缺少代码片段来演示如何应用一些概念。

Metaflow

Metaflow的文档是三者中最短的。有一个模板项目,但文档的覆盖面有点太短。所以,它可能是最难掌握实际情况的。Metaflow是三者中唯一可以在R中运行的,所以如果这是你喜欢的编码语言,也许你对工具的选择已经有了。

文档。Kedro = ZenML > Metaflow

主要特点

现在是时候了解这些工具如何以更实际的方式执行。我们将看到如何学习它们,以及它们如何在现实世界的项目中使用。

学习如何使用

每一个软件工具的有用性都取决于它的使用是否方便。让我们来看看每个工具的一些可用材料。

Kedro

Kedro有一个很大的社区,它也提供了很多关于你如何用它创建项目的信息。除了官方文档(附带一个模板项目),在YouTube上有一个完整的kedro课程,由DataEngineerOne频道主持,免费提供。它从非常初级的水平(如安装kedro)到大部分的高级功能。此外,还有4篇中级的帖子(由我撰写),展示了如何使用kedro、MLflow和fastAPI部署模型(第一部分第二部分第三部分和第四部分)。

ZenML

YouTube上有很多ZenML项目的视频,很多都是由他们的官方资料持有,你可以在这里找到。也有一些实现的教程项目,可以从命令界面本身下载,然后抓取指南来实现你自己的项目,方法在这里

基本上,你可以运行`zenml example list`并从可用的例子中挑选一个,通过输入`zenml example pull quickstart`下载到你的当前目录。

Metaflow

Metaflow是迄今为止可用材料最少的一个。文档很短,几乎没有代码样本。Youtube上有一些视频展示了一些实现,比如这个,但似乎没有完整的课程。在材料方面也有分歧,因为Metaflow是这里唯一可以在R和Python中运行的,所以在这两种语言中都有学习材料说明实现。

学习如何使用。Kedro > ZenML > Metaflow

代码结构

Kedro:节点和管道

Kedro有一个由节点和管道定义的代码结构。每个节点都是一个Python函数。管道是节点的协调,指定所有的输入、输出和管道的参数。它基本上描述了哪些数据进入每个节点,哪些是输出,以及哪些是下一个步骤。

Kedro: nodes and pipelinesKedro: nodes and pipelines

**Kedro节点(正方形)、数据集(圆边矩形)和管道(它们之间的相互连接)|来源

不需要指定哪个节点在下一个节点之前。Kedro自动协调你的整个管道的执行顺序(如果执行中没有冲突,这样的数据源既是输入也是来自同一个节点的输出)。这样,如果你的数据结构保持不变,你的数据源可以变化,而不需要改变主代码。此外,它允许你看到管道的每一步正在发生什么,因为中间数据正在被存储。

所有的代码都将位于 "src "文件夹内,所有的函数都是在节点和管道的python文件内创建的。可以(并且强烈建议)将你的代码分成子文件夹(如预处理、特征工程、模型训练等)以保持其条理性,这样就有可能单独运行管道的每一步。整个代码架构,包括代码开发生命周期,都可以在这里看到。

Kedro还提供了一个环境接口。Kedro环境是为了分离管道内使用的代码源,这种方式你可以把开发和生产分开,甚至在你的项目中创建其他分区。你可以在这里阅读更多关于它的信息。它自动创建本地和基础环境,但你可以根据你的需要创建更多。

当涉及到为特定的节点(或所有的节点)添加额外的功能时,kedro使用一个Hooks结构。例如,你可以配置一个特定的行为,如记录数据集加载时的时间。钩子的结构可以在这里找到。Kedro也有一个秘密管理结构,使用一个凭证yaml文件,你可以在这里阅读更多关于它的信息。

ZenML:步骤和管道

ZenML是建立在步骤之上的。它为它定义了一个装饰器(@step),然后管道的每一步都被写成一个Python函数。它包含了摄取数据、数据清洗、模型训练,甚至是指标评估的代码。这些步骤可以使用管道来组织,它将把所有的步骤全部建立起来,以便让你的管道一次性运行。使用ZenML的步骤、输入和输出的内置类的主要优点是所有的集成都变得更容易。

另一方面,流水线是指定步骤执行顺序的python函数,以及它们相应的输入和输出。所有的代码都建立在run.py文件中,该文件将包含步骤和管道本身。

ZenML项目的基础设施还定义了一个Stack,它定义了你的管道将如何运行。它通常包括。

  • 一个协调器:协调管道执行的框架(如Airflow和Kubeflow)。
  • 工件存储:数据的实际存储,主要用于中间管道步骤的数据(因为摄取通常是自己的一个步骤)。
  • 元数据存储:用于跟踪有关管道运行本身的数据的存储。

由于它的结构,改变堆栈的组件比较容易,如数据存储、云基础设施或协调。这里也有对每个堆栈组件的解释。例如,你可以使用一个本地开发堆栈(在你的机器上运行)和一个生产堆栈,在云服务器上运行。

An example of ZenML pipeline with two stacks, local and cloudAn example of ZenML pipeline with two stacks, local and cloud

一个有两个堆栈的ZenML管道的例子,本地和云端

堆栈对于那些需要冗余的项目来说特别有用。如果你的主系统出现故障(例如依赖于一个特定的云供应商),你可以切换到一个不同的基础设施,几乎没有互动,甚至可以自动切换。它还可以包括一个工件注册表,甚至可以管理项目的秘密。

与Kedro不同,ZenML允许你定制你的整个管道创建,因此有一些最佳实践,我们强烈建议遵循。你可以在这里找到该指南。

Metaflow:有UI(也有步骤)的那个

Metaflow与Airflow非常相似,因为它是基于DAG(有向无环图)的,所以Airflow用户可以更容易理解它。

就像ZenML一样,Metaflow也使用步骤来装饰函数,所以对于有ZenML经验的用户来说,它可以说是非常相似。然而,它使用了一种结构,在步骤本身中指定流程,这可能看起来有点混乱。另外,为了创建一个流程,你应该首先创建一个类(例如MyFlow),这个类将包含其步骤。

Creating a classCreating a class

创建一个类|来源

大多数的功能都是用装饰器建立的。例如,你可以使用资源装饰器来指定计算资源(如内存、CPU和GPU的使用),每一步应该使用的Python环境,重试的次数,负责的用户等等。

使用Metaflow的主要优点是它有一个内置的用户界面,用于跟踪项目中每次运行的指标。这里可以找到一个UI的样本。

Metaflow UI samplesMetaflow UI samples

Metaflow UI samplesMetaflow UI samples

Metaflow用户界面样本 | 来源

Metaflow会自动跟踪一些指标,如运行实验的用户、所花的时间、实验的步骤和运行状态。

代码结构。Kedro > ZenML > Metaflow

摄取数据

Kedro:数据目录和参数文件

Kedro有一个很好的方法来抽象出代码中的数据源:数据目录文件。这些是YAML文件,其中描述了所有的来源(输入和输出数据),以及关于其保存路径、格式和其他参数的信息。这样,它们被作为参数传递给管道,这使得更新变得更加容易。数据可以以多种格式、多种路径和许多不同的参数来存储。

cars:
  type: pandas.CSVDataSet
  filepath: data/01_raw/company/cars.csv
  load_args:
    sep: ','
  save_args:
    index: False
    date_format: '%Y-%m-%d %H:%M'
    decimal: .

把你项目的数据集作为参数传递的主要优点是,如果你必须改变一个数据源(它的路径、来源或文件),你将不需要更新所有的代码来匹配它。目录是一个默认的kedro类,并且有几个集成可供使用。在最坏的情况下,数据清理节点需要更新,你的管道的中间步骤不会改变。

当我说它可以有任何格式时,我的意思是,它可以是一段SQL代码(来自多个来源和云),一个CSV表,一个parquet表,一个Spark数据集,MS Excel表,JPEG图片,等等。它可以位于云(AWS、GCP和Azure)、Hadoop文件系统,甚至是一个HTML网站。目录也被用来保存模型和指标文件,使其更容易实现和管理所有来源。

Kedro还将YAML文件作为params文件的另一种使用。它可能包含你的模型或管道需要的所有参数。这样就可以很容易地跟踪并在需要时改变它们。

ZenML

如前所述,ZenML是基于步骤的。因此,举例来说,数据摄取只是你可以在一个步骤中写成一个python脚本。

ZenML的大部分功能来自于它的集成。它提供了大量的工具来整合来自多个来源的数据摄取,以及特征存储、工件存储等等。我们将在下一节中进一步讨论ZenML的集成。

因为ZenML是高度可定制的,你可以创建你自己的代码结构,包括参数和配置文件,以使你的项目看起来更有条理(和更少的硬编码)和更容易维护。

Metaflow

它与ZenML摄取相当相似,不过,Metaflow只支持AWS的集成,这在与不同的云供应商合作时可能是个障碍。所以,基本上,为了整合数据源和其他功能,你可能需要用Python(或R)做一些硬编码。

摄取数据。Kedro > ZenML > Metaflow

集成

Kedro:插件

kedro的大部分能力来自于它的插件。它可以通过原生运行第三方工具来扩展kedro的能力,而且它们都可以一起工作,充分发挥其潜力。而当kedro将它们作为插件添加时,它们实际上是作为一个独立的组件集成到kedro结构中来完成它们的工作。有很多这样的例子,例如。

  • Kedro-neptune 一个连接kedro和Neptune.ai的插件,它允许实验跟踪和元数据管理。

Kedro experiment tracking using kedro-neptuneKedro experiment tracking using kedro-neptune

使用kedro-neptune的Kedro实验跟踪 |来源

  • Kedro-mlflow :允许实现MLflo的模型跟踪和模型服务。
  • Kedro-viz:一个神奇的工具,可以将你的整个ML管道可视化。

Kedro pipeline visualization using kedro-vizKedro pipeline visualization using kedro-viz

使用kedro-viz对Kedro管道进行可视化

  • Kedro-docker是一个工具,可以使用docker更容易地创建、部署和运行kedro ML应用程序。

这些插件的主要优势在于,所有的插件都可以通过PyPI轻松安装,并且与kedro结构兼容,所以很容易在现有项目中启动和运行。你可以在官方文档中找到对解决你的问题最有用的一个。

ZenML

ZenML支持大量的第三方集成。它们包含协调工具、分布式处理工具、云供应商、部署、功能存储、监控等等。ZenML作为胶水将整个管道固定在一起(正如他们自己所声称的)。这些工具在ZenML的Python文件中的调用方式与你在ZenML外的调用方式非常相似,例如,使用`zenml.integraions.sklearn`,来导入sklearn。

Original DocumentationOriginal Documentation

原始文档 | 来源

在ZenML中,有一个Python集成包,它包含了许多不同工具的所有接口。你可以在这里阅读更多关于已经集成的工具(以及他们目前正在开发的工具)。当涉及到安装一个集成时,它离你只有四个字的命令界面,比如`zenml集成安装sklearn`。

Metaflow

众所周知,Netflix与AWS有着紧密的关系。因此,Metaflow与大多数AWS服务都很好地整合在一起,使用S3存储,AWS Batch和Kubernetes进行计算,AWS Fargate和RDS进行元数据存储,AWS Sagemaker Notebooks和AWS Step Functions,Eventbridge和Argo Workflows进行调度。你可以在这里阅读更多信息。

集成。Kedro = ZenML > Metaflow

真实世界的应用

我们一直在谈论的所有工具都可以用来将模型部署到生产中,并协调其训练和评估。然而,他们的一些功能可能更适合于某些用例。

Kedro

由于Kedro有一个高度组织化的代码结构,并且抽象了数据和模型的来源和路径,对于那些应该由大型团队构建的项目来说,它是一个很好的选择,并且需要长期维护,所以基于插件和钩子的新功能可以被添加到项目中,而无需改变整个管道结构。另外,由于它可以和PySpark无缝对接,所以在大数据或任何云平台上进行部署都没有问题。

ZenML

与Kedro相比,ZenML有一个更可定制的代码结构,它可能很适合于一个原型项目。ZenML的主要优势之一是,它可以在不改变代码的情况下与不同的堆栈合作。因此,如果项目需要改变云供应商,例如,由于不可用,它可以在几秒钟内完成,不需要太多的设置。这提供了稳健性和可扩展性。

Metaflow

Metaflow是三者中唯一一个可以和R一起工作的。因此,如果有一些模型还没有在Python中出现,Metaflow可能会使它有可能使用R部署到生产中。另外,Metaflow的另一个优势是它可以自动跟踪每一个运行指标。那么它可能很适合用于项目的原型设计和测试不同的方法。另外,由于它与AWS的兼容性,如果你对AWS有一定的依赖性,它应该是你的选择。

优点和限制

Kedro

优点
  • Kedro的结构对于维持复杂项目的秩序特别有用,这在其他工具中是很困难的。
  • 它的插件可以提供广泛的操作,提供kedro原生不做的东西。
  • 强大的社区:社区开发很频繁,所以总是有错误的修复和新插件的发布。
  • 节点和管道架构避免了代码的重复,因为它允许功能重用,从而使编码干净。
  • 可以使用不同的环境,如开发和生产环境,以分离数据和模型来源。
局限性
  • 因为它的结构很好,如果你的项目太简单,kedro可能是一个过度的工具。

ZenML

优点
  • ZenML相当简单,容易实现。你可以很快开始你的第一个项目,并随着时间的推移发展成一个复杂的项目。
  • 它有很多与第三方工具的集成,这使你可以实现广泛的项目。
  • 堆栈结构允许你以许多不同的方式实现你的代码,并使之有可能保持开发和生产的分离。
限制因素
  • 由于代码很简单,随着项目的发展,要保持所有的东西都有条理是很困难的。在有多个步骤和复杂的数据流的项目中,需要有纪律来保持东西。因此,阅读和使用建议的最佳实践真的很重要。
  • 它是由一家公司持有的,因此围绕着错误修复或新功能创建的可能性,社区互动较少。

Metaflow

优点
  • Metaflow自动跟踪指标和管道运行信息,这在生产中运行时非常有用。
  • 在R中可用:如果不是唯一一个可以在R中运行的框架,也是唯一的一个。
  • 它有一个内置的用户界面来显示所有跟踪的指标。
  • 基于DAGs:这可以使Metaflow对熟悉图编程的人特别有用,比如airflow。
限制因素
  • 缺少文档和额外的在线学习材料。
  • 由于使用了许多装饰器,代码很容易变得混乱。
  • 与ZenML类似,随着项目的发展,要保持所有东西的条理性是很困难的。
  • 对于初学者来说,它可能有点难学。

结论

在看了所有这些方法论之后,很明显,每个工具之间都有很强的差异。每个人都有自己的优势和局限性,它可以更好或更坏地适应每个项目的需求。简而言之:

  • Kedro有一些有趣的功能,在处理复杂的项目时,它特别好。它对数据源和模型进行了抽象,并能与许多其他工具很好地整合。它可以被设置成适合大多数机器学习的现代项目,包括所有当前的行业最佳实践。在我看来,他们处理数据源和模型源的方式,将它们抽象化,实在是令人惊讶。

  • ZenML也是一个强有力的竞争者,与Kedro相比,它有一些优势。它的可定制性更强,可以与多个堆栈一起工作,而不需要修改任何代码,而且它还能与许多其他工具很好地集成。然而,它缺乏一些功能,主要是在处理数据和模型源时。

  • Metaflow是迄今为止我们将在这里看到的结构化程度最低的方法论。它主要集中在协调步骤和跟踪步骤的执行指标。因此,你的项目需要的每一个其他功能可能都需要通过使用其他Python功能手工编码来实现。这也许不是不可能的,但它肯定有一些缺点。然而,在生产环境中,自动指标跟踪和用户界面是非常酷的。

最后,我希望你现在有更多的信息来选择这些工具中哪一个更适合你的使用情况,只是,请记住,每个工具的能力之间总是有一个权衡。感谢你把这篇博客读到最后,下次再见吧