任务编排工具和工作流程
最近,出现了用于编排任务和数据工作流的新工具(有时称为" MLOps")。 这些工具的数量众多,因此很难选择要使用的工具,也难以理解它们的重叠方式,因此我们决定对一些最受欢迎的工具进行比较。
> Airflow is the most popular solution, followed by Luigi. There are newer contenders too, and they'
总体而言,Apache Airflow既是最受欢迎的工具,也是功能最广泛的工具,但是Luigi是类似的工具,上手起来比较简单。 Argo是团队已经在使用Kubernetes时经常使用的一种,而Kubeflow和MLFlow满足了与部署机器学习模型和跟踪实验有关的更多利基要求。
在进行详细比较之前,了解一些与任务编排相关的更广泛的概念很有用。
什么是任务编排,为什么有用?
较小的团队通常从手动管理任务开始,例如清理数据,训练机器学习模型,跟踪结果以及将模型部署到生产服务器。 随着团队规模和解决方案的增长,重复步骤的数量也随之增加。 可靠地执行这些任务也变得更加重要。
这些任务相互依赖的复杂方式也在增加。 刚开始时,您可能需要每周或每月一次运行一系列任务。 这些任务需要按特定顺序运行。 随着您的成长,该管道变成具有动态分支的网络。 在某些情况下,某些任务会引发其他任务,而这些可能取决于首先运行的其他几个任务。
可以将该网络建模为DAG(有向无环图),该模型对每个任务及其之间的依赖关系进行建模。
> A pipeline is a limited DAG where each task has one upstream and one downstream dependency at most
工作流程编排工具允许您通过指定所有任务以及它们如何相互依赖来定义DAG。 然后,该工具按正确的顺序按计划执行这些任务,然后在运行下一个任务之前重试任何失败的任务。 它还会监视进度并在发生故障时通知您的团队。
CI / CD工具(例如Jenkins)通常用于自动测试和部署代码,这些工具与任务编排工具之间有很强的相似性-但也有重要的区别。 尽管从理论上讲,您可以使用这些CI / CD工具来编排动态的,相互链接的任务,但在一定程度的复杂性下,您会发现改用Apache Airflow等更通用的工具会更容易。
总体而言,任何业务流程工具的重点都是确保集中,可重复,可重现和高效的工作流程:虚拟命令中心,用于您的所有自动化任务。 考虑到这种情况,让我们看看一些最流行的工作流程工具是如何叠加的。
告诉我使用哪一个
您可能应该使用:
- Apache Airflow如果您需要功能最全,最成熟的工具,则可以花时间来学习它的工作原理,设置和维护。
- Luigi,如果您需要比Airflow更轻松的学习方法。 它具有较少的功能,但更容易上手。
- Argo,如果您已经对Kubernetes生态系统进行了深入投资,并希望将所有任务作为Pod进行管理,并在YAML(而不是Python)中定义它们。
- 如果您想使用Kubernetes,但仍使用Python而不是YAML定义任务,则使用KubeFlow。
- MLFlow,如果您更关心使用MLFlow的预定义模式来跟踪实验或跟踪和部署模型,而不是寻找能够适应现有自定义工作流程的工具。
比较表
> (Source: Author) – For more Machine Learning Tips — Get our weekly newsletter
为了快速浏览,我们比较了以下方面的库:
- 成熟度:基于项目的年龄以及修复和提交的次数;
- 受欢迎程度:基于采用率和GitHub星级;
- 简洁性:基于易于注册和采用;
- 广度:基于每个项目的专业性与适应性;
- 语言:基于您与工具互动的主要方式。
这些不是严格的基准或科学基准,但目的是让您快速了解这些工具的重叠方式以及它们之间的区别。 有关更多详细信息,请参见下面的正面对比。
Luigi 对比 Airflow
Luigi和Airflow解决了类似的问题,但是Luigi要简单得多。 它包含在一个组件中,而Airflow有多个模块,可以用不同的方式进行配置。 气流具有更大的社区和一些其他功能,但学习曲线却陡峭得多。 具体来说,Airflow在计划方面要强大得多,它提供了日历UI,可帮助您设置任务应在何时运行。 使用Luigi,您需要编写更多的自定义代码以按计划运行任务。
两种工具都使用Python和DAG定义任务和依赖项。 如果您的团队较小并且需要快速上手,请使用Luigi。 如果您的团队规模较大,可以使用Airflow,一旦您掌握了学习曲线,就可以从最初的生产力损失中获得更大的动力。
Luigi 对比 Argo
Argo建立在Kubernetes之上,并且每个任务都作为单独的Kubernetes容器运行。 如果您已经在大多数基础架构中使用Kubernetes,这可能会很方便,但如果您没有使用它,则会增加复杂性。 Luigi是一个Python库,可以与Python包管理工具(如pip和conda)一起安装。 Argo是Kubernetes扩展,使用Kubernetes安装。 虽然这两种工具都可以将任务定义为DAG,但使用Luigi时,您将使用Python编写这些定义,而使用Argo时,您将使用YAML。
如果您已经对Kubernetes进行了投资,并且知道所有任务都是吊舱,请使用Argo。 如果要编写DAG定义的开发人员对YAML比对Python更满意,则还应该考虑一下。 如果您不是在Kubernetes上运行并且在团队中拥有Python专业知识,请使用Luigi。
Luigi 对比 Kubeflow
Luigi是用于常规任务编排的基于Python的库,而Kubeflow是专门用于机器学习工作流的基于Kubernetes的工具。 Luigi是为协调一般任务而构建的,而Kubeflow具有用于实验跟踪,超参数优化和为Jupyter笔记本服务的预构建模式。 Kubeflow由两个不同的组件组成:Kubeflow和Kubeflow管道。 后者专注于模型部署和CI / CD,并且可以独立于主要Kubeflow功能使用。
如果您需要协调从数据清理到模型部署的各种不同任务,请使用Luigi。 如果您已经使用Kubernetes并希望安排常见的机器学习任务(例如实验跟踪和模型训练),请使用Kubeflow。
Luigi 对比 MLFlow
Luigi是一个通用的任务编排系统,而MLFlow是一个更专业的工具,可以帮助管理和跟踪您的机器学习生命周期和实验。 您可以使用Luigi定义常规任务和依赖项(例如训练和部署模型),但是可以将MLFlow直接导入到机器学习代码中,并使用其助手功能来记录信息(例如您正在使用的参数)并 工件(例如训练有素的模型)。 您还可以将MLFlow用作命令行工具,以服务使用通用工具(例如scikit-learn)构建的模型或将其部署到通用平台(例如AzureML或Amazon SageMaker)。
Airflow 对比 Argo
Argo和Airflow都允许您将任务定义为DAG,但是在Airflow中,您可以使用Python进行此操作,而在Argo中,您可以使用YAML。 Argo作为Kubernetes窗格运行每个任务,而Airflow则生活在Python生态系统中。 在选择Argo之前,Canva评估了这两个选项,您可以观看此演讲以获取详细的比较和评估。
如果您想要更成熟的工具并且不关心Kubernetes,请使用Airflow。 如果您已经对Kubernetes进行了投资,并且想要运行以不同堆栈编写的各种任务,请使用Argo。
Airflow 对比 Kubeflow
Airflow是一个通用的任务编排平台,而Kubeflow则特别专注于机器学习任务,例如实验跟踪。 两种工具都允许您使用Python定义任务,但是Kubeflow在Kubernetes上运行任务。 Kubeflow分为Kubeflow和Kubeflow管道:后一个组件允许您指定DAG,但它比常规任务更着重于部署和模型服务。
如果您需要一个成熟的,广泛的生态系统来执行各种不同的任务,请使用Airflow。 如果您已经使用Kubernetes,并希望使用更多现成的机器学习解决方案模式,请使用Kubeflow。
Airflow 对比 MLFlow
Airflow是一个通用的任务编排平台,而MLFlow是专门为优化机器学习生命周期而构建的。 这意味着MLFlow具有运行和跟踪实验以及训练和部署机器学习模型的功能,而Airflow具有广泛的用例,您可以使用它来运行任何任务集。 Airflow是一组用于管理和计划任务的组件和插件。 MLFlow是一个Python库,您可以将其导入到现有的机器学习代码中,还可以使用命令行工具来将scikit-learn编写的机器学习模型训练和部署到Amazon SageMaker或AzureML。
如果您想以一种开明的,开箱即用的方式来管理机器学习实验和部署,请使用MLFlow。 如果您有更复杂的要求并且想要更好地控制如何管理机器学习生命周期,请使用Airflow。
Argo 对比 Kubeflow
Kubeflow的某些部分(例如Kubeflow管道)建立在Argo之上,但是Argo的建立是为了编排任何任务,而Kubeflow则专注于特定于机器学习的任务,例如实验跟踪,超参数调整和模型部署。 Kubeflow管道是Kubeflow的一个独立组件,专注于模型部署和CI / CD,并且可以独立于Kubeflow的其他功能使用。 这两种工具都依赖Kubernetes,如果您已经采用了它,那么可能会让您更感兴趣。 使用Argo,您可以使用YAML定义任务,而Kubeflow允许您使用Python接口。
如果您需要管理作为Kubernetes Pod运行的常规任务的DAG,请使用Argo。 如果您想要更专注于机器学习解决方案的工具,请使用Kubeflow。
Argo 对比 MLFlow
Argo是一个任务编排工具,可让您将任务定义为Kubernetes Pod,并将其作为DAG运行(使用YAML定义)。 MLFlow是一种更加专业的工具,它不允许您定义任意任务或它们之间的依赖关系。 相反,您可以将MLFlow作为Python库导入到现有的(Python)机器学习代码库中,并使用其助手功能记录工件和参数,以帮助进行分析和实验跟踪。 您还可以使用MLFlow的命令行工具来训练scikit学习模型,并将其部署到Amazon Sagemaker或Azure ML,以及管理Jupyter笔记本。
如果您需要管理常规任务并想在Kubernetes上运行它们,请使用Argo。 如果您希望采用一种自以为是的方法来使用托管云平台管理机器学习生命周期,请使用MLFlow。
Kubeflow 对比 MLFlow
与诸如Airflow或Luigi之类的通用任务编排平台相比,Kubeflow和MLFlow都是更小的,更专业的工具。 Kubeflow依赖Kubernetes,而MLFlow是一个Python库,可帮助您将实验跟踪添加到现有的机器学习代码中。 Kubeflow允许您构建完整的DAG,其中每个步骤都是Kubernetes窗格,但是MLFlow具有内置功能,可以将scikit学习模型部署到Amazon Sagemaker或Azure ML。