為了給機器學習流水線 (Machine Learning Pipelines) 提供生產環境的支援,讓更多出色的機器學習模型運用於現實環境,Google 專門建立了 TensorFlow Extended (TFX)。本文介紹了 TensorFlow Extended 和機器學習流水線的相關概念,我們已經把這個平臺分享到開源社群,期待廣大開發者們在生產級 TensorFlow Extended 上構建和部署模型。
Google 之所以建立 TensorFlow Extended 是因為我們有此需求但沒有能夠滿足我們需求的工具。Google 以及 Alphabet 旗下的眾多公司均已在多種產品中大量使用了機器學習 。其實 TensorFlow Extended 並非 Google 建立的第一個機器學習流水線框架。在早期,我們曾做過一些嘗試,TensorFlow Extended 由此發展而來,現已成為 Google 用於大多數 ML 生產解決方案的預設框架。除 Google 之外,TensorFlow Extended 對我們的合作伙伴也產生了深遠影響,其中包括 Twitter、Airbnb 和 PayPal。
機器學習的延伸
剛開始規劃在您的產品中使用 ML 時,您通常要將有關 ML 的所有方面都考慮在內。這包括為監督學習獲取標記好的資料,並確保資料集全面覆蓋所有可能的輸入。此外,還需要在最小化特徵集的維度的同時最大化其預測資訊。
您需要考慮產品的公正性。您還需要考慮到一些特殊情況,尤其是在醫療保健等領域的應用中,您要對罕見但極其重要的情況作出預測(例如疑難雜症)。最後,您需要為資料的生命週期管理制定計劃,這是一個動態的解決方案,隨著新資料的輸入和條件改變,它會不斷演變。
除此之外,您需要意識到該應用將投入至生產環境。這說明您還需要滿足任何生產級應用的全部需求,包括可擴充套件性、一致性、模組化、可測試性和安全性。您現在不僅僅是在訓練模型!就本身而言,這些需求對於任何生產環境的應用部署來說都是挑戰,您不能因為正在進行 ML 而將其忘在腦後。那麼問題來了,如何滿足這些需求,並將您的新模型投入到生產環境?
這正是 TensorFlow Extended 的作用所在。藉助 TensorFlow Extended,您可以為滿足生產應用部署與最佳實踐的眾多需求而建立一條生產級機器學習流水線。TensorFlow Extended 從提取資料開始,然後經過資料驗證、特徵工程、訓練、評估和提供服務。除了 TensorFlow 本身以外,Google 還為 機器學習流水線的每個主要階段(TensorFlow Data Validation、TensorFlow Transform 和 TensorFlow Model Analysis)建立了庫。同樣的,Google 還針對大規模的部署場景構建了框架,包括伺服器叢集 (TensorFlow Serving)、原生移動應用 (TensorFlow Lite) 和 JavaScript 應用 (TensorFlow JS)。TensorFlow Extended 基於這一系列庫構建了的流水線元件,同時您也可以建立自己的元件。
為了將這些元件關聯在一起,Google 基於流水線儲存空間、配置和排程等建立了一些平面。這些平面非常重要,可用於管理並最佳化您的流水線以及在流水線上執行的應用。
在生產環境中部署 ML 時會遇到許多挑戰,Google 不會假裝能解決所有問題。這將是 ML 社群中一個不斷髮展的領域,我們歡迎各位建言獻策。本文將簡要介紹在生產環境中運用機器學習時會遇到的挑戰。
什麼是 “流水線” 和 “元件”?
TensorFlow Extended 流水線由一系列元件構成,每個元件執行一項不同的任務。元件排列成有向無環圖 (DAG)。那元件又是什麼?
一個 TensorFlow ExtendedTensorFlow ExtendedTensorFlow Extended 元件主要包含三個部分:Driver、Executor 和 Publisher。其中 Driver 和 Publisher 主要是模板程式碼,您可以修改模板程式碼,但一般不需要這麼做。實際上,Executor 才是您插入程式碼並制定操作的地方。
Driver 會檢查元件的狀態並決定需要完成的工作,同時協調作業執行步驟並將元資料返回給 Executor。Publisher 會獲取 Executor 的執行結果並更新儲存的元資料,而 Executor 才是每個元件實際工作的地方。
首先,您需要使用 Python 來生成 TensorFlow Extended 的配置檔案,這些配置檔案將用於 TensorFlow Extended 的元件中。接下來,您需要為元件提供一些輸入資料以及一個存放結果的地方(也就是元資料儲存的地方)。稍後我們會詳細介紹元資料儲存,現在只需瞭解到大多陣列件輸入的元資料來自元資料儲存,並且會將生成的結果元資料寫回到元資料儲存中。
因此,當資料在流水線中移動時,元件會讀取前面的元件生成的元資料,並將結果元資料寫入流水線中以供後面的元件使用。大多數情況下,資料會以這種方式在 TensorFlow Extended 流水線中流動,但也有一些例外情況,比如在流水線的開始和結束的位置。
TensorFlow Extended 流水線的排程
為確保所有元件井然有序,同時便於管理好流水線,需要使用到排程器 (Orchestrator) 。什麼是 排程器 ?它有什麼用處?
排程器是用來整合機器學習流水線、定義流水線中元件的序列並管理其執行。它提供了一個管理介面,可以用來觸發任務並監控元件。
如果您僅需啟動流水線的下一階段,使用任務感知架構即可。當前一個元件完成任務後,就會立即自動啟動下一個元件。任務和資料感知架構的功能非常強大,幾乎是所有生產系統的標配,因為它可以儲存每個元件在多次執行中產生的所有 Artifact 。獲得該元資料後,可以建立更加強大的流水線,並完成許多本來很困難的任務,因此 TensorFlow Extended 實現了任務和資料感知流水線架構。
TensorFlow Extended 的開放性與可擴充套件性也體現在了排程器上。除了 TensorFlow Extended 本身的 Orchestrator 之外,Google 為 Apache Airflow 和 Kubeflow 也提供支援,您也可以根據自身需要透過編寫程式碼來使用自定義的 Orchestrator。如果您已經有自己喜歡的其他工作流引擎,可以構建一個 Runner 與 TensorFlow Extended 配合使用。
元資料儲存的意義
TensorFlow Extended 使用 ML - Metadata (MLMD) 來實現元資料儲存,這是一個用於定義、儲存和查詢 機器學習流水線的元資料的開源庫。MLMD 會將元資料儲存在所關聯的後端。目前的版本支援 SQLite 和 MySQL。您也可以透過編寫程式碼來擴充套件 ML - Metadata 以適配絕大多數相容 SQL 的資料庫。這裡有個問題,元資料中儲存的究竟是什麼?
首先,它會儲存與已訓練模型相關的資訊、訓練模型時使用的資料及其評估結果。我們將這類元資料稱為 “Artifact”,Artifact 具有屬性。資料本身儲存在資料庫之外,但資料的屬性和位置會在元資料儲存中儲存。
接下來,我們會在每一個元件的每一次執行時儲存它的執行記錄。在機器學習流水線的漫長生命週期中,由於新資料的輸入或條件的改變,機器學習流水線通常會頻繁執行,儲存歷史記錄對於除錯、效果復現和稽核十分重要。
最後,我們還會儲存資料物件在流水線中的起源。這樣,您就可以在流水線中向前或向後追蹤,以瞭解在資料和程式碼發生變化時元件的執行結果又是如何變化的。這個功能對於最佳化或除錯流水線非常重要,否則工作會變得非常困難。
元資料驅動的功能
現在,您已對元資料倉庫中儲存的內容有了一定的瞭解,下面介紹其中的部分功能。
首先,在掌握了所有資料的來源之後,您可以藉此在流水線中向前或向後進行追蹤。例如,檢視訓練模型所使用的資料、新的特徵工程對評估指標所產生的影響。在一些案例中,“能夠追蹤資料的來源和結果” 甚至是當地規章或法律要求。
請謹記,上述方法不僅僅適用當前某一時刻的模型和結果。在吸納新資料並重新訓練模型時,您可能還想知道資料和結果在一段時間內的變化。這往往需要與昨天或上週的模型執行情況做對比,以瞭解結果到底是變好還是變壞,以及原因是什麼。生產解決方案可不是一次性用品,根據您的需求會一直存在,可能是幾個月,也可能是幾年。
您還可以在必要時重新執行元件來提升流水線的效率,然後使用熱啟動來繼續訓練。注意,實際情況下經常需要處理大型資料集的,而這些資料集可能需要數小時或數天才能執行完畢。比如說您已經對模型進行了一整天的訓練,並且後續還有訓練要繼續,這時您可以從上次離開的位置繼續,而不必從頭開始。只要在元資料中儲存了模型的相關資訊,實現這一切就會變得非常容易。
當輸入的資料或程式碼發生改變時,您可以透過重新執行元件來提升效率。無需重新執行元件,只需從快取中提取之前的結果即可。例如,如果重新執行只是改變了 Trainer 的引數,那麼流水線依然可以重用 Artifact 的預處理資料,比如詞彙表。此功能可以節省大量時間,並解決大量資料導致的資料預處理成本過高的問題。在 TensorFlow Extended 和 MLMD 支援的資料重用功能之外,您會看到一個更簡單的 “執行流水線” 介面,無需手動選擇要執行的元件。這同樣也可以幫助您節省資料處理時間。總之,在元資料中儲存元件的輸入資料和結果將會極大地簡化您的工作。
元件?哪種元件?
我們在前面介紹了排程器 (Orchestrator),下面我們將介紹 TensorFlow Extended 裡面的標準組件。
談到元件就繞不開 Apache Beam
在介紹標準組件之前,我們先要介紹 Apache Beam。要進行大資料分散式處理,特別是面對機器學習這樣的資料密集型計算,需要支援分散式處理的流水線框架,比如 Apache Spark、Apache Flink 或 Google Cloud Dataflow。
而 Apache Beam 是一個統一程式設計模型,在上述的多個執行引擎上通用。大多數的 TensorFlow Extended 元件執行在 Apache Beam 之上。採用 Beam,您可以直接使用現有的分散式處理框架,也可以選擇自己喜歡的框架,而無需強制使用我們提供的框架。避免了切換框架的煩惱。目前,Beam Python 可以在 Flink、Spark 和 Dataflow Runner 執行器上執行,日後會新增更多的 Runner。Beam 中還有一個 Direct Runner,支援在本地系統中(比如自己的膝上型電腦)在開發環境下執行 TensorFlow Extended 流水線。
標準組件
安裝 TensorFlow Extended 時,包含了一套相當完整的標準組件,每一個元件都是針對生產級 機器學習流水線的一個部分而設計的。例如,Transform 元件使用 Apache Beam 來執行特徵工程轉換,如建立詞彙表或執行主成分分析 (PCA)。您可以在 Flink 或 Spark 叢集上執行這些轉換,亦可在使用 Google Cloud 上的 Dataflow 完成此操作。Apache Beam 具有可移植性,您無需更改程式碼,即可在平臺之間來回遷移。
Trainer 元件實際只使用 TensorFlow。還記得滿腦子想的都是訓練模型的情形嗎?這裡的程式碼就是起到這個作用的。請注意,TensorFlow Extended 目前僅支援 tf。estimators。這裡列出了有關相容性的詳細資訊。
有些元件十分簡單。例如,Pusher 元件僅需 Python 即可完成工作。
當您將這些元件整合到一起,並使用排程器進行管理時,您就擁有了一個 TensorFlow Extended 流水線。您可在一端接收資料,在另一端將 SavedModel 推送到一個或多個部署目標中。這些部署目標包括模型儲存區,如 TensorFlow Hub、使用 TensorFlow JS 的 JavaScript 環境、使用 TensorFlow Lite 的原生移動應用、使用 TensorFlow Serving 的應用系統,或上述全部。
下面我們詳細地介紹各個元件。
讀取資料
首先,使用 ExampleGen 提取輸入資料。ExampleGen 是在 Beam 上執行的元件之一。該元件會從各類支援的來源和型別中讀取資料,同時將其劃分為訓練資料與評估資料,並將其格式轉換為 tf。examples。ExampleGen 的配置過程十分簡單,僅需兩行 Python 程式碼。
接著,StatisticsGen 會使用 Beam 對資料進行遍歷(即一個完整的 epoch),併為每個特徵進行描述統計。此時,StatisticsGen 會利用 TensorFlow Data Validation (TFDV) 庫。TFDV 庫支援一些視覺化工具,您可以在 Jupyter Notebook 中執行這些視覺化工具。您便能借此探索和理解自己的資料,並發現可能存在的問題。這是典型的資料處理流程。在訓練模型之前,我們都要完成這個環節。
下一個元件 SchemaGen 也使用 TensorFlow Data Validation 庫。該元件對 StatisticsGen 處理過的統計資料,並嘗試推斷特徵的基本屬性,包括特徵值的資料型別、值的範圍和類別。可以根據需要檢查和調整結構(Schema),例如為值新增您想要的新類別。
接下來,元件 ExampleValidator 會獲取 StatisticsGen 的統計資料和結構(可以是 SchemaGen 直接輸出的結果或使用者調整後的結果),並查詢問題。該元件會查詢不同類別的異常,包括丟失的值或與模式不匹配的值、訓練-應用偏差、資料偏移,並生成異常報告。請謹記,您的流水線一直在接收新資料,因此需要第一時間發現問題。
特徵工程
Transform 是較為複雜的一個元件,需要更多的配置和額外的程式碼。Transform 使用 Beam 完成特徵工程,透過轉換特徵來提高模型的效能。例如,Transform 可以建立詞彙表、對值進行分桶或基於您的輸入執行 PCA。編寫什麼程式碼取決於您為模型和資料集進行什麼特徵工程。
Transform 會對您的資料進行完整的遍歷(即一個完整的 epoch),並輸出兩類結果。比如,要計算一個特徵的中間值或標準差,在這類情況下,所有示例的數字均相同,Transform 就會輸出一個常量。在諸如對值進行標準化的情況下,不同示例的值會有不同的結果,因此 Transform 會輸出 TensorFlow 運算元。
然後,Transform 會輸出包含這些常量和運算元的 TensorFlow 計算圖。該圖為封閉圖,因此其包含使用這些轉換所需的全部資訊,並且會形成模型的輸入階段。這意味著,訓練與應用之間透過使用相同的轉換保持一致,而這可以消除訓練 / 應用偏差。與此相反的情形是:您想把模型從訓練環境移至實際應用環境或應用程式內,並在兩處環境使用相同的特徵工程,您希望出來的效果是相同的,但有時卻發現並非如此。我們將此情況稱為訓練 / 應用偏差,而 Transform 會在您執行模型的任何地方使用完全相同的程式碼,從而消除該偏差。
訓練模型
現在,您終於準備好去訓練模型了,這個環節也是多數人在談到機器學習的時候直接想到的事情。Trainer 會接收 Transform 的轉換圖和資料,以及 SchemaGen 的結構,並使用您的建模程式碼訓練模型。模型訓練和以往別無二致,但在訓練完成時,Trainer 會儲存兩個不同的 SavedModel。一個是 SavedModel,用於部署至生產環境;而另一個為 EvalSavedModel,用於分析模型效能。
您可以為 Trainer 自定義配置,例如步數,以及是否使用 “熱啟動” 方式。您為 Trainer 建立的程式碼為建模程式碼,因此可以根據需要決定它的複雜程度。
如要監控和分析訓練過程,您可以如往常一樣使用 TensorBoard。在此介面下,您可以檢視當前的模型訓練執行情況,或比較多個模型訓練執行的結果。需要注意的是,只有配置了 ML-Metadata 元資料儲存(如上文所述),才能支援這些功能。使用 TensorFlow Extended,您可以很輕鬆地完成此類比較,而這通常具有啟發意義。
尚不滿意?
現在您已訓練完模型,結果如何?Evaluator 元件會接收 Trainer 建立的 EvalSavedModel 和原始輸入資料,並使用 Beam 和 TensorFlow 模型分析庫進行深入研究。這不僅是檢視整個資料集中的頂層結果,而是更深入地研究資料集的各個部分。這很重要,因為在使用模型期間,每位使用者的體驗都取決於其個人資料點。您的模型可能在您的整個資料集上表現優異,但如果在使用者提供的資料點上表現糟糕,則使用者體驗便會很差。我們會在日後的文章中進一步討論此問題。
在瞭解模型的效能後,是否應將該模型投入生產?相較於生產環境內的現有模型,該模型表現更優還是更差?您可能並不想在沒有對比的情況下強推新模型。因此,ModelValidator 元件會使用 Beam 進行這類比較,透過您定義的標準來決定是否將新模型投入生產。
如果 ModelValidator 確定您的新模型已經可以投入生產,則 Pusher 會完成將其部署到目標環境的工作。這些目標可能是 TensorFlow Lite(若正在開發移動應用)、TensorFlow JS(若要部署至 JavaScript 環境)、TensorFlow Serving(若要部署至應用系統)或以上所有環境。
未來目標
本文旨在概述 TensorFlow Extended 和 機器學習流水線的基本知識,並介紹其主要概念。在接下來的文章中,我們將深入探討 TensorFlow Extended,包括討論如何根據所需來擴充套件 TensorFlow Extended。TensorFlow Extended 是開源專案,因此 我們 也鼓勵開源應用和機器學習社群幫助我們改進該專案。您可以瀏覽 TensorFlow Extended 開發者教程,輕鬆開啟入門學習!
如果您想詳細瞭解 TensorFlow 的相關內容,請參閱以下文件。這些文件深入探討了這篇文章中提及的許多主題:
觀看B站上的相關影片
TensorFlow Extended:基於 TF 的生產級機器學習平臺 (KDD 2017)藉助 TensorFlow Extended (TFX) 打造機器學習服務_嗶哩嗶哩 (゜-゜)つロ 乾杯~-bilibiliTFX:基於 TF 的生產級機器學習平臺 (KDD 2017)
TensorFlow
TensorFlow Extended (TFX)
TensorFlow Extended 開發者教程
聯絡我們
谷歌開發者官方現已開通知乎專欄:TensorFlow 學習資源站,一站式收錄來自官方的 TensorFlow 相關實用技術資源,歡迎關注,及時收到更新提醒!
想了解更多產品資訊?歡迎關注 TensorFlow 官方微信公眾號(TensorFlow_official)!