本文是機(jī)器學(xué)習(xí)平臺(tái)系列的第2部分。它由數(shù)字彈射器和 PAPIs支持。
在「機(jī)器學(xué)習(xí)」機(jī)器學(xué)習(xí)(ML)開(kāi)發(fā)平臺(tái)概述 ,我概述了ML開(kāi)發(fā)平臺(tái),它們的工作是幫助創(chuàng)建和打包ML模型。模型構(gòu)建只是ML系統(tǒng)所需的眾多功能中的一項(xiàng)。在這篇文章的最后,我提到了其他類型的ML平臺(tái)以及構(gòu)建現(xiàn)實(shí)世界ML系統(tǒng)時(shí)的限制。在我們能夠討論這些之前,我們需要回顧這些系統(tǒng)的所有組件,以及它們是如何相互連接的。

上面的圖表關(guān)注的是“監(jiān)督學(xué)習(xí)”系統(tǒng)(例如分類和回歸)的客戶機(jī)-服務(wù)器架構(gòu),其中預(yù)測(cè)由客戶機(jī)請(qǐng)求,在服務(wù)器上進(jìn)行。(旁注:在某些系統(tǒng)中,最好有客戶端預(yù)測(cè);其他的甚至可能鼓勵(lì)客戶端模型培訓(xùn),但是在工業(yè)ML應(yīng)用程序中使其高效的工具還不存在。)
ML系統(tǒng)組件的概述
在進(jìn)一步研究之前,我建議下載上面的圖表,并分割屏幕,以便在閱讀本文其余部分的同時(shí)可以看到圖表。
讓我們假設(shè)“數(shù)據(jù)庫(kù)”在創(chuàng)建ML系統(tǒng)之前就已經(jīng)存在了。深灰色和紫色的組件將是新的組件被建立。那些應(yīng)用ML模型進(jìn)行預(yù)測(cè)的用紫色表示。矩形用于表示有望提供微服務(wù)的組件,這些組件通常通過(guò)具象狀態(tài)傳輸(representational state transfer, REST) api訪問(wèn)并在無(wú)服務(wù)器平臺(tái)上運(yùn)行。
ML系統(tǒng)有兩個(gè)“入口點(diǎn)”:請(qǐng)求預(yù)測(cè)的客戶端和創(chuàng)建/更新模型的協(xié)調(diào)器。客戶端代表將從ML系統(tǒng)獲益的最終用戶使用的應(yīng)用程序。這可以是你用來(lái)訂晚餐的智能手機(jī)應(yīng)用程序,例如UberEats請(qǐng)求預(yù)定的交貨時(shí)間——這在COVID-19封鎖期間是一個(gè)大用例!

封鎖前的照片,維基百科提供。有一個(gè)復(fù)雜的ML系統(tǒng)可以預(yù)測(cè)這個(gè)家伙什么時(shí)候到達(dá)他的目的地,每天成千上萬(wàn)次,在世界上數(shù)以百計(jì)的城市!希望這個(gè)系統(tǒng)使用的模型在過(guò)去幾周內(nèi)得到了更新……
協(xié)調(diào)器通常是由調(diào)度程序調(diào)用的程序(以便模型可以定期更新,例如每周更新),或者通過(guò)API調(diào)用(以便它可以成為持續(xù)集成/持續(xù)交付管道的一部分)。它負(fù)責(zé)在一個(gè)保密的測(cè)試數(shù)據(jù)集上評(píng)估模型構(gòu)建器創(chuàng)建的模型。為此,它將測(cè)試預(yù)測(cè)發(fā)送給求值器。如果一個(gè)模型被認(rèn)為足夠好,那么它將被傳遞到模型服務(wù)器,通過(guò)API使其可用。這個(gè)API可以直接公開(kāi)給客戶端軟件,但是通常需要在前端中實(shí)現(xiàn)特定于領(lǐng)域的邏輯。
假設(shè)有一個(gè)或多個(gè)(基線)模型可以作為api使用,但還沒(méi)有集成到最終的應(yīng)用程序中,您將通過(guò)跟蹤生產(chǎn)數(shù)據(jù)的性能并通過(guò)監(jiān)視器可視化來(lái)決定要集成哪個(gè)模型(以及它是否安全)。在我們的晚餐遞送示例中,它將讓您比較一個(gè)模型的ETD與剛剛交付的訂單的實(shí)際交貨時(shí)間。當(dāng)新的模型版本可用時(shí),客戶端對(duì)預(yù)測(cè)的請(qǐng)求將通過(guò)前端逐步定向到新模型的API。這將為越來(lái)越多的終端用戶完成,同時(shí)監(jiān)視性能并檢查新模型是否“破壞”了任何東西。ML系統(tǒng)的所有者和客戶機(jī)應(yīng)用程序的所有者將定期訪問(wèn)監(jiān)視器的儀表板。
讓我們以列表的形式重述一下上圖中的所有組件:
- 事實(shí)(Ground-truth)收集器
- 數(shù)據(jù)貼標(biāo)機(jī)
- 評(píng)估者
- 性能監(jiān)視器
- Featurizer(特征化器)
- 協(xié)調(diào)器
- 模型構(gòu)建器
- 模型服務(wù)器
- 前端
我們已經(jīng)簡(jiǎn)單地提到了第3、4、6、7、8和9條。現(xiàn)在讓我們提供更多的信息,復(fù)習(xí)一下#1、# 2和# 5!
# 1:事實(shí)收集器
在現(xiàn)實(shí)世界中,關(guān)鍵是能夠不斷獲取新的數(shù)據(jù)供機(jī)器學(xué)習(xí)。有一種數(shù)據(jù)特別重要:地面真實(shí)數(shù)據(jù)。這與您希望ML模型預(yù)測(cè)的內(nèi)容相對(duì)應(yīng),例如房地產(chǎn)的銷售價(jià)格、與客戶相關(guān)的事件(例如客戶流失)或分配給輸入對(duì)象的標(biāo)簽(例如傳入消息中的“spam”)。有時(shí)候,你觀察一個(gè)輸入對(duì)象,你只需要等待一段時(shí)間來(lái)觀察你想預(yù)測(cè)的對(duì)象;例如,您等待房產(chǎn)被出售,等待客戶續(xù)訂或取消訂閱,等待用戶與收件箱中的電子郵件交互。您可能希望用戶在ML系統(tǒng)預(yù)測(cè)錯(cuò)誤時(shí)讓您知道(參見(jiàn)下面的插圖)。如果您想讓您的用戶能夠提供這種反饋,您將需要一個(gè)微服務(wù)來(lái)將其發(fā)送到其中。

# 2:數(shù)據(jù)貼標(biāo)機(jī)
有時(shí),您可以訪問(wèn)大量的輸入數(shù)據(jù),但是您需要手動(dòng)創(chuàng)建相關(guān)的ground-truth數(shù)據(jù)。構(gòu)建垃圾郵件檢測(cè)器或從圖像構(gòu)建對(duì)象檢測(cè)器時(shí)就是這樣。有現(xiàn)成的和開(kāi)源的web應(yīng)用來(lái)簡(jiǎn)化數(shù)據(jù)標(biāo)注(如Label Studio),也有專門(mén)的外包手工標(biāo)注數(shù)據(jù)的服務(wù)(如圖8和谷歌的數(shù)據(jù)標(biāo)注服務(wù))。

飛機(jī)分類:標(biāo)簽工作室在行動(dòng)
# 3:評(píng)估者
當(dāng)您有了供機(jī)器學(xué)習(xí)的初始數(shù)據(jù)集時(shí),在開(kāi)始構(gòu)建任何ML模型之前,定義如何評(píng)估計(jì)劃的ML系統(tǒng)是很重要的。除了測(cè)量預(yù)測(cè)精度,還需要通過(guò)特定于應(yīng)用程序的性能指標(biāo)和系統(tǒng)指標(biāo)(如延遲和吞吐量)來(lái)評(píng)估短期和長(zhǎng)期的影響。
模型評(píng)估有兩個(gè)重要的目標(biāo):比較模型,以及決定將模型集成到應(yīng)用程序中是否安全。評(píng)估可以在一組預(yù)先確定的測(cè)試用例上執(zhí)行,因?yàn)樗且阎念A(yù)測(cè)應(yīng)該是什么(即基本事實(shí))。可以檢查錯(cuò)誤分布,并將錯(cuò)誤聚合到性能指標(biāo)中。為此,評(píng)估者需要訪問(wèn)測(cè)試集的ground truth,這樣當(dāng)它在輸入中得到預(yù)測(cè)時(shí),它就可以計(jì)算預(yù)測(cè)錯(cuò)誤并返回性能指標(biāo)。
我建議在構(gòu)建ML模型之前優(yōu)先實(shí)現(xiàn)這個(gè)求值器。評(píng)估基線模型所作的預(yù)測(cè),以提供參考。基線通常是基于輸入特征(也就是特性)的啟發(fā)式方法。它們可以是超級(jí)簡(jiǎn)單的、手工制作的規(guī)則……
- 對(duì)于流失預(yù)測(cè),你的基線可以說(shuō),如果一個(gè)客戶在過(guò)去30天內(nèi)登錄少于3次,他們很可能會(huì)流失;
- 對(duì)于食物送餐時(shí)間的預(yù)測(cè),你的基線可以是上周所點(diǎn)餐餐廳和乘客的平均送餐時(shí)間。
在明天開(kāi)發(fā)復(fù)雜的ML模型之前,看看你的基線今天是否能創(chuàng)造價(jià)值!
# 4: 性能監(jiān)視器
決定是否可以將(基線)模型集成到應(yīng)用程序中的下一步是在生產(chǎn)中遇到的輸入(稱為“生產(chǎn)數(shù)據(jù)”)上使用它,在類似于生產(chǎn)的設(shè)置中,并通過(guò)時(shí)間監(jiān)控它的性能。
計(jì)算和監(jiān)控生產(chǎn)數(shù)據(jù)的性能指標(biāo)需要在數(shù)據(jù)庫(kù)中獲取和存儲(chǔ)生產(chǎn)輸入、基本事實(shí)和預(yù)測(cè)。性能監(jiān)視器將由一個(gè)從數(shù)據(jù)庫(kù)讀取數(shù)據(jù)、調(diào)用評(píng)估器的程序和一個(gè)顯示性能指標(biāo)如何隨時(shí)間發(fā)展的儀表板組成。一般來(lái)說(shuō),我們希望檢查模型是否隨時(shí)間運(yùn)行良好,以及它們是否持續(xù)對(duì)集成它們的應(yīng)用程序產(chǎn)生積極影響。還可以使用顯示生產(chǎn)數(shù)據(jù)分布的數(shù)據(jù)可視化小部件對(duì)監(jiān)視器進(jìn)行增強(qiáng),這樣我們就可以確保它們符合預(yù)期,或者我們可以監(jiān)視漂移和異常情況。

攪和模型的監(jiān)視儀表板(源)
# 5: FEATURIZER(特征化機(jī)器)
在設(shè)計(jì)預(yù)測(cè)API時(shí),需要決定API應(yīng)該采用什么作為輸入。例如,在對(duì)客戶進(jìn)行預(yù)測(cè)時(shí),輸入應(yīng)該是客戶的全部特性表示,還是僅僅是客戶id?
在任何情況下,完整的數(shù)字表示都是很常見(jiàn)的(就像文本或圖像輸入一樣),但是在傳遞給模型之前必須對(duì)其進(jìn)行計(jì)算。對(duì)于客戶輸入,有些特性已經(jīng)存儲(chǔ)在數(shù)據(jù)庫(kù)中(例如,出生日期),而其他特性則需要進(jìn)行計(jì)算。這可能是描述客戶在某段時(shí)間內(nèi)如何與產(chǎn)品交互的行為特性的情況:它們將通過(guò)查詢和聚合記錄客戶與產(chǎn)品交互的數(shù)據(jù)來(lái)計(jì)算。
如果特性本質(zhì)上不經(jīng)常變化,則可以批量計(jì)算它們。但在ML用例中,比如UberEats的預(yù)期交付時(shí)間,我們可能會(huì)有快速變化的“熱點(diǎn)”特性,需要實(shí)時(shí)計(jì)算;例如,某家餐廳在過(guò)去X分鐘內(nèi)的平均送餐時(shí)間。
這需要?jiǎng)?chuàng)建至少一個(gè)特性化微服務(wù),它將根據(jù)輸入的id為一批輸入提取特性。您可能還需要一個(gè)實(shí)時(shí)的特性化微服務(wù),但是這會(huì)增加ML系統(tǒng)的復(fù)雜性。
功能分析器可以查詢各種數(shù)據(jù)庫(kù),并對(duì)查詢的數(shù)據(jù)執(zhí)行各種聚合和處理。它們可能具有參數(shù)(如上面示例中的分鐘數(shù)X),這些參數(shù)可能會(huì)對(duì)模型的性能產(chǎn)生影響。
# 6 協(xié)調(diào)器
工作流
協(xié)調(diào)器位于ML系統(tǒng)的核心,并與許多其他組件交互。下面是它的工作流/管道中的步驟:
- 提取-轉(zhuǎn)換-加載和分割(原始)數(shù)據(jù)到訓(xùn)練,驗(yàn)證,測(cè)試集
- 發(fā)送功能飽和化的培訓(xùn)/驗(yàn)證/測(cè)試集(如果有的話)
- 準(zhǔn)備專用的訓(xùn)練/驗(yàn)證/測(cè)試集
- 將準(zhǔn)備好的訓(xùn)練/驗(yàn)證集的uri以及要優(yōu)化的指標(biāo)發(fā)送到模型構(gòu)建器
- 得到最優(yōu)模型,應(yīng)用于測(cè)試集,并將預(yù)測(cè)發(fā)送給評(píng)估者
- 獲取性能值并決定是否可以將模型推到服務(wù)器(例如,用于對(duì)生產(chǎn)數(shù)據(jù)的卡納塔測(cè)試)。
關(guān)于步驟3(“準(zhǔn)備專用培訓(xùn)/驗(yàn)證/測(cè)試集”)的更多細(xì)節(jié):
- 增強(qiáng)訓(xùn)練數(shù)據(jù)(例如,過(guò)采樣/過(guò)采樣,或旋轉(zhuǎn)/翻轉(zhuǎn)/裁剪圖像)
- 預(yù)處理訓(xùn)練/驗(yàn)證/測(cè)試集,包括數(shù)據(jù)消毒(以便可以安全地用于建模或預(yù)測(cè))和針對(duì)特定問(wèn)題的準(zhǔn)備(例如,圖像去飽和和調(diào)整大小)。
運(yùn)行工作流的方法
整個(gè)工作流可以手動(dòng)執(zhí)行,但是要頻繁地更新模型,或者聯(lián)合調(diào)優(yōu)建模器和建模器的超參數(shù),就必須實(shí)現(xiàn)自動(dòng)化。這個(gè)工作流可以實(shí)現(xiàn)為一個(gè)簡(jiǎn)單的腳本并在單個(gè)線程上運(yùn)行,但是通過(guò)并行運(yùn)行可以提高計(jì)算效率。端到端ML平臺(tái)允許這樣做,并且可以提供一個(gè)環(huán)境來(lái)定義和運(yùn)行完整的ML管道。與谷歌AI平臺(tái),例如,你可以使用谷歌云數(shù)據(jù)產(chǎn)品,如Dataprep (Trifacta爭(zhēng)吵工具提供的數(shù)據(jù)),數(shù)據(jù)流(一個(gè)簡(jiǎn)化的流和批量數(shù)據(jù)處理工具),BigQuery (serverless云數(shù)據(jù)倉(cāng)庫(kù)),您可以定義一個(gè)培訓(xùn)應(yīng)用程序基于TensorFlow或內(nèi)置算法(例如XGBoost)。在處理重要的數(shù)據(jù)量時(shí),Spark是一個(gè)流行的選擇。Spark背后的Databricks公司也提供端到端平臺(tái)。
或者,工作流的每一步都可以在不同的平臺(tái)或不同的計(jì)算環(huán)境中運(yùn)行。一種選擇是在不同的Docker容器中執(zhí)行這些步驟。Kubernetes是ML從業(yè)者中最流行的開(kāi)源容器編排系統(tǒng)之一。Kubeflow和Seldon Core是開(kāi)源工具,允許用戶描述ML管道并將其轉(zhuǎn)換為Kubernetes集群應(yīng)用程序。這可以在本地環(huán)境中完成,并且應(yīng)用程序可以運(yùn)行在Kubernetes集群上,該集群可以安裝在本地,也可以在云平臺(tái)中提供——例如谷歌Kubernetes引擎,它被谷歌AI平臺(tái)或Azure Kubernetes服務(wù)或Amazon EKS使用。Amazon還提供了一種與Kubernetes相對(duì)應(yīng)的Fargate和ECS。Apache氣流是另一個(gè)開(kāi)源工作流管理工具,最初由Airbnb開(kāi)發(fā)。氣流已經(jīng)成為協(xié)調(diào)一般IT任務(wù)(包括ML任務(wù))執(zhí)行的流行方式,它還與Kubernetes集成。
為更高級(jí)的工作流程的主動(dòng)學(xué)習(xí)
正如前面所暗示的,可能需要領(lǐng)域?qū)<以L問(wèn)一個(gè)數(shù)據(jù)標(biāo)簽器,在那里他們將被顯示輸入并被要求標(biāo)記它們。這些標(biāo)簽將存儲(chǔ)在數(shù)據(jù)庫(kù)中,然后編配人員可以在培訓(xùn)/驗(yàn)證/測(cè)試數(shù)據(jù)中使用這些標(biāo)簽。提供標(biāo)記的輸入可以手動(dòng)選擇,也可以在協(xié)調(diào)器中進(jìn)行編程。這可以通過(guò)觀察模型正確但不確定的生產(chǎn)投入,或非常確定但不確定的生產(chǎn)投入——這是“主動(dòng)學(xué)習(xí)”的基礎(chǔ)。
# 7 模型構(gòu)建器
模型構(gòu)建器負(fù)責(zé)提供一個(gè)最佳的模型。為此,它在訓(xùn)練集上訓(xùn)練各種模型,并在驗(yàn)證集上評(píng)估它們,使用給定的度量,以評(píng)估最優(yōu)性。注意,這與上一篇文章中探討的OptiML示例相同:
$ curl https://bigml.io/optiml?$BIGML_AUTH -d '{"dataset": "<training_dataset_id>", "test_dataset": "<test_dataset_id>", "metric": "area_under_roc_curve", "max_training_time": 3600 }'
BigML通過(guò)它的API自動(dòng)使模型可用,但是對(duì)于其他ML開(kāi)發(fā)平臺(tái),您可能希望打包模型,將其保存為文件,并讓您的模型服務(wù)器加載該文件。

