盡管機(jī)器學(xué)習(xí)(ML)可以產(chǎn)生出色的結(jié)果,在實(shí)踐中使用它仍然是很復(fù)雜的。 除了軟件研發(fā)中的常見挑戰(zhàn)外,機(jī)器學(xué)習(xí)開發(fā)人員還面臨著新的挑戰(zhàn),包括實(shí)驗(yàn)管理(跟蹤結(jié)果是由哪些參數(shù),代碼和數(shù)據(jù)導(dǎo)致的); 可重復(fù)性(稍后可以在相同的運(yùn)行環(huán)境中執(zhí)行相同的代碼); 部署模型到生產(chǎn)環(huán)境; 以及數(shù)據(jù)治理(審計(jì)在整個(gè)機(jī)構(gòu)中使用的模型和數(shù)據(jù)。)。 圍繞ML生命周期的這些關(guān)于工作流的挑戰(zhàn),通常是在生產(chǎn)環(huán)境中使用機(jī)器學(xué)習(xí)并在機(jī)構(gòu)內(nèi)部對其擴(kuò)展的最大障礙。
為了應(yīng)對這些挑戰(zhàn),許多公司開始構(gòu)建內(nèi)部機(jī)器學(xué)習(xí)平臺(tái),這些平臺(tái)可以自動(dòng)化執(zhí)行其中的一些步驟。 在典型的機(jī)器學(xué)習(xí)平臺(tái)中,專門的工程團(tuán)隊(duì)構(gòu)建了一套數(shù)據(jù)科學(xué)家可以調(diào)用的算法和管理工具。 例如,Uber和Facebook已經(jīng)建立了Michelangelo和 FBLearner Flow來管理數(shù)據(jù)準(zhǔn)備、模型訓(xùn)練和部署。 然而,就算是內(nèi)部平臺(tái),也有其自身的限制性:典型的機(jī)器學(xué)習(xí)平臺(tái)僅支持一小組具有有限定制化的(無論工程團(tuán)隊(duì)構(gòu)建了什么),并且平臺(tái)與每個(gè)公司的基礎(chǔ)架構(gòu)是綁定的。
在2018年的Spark + AI峰會(huì)上我在Databricks的團(tuán)隊(duì)介紹了MLflow,這是一個(gè)新的開源項(xiàng)目,能夠構(gòu)建一個(gè)開放的機(jī)器學(xué)習(xí)平臺(tái)。 除了開源之外,MLflow也是“開放的”,在某種意義上,機(jī)構(gòu)中或者開源社區(qū)中的任何人,都能夠?yàn)镸LFlow添加新功能(比如一個(gè)新的訓(xùn)練算法或者一個(gè)新的部署工具),這些功能可以自動(dòng)地與MLFlow的其他部分協(xié)作。MLflow通過在軟件研發(fā)中對模型進(jìn)行跟蹤、重現(xiàn)、管理和部署,提供了一種強(qiáng)大的方式在組織機(jī)構(gòu)內(nèi)部去簡化和線性擴(kuò)展機(jī)器學(xué)習(xí)的部署。 在這篇博文中,我將簡要概述MLflow所應(yīng)對的挑戰(zhàn),以及如何入門的初階講解。
機(jī)器學(xué)習(xí)工作流的挑戰(zhàn)
在Databricks,我們與數(shù)百家在生產(chǎn)環(huán)境中使用機(jī)器學(xué)習(xí)的公司合作。 在這些公司中,我們一再聽到圍繞機(jī)器學(xué)習(xí)的相同的擔(dān)憂擔(dān)憂:
- 存在無數(shù)彼此獨(dú)立的工具。 從數(shù)據(jù)準(zhǔn)備到模型訓(xùn)練,數(shù)百種軟件工具涵蓋了機(jī)器學(xué)習(xí)生命周期的每個(gè)階段。 更有甚者,與傳統(tǒng)的軟件開發(fā)不同,團(tuán)隊(duì)為每個(gè)階段選擇一個(gè)工具,在機(jī)器學(xué)習(xí)中,您通常希望嘗試每個(gè)可用的工具(例如,算法)來查看它是否會(huì)改善結(jié)果。 因此,機(jī)器學(xué)習(xí)開發(fā)人員需要圍繞數(shù)十個(gè)庫進(jìn)行使用和生產(chǎn)環(huán)境部署。
- 跟蹤實(shí)驗(yàn)很難。 機(jī)器學(xué)習(xí)算法具有幾十種可配置的參數(shù),無論您是單獨(dú)工作還是在團(tuán)隊(duì)中工作,都很難跟蹤每個(gè)實(shí)驗(yàn)中的何種參數(shù)、代碼和數(shù)據(jù)造就了某種模型。
- 實(shí)驗(yàn)結(jié)果難以重現(xiàn)。 如果沒有詳細(xì)的跟蹤,團(tuán)隊(duì)使用相同的代碼起到同樣的效果這一點(diǎn)上往往會(huì)遇到困難。 無論您是將訓(xùn)練代碼交付給工程師用于生產(chǎn)的數(shù)據(jù)科學(xué)家,還是為了調(diào)試一個(gè)錯(cuò)誤回滾到過去的代碼進(jìn)行修正,重現(xiàn)機(jī)器學(xué)習(xí)工作流程的步驟都至關(guān)重要。 我們聽過多個(gè)恐怖故事,比如生產(chǎn)環(huán)境的模型表現(xiàn)無法像訓(xùn)練模型那么好,或者一個(gè)團(tuán)隊(duì)無法重現(xiàn)另一個(gè)團(tuán)隊(duì)的結(jié)果。
- 部署機(jī)器學(xué)習(xí)很困難。 由于需要運(yùn)行大量的部署工具和環(huán)境(例如,REST服務(wù),批處理推斷,或移動(dòng)應(yīng)用程序),將模型遷移到生產(chǎn)環(huán)境可能會(huì)是極具挑戰(zhàn)性的。 沒有一種標(biāo)準(zhǔn)方法可以將模型從任何庫遷移到任何這些工具上,從而每次進(jìn)行新的部署時(shí),都在產(chǎn)生新的風(fēng)險(xiǎn)。
MLflow:一個(gè)開放的機(jī)器學(xué)習(xí)平臺(tái)
MLflow是這樣被設(shè)計(jì)的:它旨在通過一組API和工具來解決這些工作流挑戰(zhàn),您可以將它們與任何現(xiàn)有的機(jī)器學(xué)習(xí)庫和代碼倉庫一起使用。 在當(dāng)前的alpha版本中,MLflow提供了三個(gè)主要組件:
- MLflow 跟蹤模塊 :用于記錄實(shí)驗(yàn)數(shù)據(jù)的API和UI,其中的數(shù)據(jù)包括參數(shù),代碼版本,評(píng)價(jià)指標(biāo),和使用過的輸出文件。
- MLflow 項(xiàng)目模塊 :用于可重現(xiàn)性運(yùn)行的一種代碼封裝格式。 通過將您的代碼封裝在MLflow項(xiàng)目中,您可以指定其中的依賴關(guān)系,并允許任何其他用戶稍后再次運(yùn)行它,并可靠地對結(jié)果進(jìn)行重現(xiàn)。
- MLflow 模型模塊 :一種簡單的模型封裝格式,允許您將模型部署到許多工具。 例如,如果您能將模型封裝為一個(gè)Python函數(shù),MLflow模型就可以將其部署到Docker或Azure ML進(jìn)行線上服務(wù),部署到Apache Spark進(jìn)行批量打分,等等。

圖1. MLflow組件。 圖片由Matei Zaharia提供
MLflow是模塊化設(shè)計(jì)的,因此您不僅可以在現(xiàn)有機(jī)器學(xué)習(xí)流程中單獨(dú)使用這些組件,也可以將它們組合使用。 讓我們依次深入研究這些組件中的每一個(gè),看看如何使用它們,以及它們能如何簡化機(jī)器學(xué)習(xí)研發(fā)。
MLflow入門
MLflow是開源的,使用pip install mlflow 能夠很方便的安裝。要開始使用MLflow,請按照MLflow文檔中的說明進(jìn)行操作,或查看GitHub上的代碼。
MLflow 跟蹤模塊
MLflow跟蹤模塊是一種API和UI,它被用于在執(zhí)行機(jī)器學(xué)習(xí)代碼時(shí),記錄參數(shù)、代碼版本、性能評(píng)估和輸出文件,以便日后對其進(jìn)行可視化。 通過使用簡單的幾行代碼,您就可以跟蹤參數(shù),性能指標(biāo)和“工件”(您要存儲(chǔ)的任意輸出文件):
import mlflow
# Log parameters (key-value pairs)
mlflow.log_param(“num_dimensions”, 8)
mlflow.log_param(“regularization”, 0.1)
# Log a metric; metrics can also be updated throughout the run
mlflow.log_metric(“accuracy”, model.accuracy)
# Log artifacts (output files)
mlflow.log_artifact(“roc.png”)
mlflow.log_artifact(“model.pkl”)
您可以在任何可以運(yùn)行代碼(例如,獨(dú)立的腳本或notebook中的代碼)的環(huán)境中使用MLflow跟蹤模塊將結(jié)果記錄到本地文件或服務(wù)器,然后比較多次運(yùn)行結(jié)果。 使用Web UI,您可以查看和比較多次運(yùn)行的輸出:

圖2. MLflow跟蹤UI。 圖片由Matei Zaharia提供
MLflow項(xiàng)目模塊
跟蹤結(jié)果固然有用,但您也經(jīng)常需要重現(xiàn)結(jié)果。 MLflow 項(xiàng)目模塊為封裝可重用的數(shù)據(jù)科學(xué)代碼提供了一種標(biāo)準(zhǔn)格式。 每個(gè)項(xiàng)目可以只是一個(gè)包含代碼的文件夾,也可以是Git倉庫,通過使用一個(gè)描述文件來指定其依賴關(guān)系以及如何運(yùn)行代碼。 一個(gè)MLflow項(xiàng)目由一個(gè)名為MLproject的簡單YAML文件來定義 。
name: My Project
conda_env: conda.yaml
entry_points:
? main:
? ? parameters:
? ? ? data_file: path
? ? ? regularization: {type: float, default: 0.1}
? ? command: “python train.py -r {regularization} {data_file}”
? validate:
? ? parameters:
? ? ? data_file: path
? ? command: “python validate.py {data_file}”
項(xiàng)目可以通過Conda環(huán)境指定其依賴項(xiàng)。 一個(gè)項(xiàng)目也可以有多個(gè)入口點(diǎn),用于調(diào)用含有帶命名參數(shù)的運(yùn)行。 您可以使用mlflow run命令行工具,從本地文件或Git倉庫運(yùn)行項(xiàng)目:
mlflow run example/project -P alpha=0.5
mlflow run [email protected]:databricks/mlflow-example.git -P alpha=0.5
MLflow會(huì)自動(dòng)為項(xiàng)目設(shè)置正確的環(huán)境,并加以運(yùn)行。 額外要提到的是,如果您在項(xiàng)目中使用MLflow Tracking API,MLflow將記住執(zhí)行的項(xiàng)目版本(即Git commit)和任何參數(shù)。 然后,您可以輕松地重新運(yùn)行完全相同的代碼。 因此,無論是在公司內(nèi)部還是在開源社區(qū)中,使用項(xiàng)目模塊提供的格式,都可以輕松共享可重現(xiàn)的數(shù)據(jù)科學(xué)代碼。
MLflow模型模塊
MLflow的第三個(gè)組件是MLflow Models,這是一種簡單但功能強(qiáng)大的封裝模型的方法。 雖然已經(jīng)存在許多模型存儲(chǔ)格式(例如ONNX和PMML),但MLflow模型模塊的目標(biāo)是不同的:其目標(biāo)是表示模型應(yīng)該如何被調(diào)用,以便許多不同類型的下游部署工具可以使用它。 為了實(shí)現(xiàn)這一點(diǎn),MLflow模型模塊可以圍繞一個(gè)模型存儲(chǔ)被稱為“風(fēng)格”的多種格式。這些風(fēng)格可以是特定針對某些庫的(例如TensorFlow計(jì)算圖),也可以是非常通用的,如“Python函數(shù)”,任何能夠理解Python代碼的部署工具都可以加以使用。
每個(gè)MLflow模型簡單地保存為包含任意文件的目錄和一個(gè)叫MLmodel 的YAML文件,這個(gè)文件列出了它可以在哪些風(fēng)格里使用。這里有一個(gè)從SciKit-Learn導(dǎo)出的示例模型:
time_created: 2018-02-21T13:21:34.12
flavors:
? sklearn:
? ? sklearn_version: 0.19.1
? ? pickled_model: model.pkl
? python_function:
? ? loader_module: mlflow.sklearn
? ? pickled_model: model.pkl
MLflow提供了將許多常見模型類型部署到不同平臺(tái)的工具。 例如,支持python_function 風(fēng)格的任何模型,都可以部署到基于Docker的REST服務(wù)器,云服務(wù)平臺(tái)(如Azure ML和AWS SageMaker),以及Spark SQL中的用戶自定義函數(shù),用于批處理和流式處理進(jìn)行模型推斷。 如果使用MLflow Tracking API將MLflow模型輸出為工件,MLflow還將自動(dòng)記住哪個(gè)項(xiàng)目、在哪運(yùn)行它們,以便您日后進(jìn)行重現(xiàn)。
將這些工具組合在一起
雖然MLflow的各個(gè)組件很簡單,但無論您是單獨(dú)使用機(jī)器學(xué)習(xí)還是在大型團(tuán)隊(duì)中與人協(xié)作,您都可以以強(qiáng)大的方式將它們組合在一起。 例如,您可以將MLflow用于:
- 在您的筆記本電腦上開發(fā)模型時(shí),對代碼,數(shù)據(jù),參數(shù)和性能指標(biāo)進(jìn)行記錄并可視化。
- 將代碼封裝為MLflow項(xiàng)目,以便在云環(huán)境中大規(guī)模運(yùn)行它們,以進(jìn)行超參數(shù)搜索。
- 構(gòu)建一個(gè)排行榜,以比較團(tuán)隊(duì)內(nèi)針對同一任務(wù)的不同模型的性能。
- 將算法,提取特征的步驟和模型共享為MLflow項(xiàng)目或者M(jìn)Lflow模型,使得組織機(jī)構(gòu)中的其他用戶能夠把這些整合到某個(gè)工作流中。
- 將相同的模型部署到批處理和實(shí)時(shí)處理,而無需針對兩個(gè)不同工具分別開發(fā)代碼。
下一步是什么?
我們剛剛開始使用MLflow,因此還有很多其他內(nèi)容即將到來。 除了對項(xiàng)目的更新外,我們還計(jì)劃引入主要的新組件(如監(jiān)控),庫集成,和語言綁定。 例如,幾周前,我們發(fā)布了MLflow 0.2,內(nèi)置對TensorFlow的支持和其他一些新功能。
我們很期待看到您可以使用MLflow做些什么,以及我們很樂意聽取您的反饋。
相關(guān)資源:
- “將機(jī)器學(xué)習(xí)模型轉(zhuǎn)化為真實(shí)的產(chǎn)品和服務(wù)時(shí)得到的經(jīng)驗(yàn)教訓(xùn)”
- “管理機(jī)器學(xué)習(xí)模型中的風(fēng)險(xiǎn)”:Andrew Burt和Steven Touw分享關(guān)于公司如何管理那些他們無法完全解釋的模型
- “什么是機(jī)器學(xué)習(xí)工程師?”:考察一種新角色,其專注于創(chuàng)建數(shù)據(jù)產(chǎn)品,并且使得數(shù)據(jù)科學(xué)的成果在生產(chǎn)環(huán)境中工作
- “我們需要建立機(jī)器學(xué)習(xí)工具來強(qiáng)化機(jī)器學(xué)習(xí)工程師的能力”
- 當(dāng)模型變得流氓時(shí):David Talby關(guān)于在生產(chǎn)環(huán)境中使用機(jī)器學(xué)習(xí)得到的深刻教訓(xùn)
Matei Zaharia
Matei Zaharia是斯坦福大學(xué)計(jì)算機(jī)科學(xué)系助理教授,以及Databricks首席技術(shù)專家。 他于2009年在加州大學(xué)伯克利分校攻讀博士期間,創(chuàng)建了Spark項(xiàng)目。 在此之前,Matei在數(shù)據(jù)中心系統(tǒng)中廣泛開展工作,與他人共同啟動(dòng)了Apache Mesos項(xiàng)目,并作為Apache Hadoop的提交者做出持續(xù)的貢獻(xiàn)。 Matei的研究在2014年獲得ACM計(jì)算機(jī)科學(xué)最佳博士論文獎(jiǎng)。

