機(jī)器學(xué)習(xí)任務(wù)編排工具比較
任務(wù)編排工具和工作流程
最近,出現(xiàn)了用于編排任務(wù)和數(shù)據(jù)工作流的新工具(有時(shí)稱為" MLOps")。 這些工具的數(shù)量眾多,因此很難選擇要使用的工具,也難以理解它們的重疊方式,因此我們決定對(duì)一些最受歡迎的工具進(jìn)行比較。
> Airflow is the most popular solution, followed by Luigi. There are newer contenders too, and they'
總體而言,Apache Airflow既是最受歡迎的工具,也是功能最廣泛的工具,但是Luigi是類似的工具,上手起來(lái)比較簡(jiǎn)單。 Argo是團(tuán)隊(duì)已經(jīng)在使用Kubernetes時(shí)經(jīng)常使用的一種,而Kubeflow和MLFlow滿足了與部署機(jī)器學(xué)習(xí)模型和跟蹤實(shí)驗(yàn)有關(guān)的更多利基要求。
在進(jìn)行詳細(xì)比較之前,了解一些與任務(wù)編排相關(guān)的更廣泛的概念很有用。
什么是任務(wù)編排,為什么有用?
較小的團(tuán)隊(duì)通常從手動(dòng)管理任務(wù)開始,例如清理數(shù)據(jù),訓(xùn)練機(jī)器學(xué)習(xí)模型,跟蹤結(jié)果以及將模型部署到生產(chǎn)服務(wù)器。 隨著團(tuán)隊(duì)規(guī)模和解決方案的增長(zhǎng),重復(fù)步驟的數(shù)量也隨之增加。 可靠地執(zhí)行這些任務(wù)也變得更加重要。
這些任務(wù)相互依賴的復(fù)雜方式也在增加。 剛開始時(shí),您可能需要每周或每月一次運(yùn)行一系列任務(wù)。 這些任務(wù)需要按特定順序運(yùn)行。 隨著您的成長(zhǎng),該管道變成具有動(dòng)態(tài)分支的網(wǎng)絡(luò)。 在某些情況下,某些任務(wù)會(huì)引發(fā)其他任務(wù),而這些可能取決于首先運(yùn)行的其他幾個(gè)任務(wù)。
可以將該網(wǎng)絡(luò)建模為DAG(有向無(wú)環(huán)圖),該模型對(duì)每個(gè)任務(wù)及其之間的依賴關(guān)系進(jìn)行建模。
> A pipeline is a limited DAG where each task has one upstream and one downstream dependency at most
工作流程編排工具允許您通過(guò)指定所有任務(wù)以及它們?nèi)绾蜗嗷ヒ蕾噥?lái)定義DAG。 然后,該工具按正確的順序按計(jì)劃執(zhí)行這些任務(wù),然后在運(yùn)行下一個(gè)任務(wù)之前重試任何失敗的任務(wù)。 它還會(huì)監(jiān)視進(jìn)度并在發(fā)生故障時(shí)通知您的團(tuán)隊(duì)。
CI / CD工具(例如Jenkins)通常用于自動(dòng)測(cè)試和部署代碼,這些工具與任務(wù)編排工具之間有很強(qiáng)的相似性-但也有重要的區(qū)別。 盡管從理論上講,您可以使用這些CI / CD工具來(lái)編排動(dòng)態(tài)的,相互鏈接的任務(wù),但在一定程度的復(fù)雜性下,您會(huì)發(fā)現(xiàn)改用Apache Airflow等更通用的工具會(huì)更容易。
總體而言,任何業(yè)務(wù)流程工具的重點(diǎn)都是確保集中,可重復(fù),可重現(xiàn)和高效的工作流程:虛擬命令中心,用于您的所有自動(dòng)化任務(wù)。 考慮到這種情況,讓我們看看一些最流行的工作流程工具是如何疊加的。
告訴我使用哪一個(gè)
您可能應(yīng)該使用:
- Apache Airflow如果您需要功能最全,最成熟的工具,則可以花時(shí)間來(lái)學(xué)習(xí)它的工作原理,設(shè)置和維護(hù)。
- Luigi,如果您需要比Airflow更輕松的學(xué)習(xí)方法。 它具有較少的功能,但更容易上手。
- Argo,如果您已經(jīng)對(duì)Kubernetes生態(tài)系統(tǒng)進(jìn)行了深入投資,并希望將所有任務(wù)作為Pod進(jìn)行管理,并在YAML(而不是Python)中定義它們。
- 如果您想使用Kubernetes,但仍使用Python而不是YAML定義任務(wù),則使用KubeFlow。
- MLFlow,如果您更關(guān)心使用MLFlow的預(yù)定義模式來(lái)跟蹤實(shí)驗(yàn)或跟蹤和部署模型,而不是尋找能夠適應(yīng)現(xiàn)有自定義工作流程的工具。
比較表
> (Source: Author) – For more Machine Learning Tips — Get our weekly newsletter
為了快速瀏覽,我們比較了以下方面的庫(kù):
- 成熟度:基于項(xiàng)目的年齡以及修復(fù)和提交的次數(shù);
- 受歡迎程度:基于采用率和GitHub星級(jí);
- 簡(jiǎn)潔性:基于易于注冊(cè)和采用;
- 廣度:基于每個(gè)項(xiàng)目的專業(yè)性與適應(yīng)性;
- 語(yǔ)言:基于您與工具互動(dòng)的主要方式。
這些不是嚴(yán)格的基準(zhǔn)或科學(xué)基準(zhǔn),但目的是讓您快速了解這些工具的重疊方式以及它們之間的區(qū)別。 有關(guān)更多詳細(xì)信息,請(qǐng)參見下面的正面對(duì)比。
Luigi 對(duì)比 Airflow
Luigi和Airflow解決了類似的問(wèn)題,但是Luigi要簡(jiǎn)單得多。 它包含在一個(gè)組件中,而Airflow有多個(gè)模塊,可以用不同的方式進(jìn)行配置。 氣流具有更大的社區(qū)和一些其他功能,但學(xué)習(xí)曲線卻陡峭得多。 具體來(lái)說(shuō),Airflow在計(jì)劃方面要強(qiáng)大得多,它提供了日歷UI,可幫助您設(shè)置任務(wù)應(yīng)在何時(shí)運(yùn)行。 使用Luigi,您需要編寫更多的自定義代碼以按計(jì)劃運(yùn)行任務(wù)。
兩種工具都使用Python和DAG定義任務(wù)和依賴項(xiàng)。 如果您的團(tuán)隊(duì)較小并且需要快速上手,請(qǐng)使用Luigi。 如果您的團(tuán)隊(duì)規(guī)模較大,可以使用Airflow,一旦您掌握了學(xué)習(xí)曲線,就可以從最初的生產(chǎn)力損失中獲得更大的動(dòng)力。
Luigi 對(duì)比 Argo
Argo建立在Kubernetes之上,并且每個(gè)任務(wù)都作為單獨(dú)的Kubernetes容器運(yùn)行。 如果您已經(jīng)在大多數(shù)基礎(chǔ)架構(gòu)中使用Kubernetes,這可能會(huì)很方便,但如果您沒有使用它,則會(huì)增加復(fù)雜性。 Luigi是一個(gè)Python庫(kù),可以與Python包管理工具(如pip和conda)一起安裝。 Argo是Kubernetes擴(kuò)展,使用Kubernetes安裝。 雖然這兩種工具都可以將任務(wù)定義為DAG,但使用Luigi時(shí),您將使用Python編寫這些定義,而使用Argo時(shí),您將使用YAML。
如果您已經(jīng)對(duì)Kubernetes進(jìn)行了投資,并且知道所有任務(wù)都是吊艙,請(qǐng)使用Argo。 如果要編寫DAG定義的開發(fā)人員對(duì)YAML比對(duì)Python更滿意,則還應(yīng)該考慮一下。 如果您不是在Kubernetes上運(yùn)行并且在團(tuán)隊(duì)中擁有Python專業(yè)知識(shí),請(qǐng)使用Luigi。
Luigi 對(duì)比 Kubeflow
Luigi是用于常規(guī)任務(wù)編排的基于Python的庫(kù),而Kubeflow是專門用于機(jī)器學(xué)習(xí)工作流的基于Kubernetes的工具。 Luigi是為協(xié)調(diào)一般任務(wù)而構(gòu)建的,而Kubeflow具有用于實(shí)驗(yàn)跟蹤,超參數(shù)優(yōu)化和為Jupyter筆記本服務(wù)的預(yù)構(gòu)建模式。 Kubeflow由兩個(gè)不同的組件組成:Kubeflow和Kubeflow管道。 后者專注于模型部署和CI / CD,并且可以獨(dú)立于主要Kubeflow功能使用。
如果您需要協(xié)調(diào)從數(shù)據(jù)清理到模型部署的各種不同任務(wù),請(qǐng)使用Luigi。 如果您已經(jīng)使用Kubernetes并希望安排常見的機(jī)器學(xué)習(xí)任務(wù)(例如實(shí)驗(yàn)跟蹤和模型訓(xùn)練),請(qǐng)使用Kubeflow。
Luigi 對(duì)比 MLFlow
Luigi是一個(gè)通用的任務(wù)編排系統(tǒng),而MLFlow是一個(gè)更專業(yè)的工具,可以幫助管理和跟蹤您的機(jī)器學(xué)習(xí)生命周期和實(shí)驗(yàn)。 您可以使用Luigi定義常規(guī)任務(wù)和依賴項(xiàng)(例如訓(xùn)練和部署模型),但是可以將MLFlow直接導(dǎo)入到機(jī)器學(xué)習(xí)代碼中,并使用其助手功能來(lái)記錄信息(例如您正在使用的參數(shù))并 工件(例如訓(xùn)練有素的模型)。 您還可以將MLFlow用作命令行工具,以服務(wù)使用通用工具(例如scikit-learn)構(gòu)建的模型或?qū)⑵洳渴鸬酵ㄓ闷脚_(tái)(例如AzureML或Amazon SageMaker)。
Airflow 對(duì)比 Argo
Argo和Airflow都允許您將任務(wù)定義為DAG,但是在Airflow中,您可以使用Python進(jìn)行此操作,而在Argo中,您可以使用YAML。 Argo作為Kubernetes窗格運(yùn)行每個(gè)任務(wù),而Airflow則生活在Python生態(tài)系統(tǒng)中。 在選擇Argo之前,Canva評(píng)估了這兩個(gè)選項(xiàng),您可以觀看此演講以獲取詳細(xì)的比較和評(píng)估。
如果您想要更成熟的工具并且不關(guān)心Kubernetes,請(qǐng)使用Airflow。 如果您已經(jīng)對(duì)Kubernetes進(jìn)行了投資,并且想要運(yùn)行以不同堆棧編寫的各種任務(wù),請(qǐng)使用Argo。
Airflow 對(duì)比 Kubeflow
Airflow是一個(gè)通用的任務(wù)編排平臺(tái),而Kubeflow則特別專注于機(jī)器學(xué)習(xí)任務(wù),例如實(shí)驗(yàn)跟蹤。 兩種工具都允許您使用Python定義任務(wù),但是Kubeflow在Kubernetes上運(yùn)行任務(wù)。 Kubeflow分為Kubeflow和Kubeflow管道:后一個(gè)組件允許您指定DAG,但它比常規(guī)任務(wù)更著重于部署和模型服務(wù)。
如果您需要一個(gè)成熟的,廣泛的生態(tài)系統(tǒng)來(lái)執(zhí)行各種不同的任務(wù),請(qǐng)使用Airflow。 如果您已經(jīng)使用Kubernetes,并希望使用更多現(xiàn)成的機(jī)器學(xué)習(xí)解決方案模式,請(qǐng)使用Kubeflow。
Airflow 對(duì)比 MLFlow
Airflow是一個(gè)通用的任務(wù)編排平臺(tái),而MLFlow是專門為優(yōu)化機(jī)器學(xué)習(xí)生命周期而構(gòu)建的。 這意味著MLFlow具有運(yùn)行和跟蹤實(shí)驗(yàn)以及訓(xùn)練和部署機(jī)器學(xué)習(xí)模型的功能,而Airflow具有廣泛的用例,您可以使用它來(lái)運(yùn)行任何任務(wù)集。 Airflow是一組用于管理和計(jì)劃任務(wù)的組件和插件。 MLFlow是一個(gè)Python庫(kù),您可以將其導(dǎo)入到現(xiàn)有的機(jī)器學(xué)習(xí)代碼中,還可以使用命令行工具來(lái)將scikit-learn編寫的機(jī)器學(xué)習(xí)模型訓(xùn)練和部署到Amazon SageMaker或AzureML。
如果您想以一種開明的,開箱即用的方式來(lái)管理機(jī)器學(xué)習(xí)實(shí)驗(yàn)和部署,請(qǐng)使用MLFlow。 如果您有更復(fù)雜的要求并且想要更好地控制如何管理機(jī)器學(xué)習(xí)生命周期,請(qǐng)使用Airflow。
Argo 對(duì)比 Kubeflow
Kubeflow的某些部分(例如Kubeflow管道)建立在Argo之上,但是Argo的建立是為了編排任何任務(wù),而Kubeflow則專注于特定于機(jī)器學(xué)習(xí)的任務(wù),例如實(shí)驗(yàn)跟蹤,超參數(shù)調(diào)整和模型部署。 Kubeflow管道是Kubeflow的一個(gè)獨(dú)立組件,專注于模型部署和CI / CD,并且可以獨(dú)立于Kubeflow的其他功能使用。 這兩種工具都依賴Kubernetes,如果您已經(jīng)采用了它,那么可能會(huì)讓您更感興趣。 使用Argo,您可以使用YAML定義任務(wù),而Kubeflow允許您使用Python接口。
如果您需要管理作為Kubernetes Pod運(yùn)行的常規(guī)任務(wù)的DAG,請(qǐng)使用Argo。 如果您想要更專注于機(jī)器學(xué)習(xí)解決方案的工具,請(qǐng)使用Kubeflow。
Argo 對(duì)比 MLFlow
Argo是一個(gè)任務(wù)編排工具,可讓您將任務(wù)定義為Kubernetes Pod,并將其作為DAG運(yùn)行(使用YAML定義)。 MLFlow是一種更加專業(yè)的工具,它不允許您定義任意任務(wù)或它們之間的依賴關(guān)系。 相反,您可以將MLFlow作為Python庫(kù)導(dǎo)入到現(xiàn)有的(Python)機(jī)器學(xué)習(xí)代碼庫(kù)中,并使用其助手功能記錄工件和參數(shù),以幫助進(jìn)行分析和實(shí)驗(yàn)跟蹤。 您還可以使用MLFlow的命令行工具來(lái)訓(xùn)練scikit學(xué)習(xí)模型,并將其部署到Amazon Sagemaker或Azure ML,以及管理Jupyter筆記本。
如果您需要管理常規(guī)任務(wù)并想在Kubernetes上運(yùn)行它們,請(qǐng)使用Argo。 如果您希望采用一種自以為是的方法來(lái)使用托管云平臺(tái)管理機(jī)器學(xué)習(xí)生命周期,請(qǐng)使用MLFlow。
Kubeflow 對(duì)比 MLFlow
與諸如Airflow或Luigi之類的通用任務(wù)編排平臺(tái)相比,Kubeflow和MLFlow都是更小的,更專業(yè)的工具。 Kubeflow依賴Kubernetes,而MLFlow是一個(gè)Python庫(kù),可幫助您將實(shí)驗(yàn)跟蹤添加到現(xiàn)有的機(jī)器學(xué)習(xí)代碼中。 Kubeflow允許您構(gòu)建完整的DAG,其中每個(gè)步驟都是Kubernetes窗格,但是MLFlow具有內(nèi)置功能,可以將scikit學(xué)習(xí)模型部署到Amazon Sagemaker或Azure ML。