Netflix開源Python框架Metaflow有何提升性能的魔法?
Metaflow 是由 Netflix 開發(fā),用在數(shù)據(jù)科學領(lǐng)域的 Python框架,于 2019 年 12 月正式對外開源。據(jù)介紹,Metaflow 解決了數(shù)據(jù)科學家在可擴展性和版本控制方面面臨的一些挑戰(zhàn),通過有向圖中的一系列步驟來構(gòu)建處理流水線。Metaflow 可以更容易地將本地流水線搬移到云資源上運行(不過目前僅支持 AWS 云)。每個步驟都在又向流程圖中的獨立節(jié)點上運行,并且具有唯一的依賴關(guān)系,Metaflow 則負責處理節(jié)點之間的內(nèi)部通信。今天,我們就為大家介紹 Metaflow,希望對大家有所幫助。?? ? ? ?
? ? ? ?Metaflow 簡介?Metaflow 在 ?Netflix 內(nèi)部已經(jīng)被用于各個方面的機器學習任務(wù),例如優(yōu)化廣告投遞,視頻編碼等。Metaflow 其出現(xiàn)是為了提高模型的部署效率,讓整個模型開發(fā),部署,更新流程更加系統(tǒng)化,從而提高部署速度。?對數(shù)據(jù)科學家而言,他們更關(guān)注的是模型設(shè)計和特征工程等直接與模型性能相關(guān)的工作,并且希望能快速部署模型從而驗證模型是否能在生產(chǎn)環(huán)境中有所提升,而不想在諸如環(huán)境依賴,版本控制,數(shù)據(jù)倉庫管理等基本流程任務(wù)中浪費精力,Metaflow 的出現(xiàn)就是為了解決這個問題。? ? ? ?
? ? ? ?Metaflow 可以簡化甚至自動完成底層任務(wù),讓數(shù)據(jù)科學家能更輕松,快速地部署模型,從而集中精力來提升模型性能以及在實際工程環(huán)境中的表現(xiàn),提高生產(chǎn)力。因此,這是一款以人為中心的框架。近期,Netflix 也透露,Metaflow 已經(jīng)將 Netflix 機器學習項目部署時間的中位數(shù)從四個月縮短到了僅僅7天。接下來將主要介紹Metaflow的工作原理和特點。?基本工作原理? ? ? ?
? ? ? ?如上圖,可以用一個有向非循環(huán)圖來表示工作流程,圖中的每個節(jié)點都表示一個流程中的一個階段,這些階段可以是任意的 Python 代碼,在上圖的例子中,Metaflow 并行的訓練兩個不同版本的模型,并選擇性能最好的那個。這是一種單機并行處理的方式,類似于 Python 中的 ?multiprocessing 包。如果要部署到云資源,只需要額外指定一個命令行參數(shù) --with batch,即可告知 Metaflow 在云上運行代碼。目前只支持亞馬遜的 Web 服務(wù)器,不過應(yīng)該很快就會支持更多云服務(wù)器。?每個階段的末尾都有一個檢查點,可以在以后的階段中從任意檢查點恢復(fù)執(zhí)行,以幫助調(diào)試。但是你不能逐行檢查您的代碼。?版本控制?機器學習的版本控制頗具挑戰(zhàn)性,因此 Metaflow 也特別照顧了這個問題。每個步驟的運行代碼和數(shù)據(jù)都是散列(hash)的,圖中每個節(jié)點的執(zhí)行都被記錄下來,并且超參數(shù)設(shè)置和運行結(jié)果都被存儲:
from?metaflow?import?FlowSpec,?Parameter,?step
class FitModelFlow(FlowSpec):
? ?alpha = Parameter('alpha',
? ? ? ? ? ? ? ? ? ? ?help='Learning rate',
? ? ? ? ? ? ? ? ? ? ?default=0.01)
? ?@step
? ?def start(self):
? ? ? ?print('alpha is %f' % self.alpha)
? ? ? ?self.data = load_data()
? ? ? ?self.next(self.fit)
? ?@step
? ?def fit(self):
? ? ? ?self.model = fit(self.data)
? ? ? ?self.next(self.end)
? ?@step
? ?def end(self):
? ? ? ?print(f'Results for LR={self.alpha}: {eval(self.model)}')
if __name__ == '__main__':
? ?FitModelFlow()
超參數(shù)的設(shè)置可以很容易地通過命令行參數(shù)來完成:
python metaflow_parameter.py run --alpha 0.001
元數(shù)據(jù)以 JSON 格式存儲在文件系統(tǒng)中,可以訪問存儲在任何階段的變量數(shù)據(jù),也可以很容易地獲取最后一次成功運行的結(jié)果。
run = Flow(flow_name).latest_successful_run
依賴管理?Metaflow 還提供了依賴管理機制,可以在圖階段或節(jié)點階段通過裝飾器來指定,并且可以指定特定的Python版本或特定的包:
from metaflow import FlowSpec, step, conda, conda_base
@conda_base(python='3.6.5')
class FitModelFlow(FlowSpec):
? ?@step
? ?def start(self):
? ? ? ?self.data = load_data()
? ?@conda(libraries={"scikit-learn": "0.19.2"})
? ?@step
? ?def fit(self):
? ? ? ?from sklearn import svm
? ? ? ?self.model = svm.LinearSVC( ... )
# ...
例如可以從命令行運行時指定 conda 環(huán)境標志:
python metaflow_conda.py --environment=conda run
開始使用Metaflow?可以通過pip命令來安裝metaflow: