給ML Engineer的MLOps簡述: 持續開發機器學習Service的高效理念

給ML Engineer的MLOps簡述: 持續開發機器學習Service的高效理念

大部分人學習machine learning或deep learning時,目標通常是訓練一個強大的模型,以完成一些困難的任務,比如說物件偵測 (object detection)。然而實際開發落地的ML服務 (services) 時,除了模型本身,如何維持敏捷且可靠的開發流程是一個重要的議題。於是,有了MLOps。

MLOps是近年才出現的名詞,比起說是技術,MLOps更傾向是概念或文化。簡單地說就是將應用於多數軟體開發的DevOps觀念,延伸到ML系統,除了追求將驗證程式碼的continuous integration (CI)與continuous delivery (CD)延伸到驗證資料、模型、甚至硬體系統外,更衍生了持續產生模型的continuous training (CT)

MLOps可以完善並穩定ML系統的開發流程 (資料來源)

Tip

文章難度:★★☆☆☆

閱讀建議: 本篇文章以 ML service與 ML engineer的角度出發,提供概念式的 MLOps介紹。文章從基礎的 DevOps與 ML system開始,逐步連接兩者之間的關聯,最終介紹到帶有完整的 MLOps的 automatic ML pipeline與service。

推薦背景知識: Machine Learning, DevOps (Development & Operations), continuous integration (CI), continuous delivery (CD), software-as-service (SaS).

MLOps與DevOps

「等等,先別說 MLOps,我連 DevOps都不熟啊!」

對於不少以研究先進ML技術為主力的ML工程師,這可能會是一個很直覺的反應。所以就先從粗淺的DevOps開始認識,再將其與machine learning的流程連接吧!

首先,DevOps並不單指某種技術或是職位,而是一種精神或者說文化。最簡單的解釋就是加強development 、operation (與QA) 的合作,使產品更新週期更快捷與可靠

DevOps是跨團隊合作的文化 (資料來源)

以購物網站的推薦系統為例, development提供功能性需求 (推薦系統的模型), operation則是要提供驅動的非功能性需求 (比如說 Docker搭配 Kubernetes的部屬環境), QA則是去測試這個系統會不會 crash、功能是否正確。

傳統上,這三方的運作是階段式的交付,比如說Dev team完成功能後交給Ops team部屬服務,部屬完成後QA team進行測試。這聽起來非常的合理,但實際上在許多企業中,跨team的溝通是非常的麻煩。明明是緊密相連,甚至坐在隔壁的團隊,遇到問題時卻可能需要層層回報到高層,再由高層安排任務到隔壁的團隊。這樣的模式拖慢了服務開發的速度。

DevOps是推廣 Dev與 Ops team緊密合作的文化。

為了讓Dev與Ops team可以合作愉快,因此通常會引入許多自動化的流程,讓團隊間的溝通更有效率並且透明。常見的方法包含:

  • CI (continuous integration) / CD (continuous delivery): 讓每次團隊更新程式碼的整合、測試與部屬到服務的過程自動化。
  • Configuration management: 所有流程的運行都應該可以從外部藉由調整參數改變,而不需要去改動到程式碼本身。
  • Continuous monitoring: 每個流程都要盡量詳盡的將執行的過程做好logging。
  • 其他: Infrastructure as Code (IaS)、Microservices等等。
常見的DevOps tools (資料來源)

總而言之,DevOps的結果就是Dev team不再只管功能性的development,Ops team也不只在意非功能性的infrastucture,兩邊的成員都可以看到對方那邊發生了什麼事情,一定程度的互相優化工作流程。

許多企業的ML產品流程可以簡單地分階段如下:

  1. 準備訓練(與驗證)資料:包含資料蒐集、清理、分析,最終將資料抽取、轉換 (ETL) 成ML training code的輸入格式 (通常是HDF、MLDB、TFRecord之類IO快速的格式)。
  2. 訓練模型:主要的ML training code,包含model design、training algorithm、data augmentation等等,最終輸出為訓練好的網路與參數。
  3. 評估模型:評估模型的performance與在目標環境的相容性與運行速度 (latency),若評估合格就會輸出這個model。
  4. 服務 (serving) :在目標環境下提供實際的ML服務REST API型態的服務。
最陽春的ML與Ops team合作的流程 (資料來源)

在一般的情況,ML team負責前述1–3的工作,而Ops team負責提供實際的服務。最陽春的情況就是,ML team不斷調整各個ML環節,以交付足夠好的model給Ops team,在這個情況下,兩個團隊pipeline銜接點在於model的交付。

事實上,這流程其實沒什麼問題,ML team與Ops team確實可以合作並提供ML service,可以姑且稱為MLOps的雛型。

ML Pipeline Automation

ML與Ops team透過model交付合作的情況雖然可以正常運作,不過存在許多效率與溝通上的問題,在實務上最常見的情況之一是團隊會花費許多時間在相似的工作上,比如說當dataset更新時,需要由ML team花時間重新執行資料驗證、處理,模型訓練與驗證等,除了讓更新週期變得更久外,也壓縮了ML team研究更先進演算法的時間。

就像 DevOps文化介入前存在的狀況一樣, ML與 Ops team之間可以享有更好的合作模式。

解決這個問題的方法之一是將原本ML team的pipeline建立成一套可自動化的程式,並且交付這套pipeline。Ops team並不直接跟ML team取得model,而是藉由這套automatic pipeline取得新的model

參考下圖的流程圖,在圖片的上半部,ML team將心思花在ML相關實驗,並交付pipeline。在圖片的下半部,是一套自動化,可以重複生產model的production pipeline,一旦有新的情況觸發 (比如說dataset更新),就會執行ML team交付的ML training pipeline,產生新的model。

MLOps的一部分: Pipeline automation (資料來源)

交付的是「可以追溯並調整的 pipeline」,而不是「只有 model」。

這樣的流程實現了模型的持續訓練 (continuous training) 與持續部屬 (continuous delivery),讓整個團隊提供的serving面對問題可以更快速的更新,ML team也會有更多的時間鑽研資料特徵與模型的訓練。

前述的pipeline其實還有一個可以改進之處。在ML team交付training pipeline的時候其實可以進一步地導入CI/CD,讓pipeline的交付也變得更可靠。在training pipeline導入CI/CD後,一個很自動化、高效率的ML專案終於成形。

在pipeline automation上進一步加上pipeline CI/CD (資料來源)

與DevOps的結果相似,導入MLOps讓ML team不再只管ML model的訓練,Ops team也不只在意非功能性的infrastucture,兩邊的成員都一定程度地理解對方的工作內容,也共同承擔了某些環節的責任,並共同優化流程。

什麼時候需要MLOps

講了這麼多,做ML的人到底需不需要MLOps?

對於一個新的ML專案,我個人的建議是:

  • 如果工作環境已經有MLOps的基礎建設與文化,那麼遵從MLOps開發這個新的專案可以省去很多麻煩。
  • 如果工作環境沒有MLOps的基礎建設與文化,那麼先證明ML service的功能性才是首要任務。比如說想要建立臉部辨識打卡系統,要先做出可以在device上運行、足夠準確率的ML模型與服務。

對於一個已有成效的ML專案,我個人的建議是:

  • 如果人力與運算資源稀少,並且任務的ML模型與資料不需要頻繁更新 (可能一年只更新2–3次),那麼不需要刻意將人力安排到MLOps。
  • 其他情況,強烈建議開發MLOps。

事實上對於很多人來說MLOps或是DevOps的存在看似可有可無,畢竟做得好、或做得不好乍看不會直接反映在最終功能性的服務。對於ML工程師來說,導入MLOps除了可以減少將時間花在重複的工作上外,最大優勢在於將一個已經存在的服務,有效率並且可靠地變得越來越好。畢竟作為團隊的一員,ML工程師不應該只是一味地追求模型的強大。

模型不是 machine learning系統的終點,服務才是。

MLOps對於提供持續服務的ML專案有顯著的幫助,就像DevOps這十多年來對於software development的顯著影響。可以預見地,接下來的幾年MLOps會越來越流行,單獨精通MLOps就可以在團隊中有不可取代的地位。

這篇文章概念式地介紹了MLOps,至於如何實行的細節就不一次介紹了,下一篇文章預計會介紹一些實行MLOps可能會應用到的技術,包含資料管理 (data lake, data warehouse, ETL (Extract-Transform-Load)) 與workflow management (知名如airflow, Luigi, MLFlow, Prefect等等) 的概念。

老話一句,我的觀點可能也會存在瑕疵,若有發現什麼錯誤或值得討論的地方,歡迎回覆文章或來信一起討論 :)

Supplementary

ML service穩定且有效的pipeline如下圖,依序為:

  1. ML team研究ML方法,並交付包含資料處理、模型訓練的pipeline。
  2. 經由pipeline CI整合為package。
  3. 經由pipeline CD交付為自動化的production pipeline。
  4. 對於任何新的trigger (比如說new data),production pipeline進行CT,產生新的模型。
  5. 經由model CD,將新的模型部屬到ML service上。
High-level的MLOps理想流程 (資料來源)

Reference

  1. MLOps: Continuous delivery and automation pipelines in machine learning[Blog in Google Cload]
  2. DevOps 介紹:建立 DevOps 文化,消除開發、營運、品保斷層 Blog in[CakeReseme]
  3. What is DevOps?[Microsoft Azure]
  4. What is MLOPs?[Blog in Nvidia]
comments powered by Disqus