02.16 全新“機器學習”生命週期管理(2020)

我大概從2009年開始做機器學習的項目,到目前為止已經做過好幾個項目,一直想做一個小總結,今天正好利用週末這個機會。如果大家喜歡,請留言評論。

機器學習,尤其是深度學習已經成為一種解決複雜問題的技術,例如瞭解自動駕駛汽車或識別新冠肺炎病毒等等。 研究員和機器學習工程師都非常關注學習模型的體系結構和概念。 隨著機器學習模型被用於更多的應用程序和軟件工具中,機器學習也需要像軟件行業在過去十年中經歷的流程標準化一樣進行標準化。我們從一開始自己研發所有的生命週期管理的工具,後來轉到開始大規模使用開源的項目,下面簡單說一下我們全新的生命週期管理,也就是俗稱機器學習流水線。

什麼是機器學習流水線(machine learning pipeline)?

在過去的幾年中,機器學習領域的發展令人驚訝。(我記得09年時候,基本上都是自研算法框架等等) 隨著圖形處理單元(GPU)的廣泛可用性以及諸如Transformers(例如Bert)或Generative Adversarial Networks(例如DCGAN)等新的深度學習概念的發展,人工智能項目的數量猛增。 人工智能初創公司的數量眾多,企業正在將最新的機器學習概念應用於具體的業務問題。 在急於尋求性能最高的機器學習解決方案的過程中,我們觀察到數據科學家和機器學習工程師缺少用於加速,重用,管理和部署其開發的概念和工具的良好信息資源。 需要的是機器學習流程的標準化。

機器學習流水線是加速,重用,管理和部署機器學習模型的過程。大約十年前,隨著持續集成(CI)和持續部署(CD)的推出,軟件工程經歷了相同的變化。過去,測試和部署Web應用程序是一個漫長的過程。如今,通過一些工具和理念已大大簡化了這些過程。雖然Web應用程序的部署需要DevOps工程師與軟件開發人員之間的協作,但如今,可以在幾分鐘內可靠地測試和部署Web應用程序。在工作流方面,數據科學家和機器學習工程師可以從軟件工程學到很多東西。根據我的個人經驗,大多數機器學習項目都沒有一個龐大的團隊來承擔這些任務,包括部署模型。這使得很難從頭開始構建整個一個流水線系統。隨著時間的推移性能會下降,當基礎數據發生更改時,數據工程師會花費大量時間來修復錯誤和部署升級等等。

機器學習流水線從收集新的訓練數據開始,在收到有關您的新訓練模型的反饋時結束。 此反饋可以是生產性能指標,也可以是產品用戶的反饋。 該管道包括多個步驟,包括數據預處理,模型訓練和模型分析以及模型的部署。 您可以想象手動完成這些步驟很麻煩並且很容易出錯。


全新“機器學習”生命週期管理(2020)

機器學習流水線


從上圖中可以看到,流水線實際上是一個循環。 可以連續收集數據,因此可以持續的更新機器學習模型。 更多數據通常意味著模型的不停的改進,自動化才是關鍵。 在實際的應用中,我們希望經常重新訓練模型。 如果這是手動的過程,則需要手動驗證新的訓練數據或分析更新的模型,那麼數據科學家或機器學習工程師將沒有時間為其他的業務問題開發新模型。

通常模型生命週期包括:

數據版本控制

數據版本控制是模型生命週期的開始。 當一個新的週期開始時,例如,當有新的訓練數據可用時,該數據的快照將受到版本控制,然後開始一個新的週期。 此步驟與軟件工程中的版本控制類似,只不過我們不commit軟件代碼,而是commit模型訓練和數據。

數據驗證

在訓練新的模型版本之前,我們需要驗證新數據。數據驗證的重點是檢查新數據的統計信息,並在發現任何異常時提醒數據科學家。例如,如果您正在訓練一個二元分類模型,那麼您的訓練數據可能包含50%的A類樣本和50%的B類樣本。如果這些類別之間的劃分發生變化,則數據驗證工具會發出警報,其中新收集的數據可能會在兩個類別之間以70/30的比率進行劃分。如果使用這樣的偏差訓練集來訓練模型,而數據科學家沒有調整模型的損失函數,或者樣本A或B樣本過高/不足,則模型將偏向主導類別。通用數據驗證工具將還可以比較不同的數據集。假設您有一個帶有顯性標籤的數據集,並將該數據集拆分為訓練和驗證集,則需要確保兩個數據集之間的標籤拆分大致相同。數據驗證工具可讓您比較數據集並突出顯示異常。如果驗證之後顯示出不尋常的內容,則可以在此處停止整個流水線並向數據科學家發出警報。如果檢測到數據偏移,則數據科學家或機器學習工程師可以更改單個標籤樣本的採樣(例如,僅選擇相同數量的標籤樣本),或者更改模型的損失函數並啟動新模型建立管道並重新啟動生命週期。

數據預處理

您極有可能無法使用新收集的數據來直接訓練您的機器學習模型。在幾乎所有情況下,您都需要預處理數據然後將其用於訓練運行。標籤通常需要轉換為one-hot或multi-hot向量。模型輸入也是如此。如果從文本數據訓練模型,則要將文本的字符轉換為索引,或者將文本標記轉換為單詞向量。由於僅在模型訓練之前才需要進行預處理,而不是在每個訓練時期都需要進行預處理,因此在訓練模型之前在其自身的生命週期步驟中進行預處理是最有意義的。已經開發了多種工具來有效地處理數據並快速。可能的解決方案列表是無止境的,範圍從簡單的Python腳本到詳盡的圖形模型。儘管大多數數據科學家都將重點放在首選工具的處理能力上,但也可以將預處理步驟的修改鏈接到處理後的數據上,反之亦然,這一點也很重要。這意味著,如果有人修改了處理步驟(例如,在one-hot向量轉換中允許添加其他標籤),則先前的訓練數據將變為無效並強制更新整個流水線。

模型訓練與調優

模型訓練步驟是機器學習流程的核心。在這一步中,我們訓練模型以獲取輸入並預測可能的最低誤差的輸出。對於較大的模型,尤其是對於大型訓練集,此步驟可能很快變得難以管理。由於內存通常是我們計算的有限資源,因此模型訓練的有效分配至關重要。

最近,模型調優引起了很多關注,因為它可以顯著提高性能並提高競爭優勢。在模型訓練的較早步驟中,我們假設我們將進行一次訓練。但是,如何僅一次運行就可以找到最佳的模型架構或超參數呢?不可能!這就是需要模型調優的地方。藉助當今的DevOps工具,我們可以輕鬆地複製機器模型及其訓練設置。這使我們有機會並行或按順序測試大量模型(取決於優化方法),並且能根據不同的配置測試模型。

