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