最近,用于编排任务和数据工作流的新工具激增(有时称为“MLOps”)。这些工具的数量众多,使得选择正确的工具成为一个难题,因此我们决定将一些最受欢迎的工具进行对比。
总体而言,Apache Airflow既是最受欢迎的工具,也是功能最广泛的工具,但是Luigi等类似的工具,上手起来比较简单。Argo是团队已经在使用Kubernetes时经常使用的一种,而Kubeflow和MLFlow满足了与部署机器学习模型和跟踪实验有关的更多利基需求。
在进行详细比较之前,先了解一些涉及到任务编排(task orchestration)的核心概念。
本文来自《数据黑客》,登录官网可阅读更多精彩资讯和文章。
什么是任务编排?为什么有用?
较小的团队通常从手动管理任务开始,例如清理数据,训练机器学习模型,跟踪结果以及将模型部署到生产服务器。随着团队规模和解决方案的增长,重复步骤的数量也随之增加。可靠地执行这些任务也变得更加重要。
这些任务相互依赖的复杂程度也在增加。刚开始的时候,你可能需要每周或每月运行一次任务,这些任务按特定顺序运行。随着项目发展,这些任务变成具有动态分支的网络。在某些情况下,某些任务会引发其他任务,而这些可能取决于首先运行的其他几个任务。
可以将该网络建模为DAG(有向无环图),该模型对每个任务及其之间的依赖关系进行建模。
工作流程编排工具允许您通过指定所有任务以及它们如何相互依赖来定义DAG。然后,该工具按正确的顺序执行这些任务,然后在运行下一个任务之前重试任何失败的任务。它还会监视进度并在发生故障时通知您的团队。
CI /CD工具(例如Jenkins)通常用于自动测试和部署代码,这些工具与任务编排工具之间有很强的相似性,但也有重要的区别。即使从理论上讲,您可以使用这些CI/CD工具来编排动态的,相互链接的任务,但在一定程度的复杂性下,您会发现更容易使用Apache Airflow之类的更通用的工具。
总体而言,任何任务流程工具的重点都是确保集中,可重复,可重现和高效的工作流程:虚拟命令中心,用于您的所有自动化任务。考虑到这种情况,让我们对比一下最流行的任务流工具。
应该使用哪个工具?
工具对比
我们比较了以下指标:
这些不是严格的基准,但它们提供了这些工具的相似性和区别。
Luigi vs Airflow
Luigi和Airflow解决了类似的问题,但是Luigi要简单得多。它包含在单个组件中,而Airflow有多个模块,可以用不同的方式进行配置。Airflow具有更大的社区和一些其他功能,但学习曲线却陡峭得多。具体来说,Airflow在计划任务方面要强大得多,它提供了日历UI,可帮助您设置任务应在何时运行。使用Luigi,您需要编写更多的自定义代码以按计划运行任务。
两种工具都使用Python和DAG定义任务和依赖项。如果您的团队较小并且需要快速上手,请使用Luigi。如果您的团队规模较大,可以使用Airflow,一旦您掌握了核心概念,就可以在长期获得更高的生产率。
Luigi vs Argo
Argo构建在Kubernetes之上,并且每个任务都作为单独的Kubernetes容器运行。如果您已经在大多数基础架构中使用Kubernetes,这可能会很方便,但是如果您没有使用Kubernetes,则会增加复杂性。Luigi是一个Python库,可以与Python包管理工具(如pip和conda)一起安装。Argo是Kubernetes扩展,使用Kubernetes安装。虽然这两种工具都可以将任务定义为DAG,但使用Luigi时,您将使用Python编写任务,而使用Argo时,将使用YAML。
如果您已经熟悉Kubernetes,并且知道所有任务都是Pods,请使用Argo。如果您不熟悉Kubernetes,且团队更倾向于用Python开发,请使用Luigi。
Luigi vs Kubeflow
Luigi是用于一般任务编排的Python库,而Kubeflow是专门用于机器学习工作流且基于Kubernetes的工具。Luigi是为协调一般任务而构建的,而Kubeflow具有用于实验跟踪,超参数优化和为Jupyter notebook服务的预构建模式。Kubeflow由两个不同的组件组成:Kubeflow和Kubeflow管道,后者专注于模型部署和CI/CD,并且可以独立于主要Kubeflow功能使用。
如果您需要协调从数据清理到模型部署的各种不同任务,请使用Luigi。如果您已经使用Kubernetes并希望安排常见的机器学习任务(例如实验跟踪和模型训练),请使用Kubeflow。
Luigi vs MLFlow
Luigi是一个通用的任务编排系统,而MLFlow是一个更专业的工具,可以帮助管理和跟踪您的机器学习生命周期和实验。您可以使用Luigi定义常规任务和依赖项(例如训练和部署模型),但是可以将MLFlow直接导入到机器学习代码中,并使用其辅助函数来记录信息,例如模型使用的超参数。您还可以将MLFlow用作命令行工具,以服务使用通用工具(例如scikit-learn)构建的模型或将其部署到通用平台(例如AzureML或Amazon SageMaker)。
Airflow vs Argo
Argo和Airflow都允许您将任务定义为DAG,但是在Airflow中,您可以使用Python进行此操作,而在Argo中,要使用YAML。Argo利用Kubernetes Pods运行每个任务,而Airflow则跟Python生态系统深度整合。
如果您想要更成熟的工具并且不关心Kubernetes,请使用Airflow。如果您已经在使用Kubernetes,并且想要运行以不同堆栈编写的各种任务,请使用Argo。
Airflow vs Kubeflow
Airflow是一个通用的任务编排平台,而Kubeflow特别专注于机器学习任务,例如实验跟踪。两种工具都允许您使用Python定义任务,但是Kubeflow在Kubernetes上运行任务。Kubeflow分为Kubeflow和Kubeflow管道:后一个组件允许您指定DAG,但与常规任务相比,它更侧重于部署和监控模型。
如果需要成熟,广泛的生态系统来执行各种不同的任务,使用Airflow。如果您已经使用Kubernetes,并希望使用更多现成的机器学习解决方案,使用Kubeflow。
Airflow vs MLFlow
Airflow是一个通用的任务编排平台,而MLFlow是专门为优化机器学习项目而构建的。这意味着MLFlow具有运行和跟踪实验,以及训练和部署机器学习模型的功能,而Airflow适用于更广泛的用例,您可以使用它来运行任何类型的任务。
Airflow是一组管理和计划任务的模块的集合,MLFlow是一个纯粹的Python库,您可以将其导入到现有的机器学习代码中,还可以使用命令行工具来将scikit-learn编写的机器学习模型部署到Amazon SageMaker或AzureML。
如果您想以一种简单的,开箱即用的方式来训练和部署机器学习模型,请使用MLFlow。如果您有更复杂的要求,并希望更好地控制机器学习项目的整个生命周期,请使用Airflow。
Argo vs Kubeflow
Kubeflow的某些部分(例如Kubeflow管道)建立在Argo之上,但Argo的存在是为了编排任何任务,而Kubeflow则专注于与机器学习相关的任务,例如实验跟踪,超参数调整和模型部署。Kubeflow管道是Kubeflow的一个独立组件,专注于模型部署和CI/CD,并且可以独立于Kubeflow的其他功能使用。这两种工具都依赖Kubernetes,如果您已经熟悉Kubernetes,那么两个工具都容易上手。
如果您希望用Kubernetes Pod运行任务,请使用Argo。如果您想要更专注于机器学习的解决方案,请使用Kubeflow。
Argo vs MLFlow
使用Argo,您可以将任务定义为Kubernetes Pod。MLFlow是一种更加专业的工具,它不允许您定义任意任务或它们之间的依赖关系。相反,您可以将MLFlow作为Python库导入到现有的(Python)机器学习代码库中,并使用其助手功能记录工件和参数,以帮助进行分析和实验跟踪。您还可以使用MLFlow的命令行工具来训练scikit-learn模型,并将其部署到Amazon SageMaker或Azure ML。
如果您需要管理常规任务并想在Kubernetes上运行,请使用Argo。如何您希望用相对简单的方式在云平台上构建机器学习项目,请使用MLFlow。
Kubeflow vs MLFlow
与Airflow和Luigi等通用平台相比,Kubeflow和MLFlow属于更小但更专业的工具。
Kubeflow依赖Kubernetes,而MLFlow是一个Python库,两者都允许将实验跟踪添加到现有的机器学习代码中。
Kubeflow允许您构建完整的DAG,其中每个步骤都是Kubernetes Pods,但MLFlow具有内置功能,可以将scikit-learn模型部署到Amazon SageMaker或Azure ML。
如果您想开发机器学习模型,并以Kubernetes作为后盾来实现最终的部署方案,请使用Kubeflow。如果您想利用通用云平台提供的解决方案,请使用MLFlow。