在Azure ML上進(jìn)行的“自動(dòng)化ML”實(shí)驗(yàn)的結(jié)果。您可以下載找到的最佳模型,或者在Azure上部署它。
如果您使用不同的ML開(kāi)發(fā)平臺(tái),或者根本不使用平臺(tái),那么以一種由專用服務(wù)自動(dòng)創(chuàng)建模型的方式來(lái)構(gòu)建您的系統(tǒng)是值得的,該服務(wù)需要對(duì)訓(xùn)練集、驗(yàn)證集和性能度量進(jìn)行優(yōu)化。
# 8 模型服務(wù)器
模型服務(wù)器的角色是處理針對(duì)給定模型的預(yù)測(cè)的API請(qǐng)求。為此,它加載保存在文件中的模型表示,并通過(guò)模型解釋器將其應(yīng)用到API請(qǐng)求中的輸入;然后在API響應(yīng)中返回預(yù)測(cè)。服務(wù)器應(yīng)該允許并行處理多個(gè)API請(qǐng)求和模型更新。
下面是一個(gè)情緒分析模型的請(qǐng)求和響應(yīng)示例,它只接受一個(gè)文本特性作為輸入:
$ curl https://mydomain.com/sentiment-H 'X-ApiKey: MY_API_KEY'-d '{"input": "I love this series of articles on ML platforms"}'{"prediction": 0.90827194878055087}
存在不同的模型表示,如ONNX和PMML。另一個(gè)標(biāo)準(zhǔn)實(shí)踐是將模型作為計(jì)算環(huán)境中的對(duì)象保存在文件中。這還需要保存計(jì)算環(huán)境的表示,特別是它的依賴關(guān)系,這樣就可以再次創(chuàng)建模型對(duì)象。在這種情況下,模型“解釋器”僅僅由像model.predict(new_input)這樣的東西組成。
# 9 前端
前端可以服務(wù)多種用途:
- 簡(jiǎn)化模型的輸出,例如將一個(gè)類概率列表轉(zhuǎn)換為最可能的類;
- 添加到模型的輸出中,例如使用黑盒模型解釋器并提供預(yù)測(cè)解釋(與Indico的方法相同);
- 實(shí)現(xiàn)特定領(lǐng)域的邏輯,例如基于預(yù)測(cè)的決策,或接收到異常輸入時(shí)的回退;
- 發(fā)送生產(chǎn)輸入和模型預(yù)測(cè),以便存儲(chǔ)在生產(chǎn)數(shù)據(jù)庫(kù)中;
- 測(cè)試新模型,通過(guò)查詢預(yù)測(cè)(除了“實(shí)時(shí)”模型之外)并存儲(chǔ)它們;這將允許監(jiān)視器為這些新的候選模型繪制性能指標(biāo)。
模型生命周期管理
如果一個(gè)新的候選模型在測(cè)試數(shù)據(jù)集中提供了比當(dāng)前模型更好的性能,那么通過(guò)讓前端返回這個(gè)模型對(duì)一小部分應(yīng)用程序的最終用戶的預(yù)測(cè)(金絲雀測(cè)試),就可以測(cè)試它對(duì)應(yīng)用程序的實(shí)際影響。這要求評(píng)估者和監(jiān)控器實(shí)現(xiàn)特定于應(yīng)用程序的性能指標(biāo)。測(cè)試用戶可以從列表中選取,也可以通過(guò)他們的某個(gè)屬性、地理位置選擇,或者完全隨機(jī)選擇。在監(jiān)視性能并確信新模型不會(huì)破壞任何東西時(shí),開(kāi)發(fā)人員可以逐步增加測(cè)試用戶的比例,并執(zhí)行A/B測(cè)試,進(jìn)一步比較新模型和舊模型。如果新模型被證實(shí)更好,前端就會(huì)通過(guò)總是返回新模型的預(yù)測(cè)來(lái)“取代”舊模型。如果新模型最終破壞了系統(tǒng),也可以通過(guò)前端實(shí)現(xiàn)回滾。

逐步將流量導(dǎo)向模型B,逐步淘汰模型A(來(lái)源)
結(jié)論
如果您對(duì)真實(shí)的ML感到好奇,那么我希望本文能夠幫助您說(shuō)明為什么ML開(kāi)發(fā)平臺(tái)和模型構(gòu)建通常不足以創(chuàng)建對(duì)最終用戶有實(shí)際影響的系統(tǒng)。