在模型調優步驟中,訓練具有不同超參數(例如, 該模型的學習率或網絡層數可以自動化。 調整工具將從參數建議列表中選擇一組參數。 參數值的選擇可以基於網格搜索(在網格搜索中我們可以掃過所有參數的組合),也可以基於更多概率的方法(可以嘗試估計最佳的下一組參數來訓練模型)。 調整工具將設置模型訓練運行,類似於我們在前面的訓練步驟中執行的訓練運行。 該工具將使我們能夠進行更大範圍且完全自動化的機器學習。


模型分析

一旦確定了最合適的模型參數集(可提供最高的準確性或最低的損失),就需要在將模型部署到我們的生產環境之前分析其性能。驗證用於偏差的生產模型至關重要。在這些步驟中,我們將根據看不見的分析數據集來驗證模型,該數據集不應該是先前使用的訓練和驗證集的子集。在模型分析過程中,我們將模型暴露給分析數據集的小變化,並評估模型的預測對小變化的敏感程度。同時,分析工具會測量模型是否主要預測數據集子集部分的一個標籤。支持適當的模型分析的一個關鍵原因是,在訓練模型時,可能會對驗證過程中丟失的數據部分造成偏見。在訓練過程中,針對驗證集的模型準確性通常被計算為整個數據集的平均值,這將很難發現偏差。

模型驗證和版本控制

模型版本控制和驗證步驟的目的是跟蹤已選擇哪個模型,超參數集和數據集作為該模型的下一個版本。

模型部署

訓練,調整和分析模型後,就可以開始準備了。不幸的是,一次性部署了太多的模型,使得更新模型變得很困難。一些模型服務器在最近幾年已經開源,可以有效地進行部署。現代模型服務器使您無需編寫Web應用程序代碼即可部署模型。通常,它們為您提供多個API接口,例如REST或遠程過程調用(RPC)協議,並允許您同時託管同一模型的多個版本。同時託管多個版本將允許您在模型上運行A / B測試,並提供有關模型改進的有價值的反饋。模型服務器還允許您在不重新部署應用程序的情況下更新模型版本,從而減少了應用程序的停機時間和減少應用程序開發和機器學習團隊之間的溝通。

模型反饋

機器學習生命週期的最後一步通常被遺忘,但這對數據科學項目的成功至關重要。 我們需要閉環並評估新部署的模型的有效性和性能。在此步驟中,我們可以捕獲有關模型性能的有價值的信息,並捕獲新的訓練數據以增加我們的數據集以更新模型並創建新版本模型。通過捕獲數據,我們可以完善整個機器學習生命週期。


機器學習流水線與AI 需求層次

全新“機器學習”生命週期管理(2020)

AI 需求層次

幾年前,前Jawbone數據副總裁及LinkedIn數據科學家Monica Rogati對此提出了各個組織應用AI的需求層次論,如上圖。整個機器學習的流水線包含了在AI需求層次中。但是在實際的機器學習項目,尤其的早期的項目,我們都會把大部分的精力都放在上面三層,下面三層很少涉及到。下面簡化一下機器學習的流程(如下圖所示),用Airflow實現簡單的流程,

全新“機器學習”生命週期管理(2020)

簡化之後的機器學習的流程


用Apache Airflow 機器學習流水線

Apache Airflow是一個流行的平臺,可以使用Python創建,安排和監視機器學習流水線。 它在Github上的星標超過15K(https://github.com/apache/airflow),並且被Yahoo,Twitter,Airbnb和Spotify等公司的工程師使用。


全新“機器學習”生命週期管理(2020)

airflow UI


常見有兩種方式運行Airflow的 worker nodes,

  1. Celery Executor

Celery Executor需要設置Redis或RabbitMQ才能將消息分發給worker nodes。 然後,Airflow將任務分配給可以在一臺或多臺計算機上運行的Celery workers。如下圖所示,

全新“機器學習”生命週期管理(2020)

Celery Executor

2.Airflow 和K8s

這個想法是利用K8s node pools,每個池將提供一種機器類型(高內存,高CPU,GPU…)和一組啟用了彈性的作用域。 然後,我們可以使用KubernetesPodOperator在airflow的不同node pool中提交ML作業,如下圖所示。


全新“機器學習”生命週期管理(2020)

KubernetesPodOperator 和airflow

使用node pool在Kubernetes中運行我們的ML任務具有以下優點:

  • 無需手動管理實例的創建和銷燬:如果池上沒有運行的Pod,它將自動降級為零,並且如果需要更多的資源,則會創建更多的節點。
  • 可以共享計算資源。 例如,我們可以在一個節點上運行一個Pod以完成訓練任務。 如果節點有足夠的資源,則可以在其上安排另一個pod(很可能是輕量級作業),從而避免了創建另一個實例的額外成本(時間和金錢)。
  • 可以在集群中的所有Pod之間共享服務。 例如,我們可以設置一個Datadog代理服務來收集我們不同ML作業的各類基礎數據。

機器學習流水線的業務場景

自動化機器學習流水線的實現將給數據科學團隊帶來兩個影響:

  • 加快新模型的開發,節省時間,
  • 更新現有模型的過程更加簡單,方便,

這兩個方面都將大大降低機器學習項目的成本。此外,自動化機器學習流水線將有助於檢測數據集或訓練模型中的潛在偏差。發現偏差可以防止傷害與模型互動的人,例如,亞馬遜的機器學習型簡歷篩選器被發現對女性有偏見,如果出現關於通用數據保護條例(GDPR)合規性的問題,可以追蹤到模型發佈管理創建的記錄。模型更新的自動化將給數據科學家節省大量時間,提高他們的工作滿意度。


分享到:


相關文章: