今天來談談,在機器學習系統開發的過程當中,除了那些已經熟悉的資料科學工具之外,那些可能被忽略的工具:像是資料驗證、資料標籤、模型監測、CI/CD 測試、部署、模型壓縮、推理效能優化、隱私等等,有哪些Python框架可以放進學習清單。文章的後半部也跟大家分享5個部署機器學習系統的迷思。
cs329s機器學習系統設計這堂課是史丹佛2021年1月新開設的一門課,講述除了機器學習理論之外,實務上在設計系統的時候所需要注意的各種主題。文章的內容是看完投影片跟課堂筆記,加上自己之前的開發經驗寫下來的。所有的教材請見官方網站。
假如前兩篇你還沒讀過的話,歡迎先複習:
那些可能被忽略的Python框架
資料驗證:怎麼去測試資料的實用性和正確性?怎麼知道目前的資料採樣對於系統是正面或是負面的影響?舉例來說:在TensorFlow Data Validation就可以透過資料集在不同面向(Facets)的特徵進行多方面比較。像是某個欄位所需的值的範圍,透過檢查這些缺失或者超出範圍的值,使得開發者可以更快的知道資料集的狀況,進而改善資料集的品質以及可用性。
資料和模型的版本控制:怎麼對資料集和訓練過程的checkpoint做版本控制?每一行相互比較的Git,並不能作用在資料集和checkpoint的版本控制上。更不可能單純的把每一次的資料集複製成好幾份。當遇到需要合併(merge)資料集的時候,可以使用哪些工具?舉例來說:DVC。
模型監測:要如何知道資料分布已經偏移了,偏移到需要重新訓練模型。舉例來說:Dessa公司的PM在Data Concil 19分享的一場演講提到,模型監測通常包含三元素:Python SDK + 排程 + 圖像化互動介面。透過這三個元素,透過持續觀察想優化的函式出來的值,以及幾個比較關鍵的統計特徵變化多少,來決定下一步的方向。(該場演講的投影片和演講影片)
標籤資料:如何可以快速的標示新的資料,以及更新既有的資料與標籤給新的模型?舉例來說:Snorkel這個library就提供三個主要的函式,協助開發者從少量的資料,快速的擴充其資料集。像是標示函數(labeling functions)、轉換函數(transformation functiona)跟切片函數(slicing functions)。關於這三個函數的詳細介紹,可以參考官方文件。

CI/CD 測試:如何確認模型在變更之後,其行為符合期待?舉例來說:透過Argo和工作流程以及資料流互動,以達成基於DAG(Directed acyclic graph based)或是基於線性步驟(step based)的工作流程。在持續交付和迭代的過程當中,也支援Gitops、藍綠部署(Blue-Green)和金絲雀部署(Canary)。GitOps透過使用Git當作應用程序的單一事實來源來工作,在git上的程式碼更動時,會引發相對應的部署、維運相關的工作。透過GitOps,Kubernetes協調器會根據情況自動更新或回到前一個版本。其中藍綠部署的目的是減少發佈時的中斷時間,能夠快速撤回發佈。藍綠部署是準備兩套系統,在兩套之間進行切換,金絲雀策略是只有一套系統,逐漸替換這套系統裡面的服務。
部署:如何能夠最無痛的把模型部署完成?舉例來說:OctoML,使用的Apache TVM,特別專注在編譯來自不同深度學習框架的模型成最小的可部署模組,方便部署到各種不同的硬體端上。基於Apache TVM的框架上,OctoML則強調能夠簡單、快速地透過網頁UI或是API部署與地端、雲端或者edge端的硬體整合、且這些優化是基於分析這個模型將使用多少的記憶體和FLOPs的數據為基礎去做出的分析。以及Coral SOM(System-on-Module),針對在邊緣裝置優化的系統。
模型壓縮:如何將模型壓縮到某些檔案大小之下,以便於部署在特定的環境?舉例來說:像是NNI和distiller。還有一間Xnor.ai, 專注於做模型壓縮,已被蘋果用約200M美金買下。
推理效能優化:如何能夠加速模型推理、預測的時間?我們可以使用較低的精度嗎?縮小模型可能會加快推理速度嗎?舉例來說:TensorRT,一個用C++開發,針對在NVIDIA GPUs上的高效能推理框架。
隱私:如何在訓練模型的過程,仍然保持用戶的隱私?如何使資料處理的過程當中仍符合GDPR的規範?看看PySyft,出自資料安全和私有深度學習的Python框架。 PySyft使用聯合學習,差分隱私(Differential Privacy)和加密計算(Encrypted Computation)將模型訓練中的私人數據分離。想針對這部份瞭解更多的,也可以來上這一堂由Facebook在udacity開的課:Secure and Private AI。

5個部署機器學習系統的迷思
迷思 #1. 部署是一個艱難的任務
如同我們在前面1-2所提到的,研究型的機器學習與業界的機器學習在實務上有哪些不同。這些不同之處,也是許多資料科學家從學術到業界,必須要克服的門檻。取決於他們加入的公司類型以及團隊的分工型態,在開發程式的職能上,這些資料科學家也必須要從過去專注在模型開發上,走到部署、產品化的技能學習。
因此,許多資料科學家所擔心的,便是怎麼樣部署模型。
事實上部署是一件不難的任務,並不是如你想像的這麼可怕。如果目標只是希望把一個模型部署上線,成為雲端服務的一部分。當熟悉這些工具以及平台之後,部署可能只花你不到一小時的時間。如果搭配上自動化,又是更快速的流程了。
但是,部署之後的可靠度這就是困難的了。假設模型上線之後,有數百萬個用戶會去使用它,不管是可靠度、系統回應時間、資源配置等等,這些系統上的監控以及調整,都需要適當的基礎架構當做基底。在臨時出現問題時,能夠及時通知合適的人做相對應的處理,並且在系統訊息上可以快速的查找問題的原因。
在訓練模型上的難度,與模型部署的難度是不同方向也不同程度上的比較。
如果有時間大家也可以看一下這一篇:Challenges in Deploying Machine Learning: a Survey of Case Studies,裡面談到,在部署模型的時候所要考慮的”整合,監控和更新”,以及部署後要照顧的層面還有:倫理、終端用戶的信任問題、安全問題。
迷思 #2. 一次只能部署一個或者兩個模型
在做學術研究的時候,大部分的情形是專注在小型的問題,或是特別特定的情境下所發展出來的模型。許多從學術背景出來的人,對於機器學習應用的想法,大多是支援在一個到兩個模型的情形之下。
然而在業界上,許多公司需要部署非常大量的模型。一個應用程式會有不同的功能,每個功能都有其獨立的模型。假設像是Uber這樣的公司,會需要預測司機需求、司機的可調用性、預計抵達時間、最優化的乘車價格、避免假帳號、避免假交易、推論客戶流失等等。假設這個產品在不同的國家或城市營運,這些不同的市場也會需要不同的模型。假設有20個國家和10個城市,每一種模型可能會需要200個不同的版本。實際上Uber所需要的模型大約是數千個模型。
以下這張圖表來自Netflix在InfoQ的一場演講,談論Human-Centric Machine Learning Infrastructure,這張投影片顯示光是在netflix裡面的深度學習模型種類就有多少種。

迷思 #3. 如果什麼都不做,模型的表現也會一直維持不變
假設機器學習模型不隨著時間更新。該系統所呈現的效能是有機會隨著時間逐漸下降的。這是和一般的軟體系統相比十分不同的部分。
我們在1-2提到概念漂移的困擾,幾個月以前訓練好的模型,經過一陣子之後總是需要去檢查,是否有資料漂移的情形,是以多快的時間偏移等等。而這些數據,也是更新模型以及系統的依據。
迷思 #4. 不需要盡可能的常常更新模型
承襲上一個迷思,可能有些人會提出問題,像是”我應該多久更新一次?“但這個問題應該要調整成”我可以多久更新一次?”第一個問題的口氣比較像是在被動的等待別人給一個答覆。第二個問題比較偏向自己掌握主控權,只要環境允許,數據狀況也允許我就能推出一次更新。
在機器學習的領域,可能每隔幾個月,該問題就會有更新的演算法出現,這些新的算法每一次都提供我們一個更新的刺激去思考是不是有更好的解法。同時在模型的部署上,一個完善的模型部署系統,則是可以讓系統以非常短的時間之內迭代到下一個模型。舉例來說:Etsy每天部署50次,Netflix每天部署1000次,AWS每11.7秒部署一次。以下圖為例,微博的機器學習迭代周期為10分鐘,而且阿里巴巴和ByteDance等公司也是差不多維持在這樣的數據之間。

迷思 #5. 大部分的ML工程師不需要擔心規模以及系統擴展性
“規模”可以從很多層面來說。這一個迷思的破解我們從市場上的公司規模數據來做推論,假設一間大於100個員工規模的公司,其服務的規模也會相對應較大,對應到相對大型的客群。Stack Overflow的統計上,超過一半的公司是屬於100個員工等級以上的規模。也就是說,大部分的人都有機會去思考規模、以及系統擴展性的問題。

*註:這一份報告反映出的雖然只是開發人員的佔比,只是相對呈現市場的概況。若之後有針對ML職位的研究,也可以在這點上面做補充。
迷思 #6: 機器學習會對你的公司展開一夜成功的神奇魔法
當機器學習變成人人口中都談到的一個工具時,媒體也會開始圍繞著機器學習宣傳,能夠拉上邊的就盡可能去沾上邊。一些公司可能會想說ML可以奇蹟般地讓他們在一夜之間改善業務狀況。
是有可能像是魔法般的神奇。但是ㄧ夜之間帶來的業務轉變,則是真的想太多了。
許多公司從機器學習當中的獲益,像是能夠展示更好的搜尋結果、推薦更適切的商品、以更貼近市場的價格售出貨物等等。這些都只是在眾多業務當中能夠推動的一小步進展,實際上的改善還是需要從既有流程去追溯。機器學習的投資回報,取決於導入的成熟階段、模型在市場中運行的狀況越成熟、開發迭代週期越快等等。其中使用產品階段模型超過五年以上的公司當中,幾乎75%的公司可以在30天內部署模型。在剛開始使用機器學習管道的企業中,有60%的企業需要30天以上的時間來部署模型。
不管是推出新測試,或是回溯到前一個測試前的版本等等。這些系統迭代,也必須與商業策略調整一起搭配發生變化,才會對業務狀況發生影響。
結語
今天講了兩個部分:
(1)機器學習系統開發過程當中你可能忽略的工具
(2)5個部署機器學習系統的迷思。
希望當中有讓你學習到一些新知,也歡迎提出問題及想要瞭解更多的部分。