作者 | 彼爾·保羅·伊波利托(Pier Paolo Ippolito),數據科學家
譯者 | 盧鑫旺
審校 | 梁策 孫淑娟
介紹
設計模式是針對常見通用問題的一整套最佳實踐和可重用解決方案。在數據科學和軟件開發、建筑設計等學科中,有大量問題重復出現,因此,嘗試對最常見的問題進行分類,并提供不同形式的計劃藍圖,以便輕松識別和解決這些問題,為更多人群帶來巨大的好處。
在軟件開發中使用設計模式,這一想法首先由埃里克·加馬(Erich Gamma)等人在《設計模式:可重用面向對象軟件要素》(Design Patterns: Elements of Reusable Object-Oriented Software)[1]中提出。此外,根據薩拉·羅賓森(Sara Robinson)等人的《機器學習設計模式》(Machine Learning Design Patterns)[2]一文,設計模式也得以應用到了機器學習過程。
在本文中,我們將探討組成MLOps的不同設計模式。MLOps (Machine Learning -> Operations,即機器學習->運營)是一整套流程,旨在將實驗性的機器學習模型轉換為可在現實世界中做決策的生產性服務。其核心是,MLOps與DevOps基于相同原則,但還額外關注數據驗證和持續訓練/評估(圖1)。
圖1:DevOps和MLOps(圖片來自作者)
MLOps的一些主要好處:
- 上市時間縮短(部署更快)
- 模型穩健性增強(識別數據漂移、重新訓練模型等更便捷)
- 訓練/比較不同ML模型更靈活
另一方面,DevOps強調軟件開發的兩個關鍵概念:持續集成(CI)和持續交付(CD)。持續集成的重點是使用一個中心庫作為團隊在項目中協作的一種方式,并且在不同團隊成員添加新代碼時,盡可能自動化添加、測試和驗證新代碼。通過這種方式,人們可以在任何時候測試應用程序的不同部分是否能夠正確地相互通信,并對任何形式的錯誤快速識別。持續交付則側重于平穩地更新軟件部署,盡量避免任何形式的宕機。
MLOps設計模式
工作流管道
機器學習(ML)項目由許多不同步驟構建(圖2):
圖2:ML項目關鍵步驟(圖片來自作者)
在對一個新模型進行原型設計時,通常使用單個腳本(單片)來編寫整個過程,但隨著項目愈發復雜,團隊參與成員增多,這時就有必要將項目的每個不同步驟劃分為一個單獨的腳本(微服務)。因此,采取這種方法可能會帶來一些好處:
- 更容易對不同步驟的編排進行更改試驗
- 根據定義使項目具有可擴展性(可以輕松添加和刪除新步驟)
- 每個團隊成員都可以專注于流程中的不同步驟
- 每個不同的步驟都可以獲得分散的模型產出
工作流管道設計模式,旨在定義一個計劃藍圖來創建ML管道。ML管道可以用一個有向無環圖(DAG)表示,其中每一步都由一個容器來體現(圖3)。
圖3:有向無環圖(DAG)示例(圖片來自作者)
遵循這種結構,就有可能創建可重用和可管理的ML過程。使用工作流管道的一些好處是:
- 通過在流程中添加和刪除步驟,可以創建復雜的實驗來測試不同的預處理技術、機器學習模型和超參數
- 單獨保存每個不同步驟的輸出。如果在最后步驟中應用了任何更改,可避免在管道開始時重新運行步驟(從而節省時間和算力)
- 在出現錯誤的情況下,可以很容易地確定哪些步驟需要更新修改
- 一旦使用CI/CD部署到生產環境中,就可根據不同的因素(如時間間隔、外部觸發器、ML指標變化等)調度管道重新運行
特征平臺
特征平臺是一個為機器學習過程設計的數據管理層(圖4)。這個設計模式的主要用途是簡化組織管理和使用機器學習特征的方式。這通過創建某種形式的中心庫來實現,該中心庫用來存儲公司曾經為構建ML流程創建的所有特征。通過這種方式,如果數據科學家需要為不同的ML項目提供相同的特征子集,他們就無需多次把原始數據轉換為處理過的特征,因為這可能更費時間。最常見的兩種開源特征平臺解決方案是Feast和Hopsworks。
圖4:特征平臺設計模式(圖片來自作者)
了解更多關于特征平臺的信息可以查閱 (https://towardsdatascience.com/getting-started-with-feature-stores-121006ee81c9)
轉換
轉換(Transform)設計模式旨在通過將輸入、特征和轉換保持為單獨的實體,使機器學習模型在生產中更易于部署和維護(圖5)。事實上,原始數據通常需要經過不同的預處理步驟,然后才能用作機器學習模型的輸入,其中一些轉換需要保存,以便在預處理推理所用數據時重用。
圖5:輸入和特征之間的關系(圖片來自作者)
例如,在訓練ML模型之前,為了處理離群值并使數據看起來更像高斯分布,通常將歸一化/標準化技術應用于數值數據。這些轉換應該保存下來,以便在將來提供新數據進行推斷時重用。而如果不保存這些轉換,那么在訓練和服務之間我們將會產生數據傾斜問題,造成為推理提供的輸入數據與用于訓練ML模型的輸入數據分布不同。
為了避免訓練模型和服務之間產生任意類型的數據傾斜,一個可行的解決方案是使用特征平臺設計模式。
多模式輸入
在訓練ML模型時,圖像、文本、數字等不同類型的數據都可使用,不過某些類型的模型只能接受特定類型的輸入數據。例如,Resnet-50只能取圖像作為輸入數據,而其他的ML模型,如KNN (K Nearest Neighbor,K最近鄰)只能夠取數字數據作為輸入。
為了解決ML問題,有必要使用不同形式的輸入數據。在這種情況下,我們需要應用某種形式的轉換,以為所有不同類型輸入數據(多模式輸入設計模式)創建共同表示。舉個例子,假如我們有一個文本、數字和分類數據的組合,為了訓練ML模型,我們可以利用情感分析、詞包或詞嵌入等技術將文本數據轉換為數字格式,并利用獨熱編碼(one-hot-encoding)對分類數據進行轉換。這樣,我們就可以將所有數據以相同的格式(數值)保存下來,以便用于模型訓練。
級聯
在某些場景中,僅用一個ML模型不可能解決問題。在這種情況下,有必要創建一系列相互依賴的ML模型來實現最終目標。舉個例子,假設我們嘗試預測向用戶推薦的物品內容(圖6)。為了解決這個問題,我們首先要創建一個模型,它能夠預測用戶小于還是大于18歲。然后,根據該模型的響應,路由到兩個不同ML推薦引擎中的一個(一個向18歲以上的用戶推薦產品,另一個向18歲以下的用戶推薦產品)。
圖6:級聯設計模式(圖片來自作者)
為了創建這個級聯的ML模型,我們需要確保它們一起訓練。事實上,由于其相互依賴,那么如果第一個模型發生變化(而不更新其他模型),就可能導致后續模型不穩定。我們可以使用工作流管道設計模式(Workflow Pipeline)自動化此類流程。
結論
在本文中,我們探討了支持MLOps的一些最常見的設計模式。如果你有興趣了解更多關于機器學習中的設計模式問題,請參閱瓦力阿帕·拉克沙馬南(Valliappa Lakshmanan) 在AIDVFest20上的演講以及《機器學習設計模式》(Machine Learning Design Patterns)一書的公共GitHub知識庫。
參考文獻
[1] "Design Patterns: Elements of Reusable Object-Oriented Software" (Addison-Wesley,1995): www.uml.org.cn/c%2B%2B/pdf/DesignPatterns.pdf
[2] "Machine Learning Design Patterns" (Sara Robinson et. al., 2020):
??https://www.oreilly.com/library/view/machine-learning-design/9781098115777/??
作者:
彼爾·保羅·伊波利托(Pier Paolo Ippolito) 是一名畢業于南安普頓大學的數據科學家。他持有人工智能碩士學位,對人工智能的發展和機器學習應用(如金融和醫學領域)有著濃厚的興趣。
聯系方式:
如想了解作者最新的文章和項目,可通過以下方式聯絡:
譯者介紹
盧鑫旺,51CTO社區編輯,半路出家的九零后程序員。做過前端頁面,寫過業務接口,搞過爬蟲,研究過JS,有幸接觸Golang,參與微服務架構轉型。目前主寫Java,負責公司可定制化低代碼平臺的數據引擎層設計開發工作。
原文標題:??Design Patterns in Machine Learning for MLOps??,作者:Pier Paolo Ippolito
2022年1月13日發布于Towards Data Science