從實(shí)驗(yàn)室到工廠,模型部署中幾個(gè)重要問(wèn)題
點(diǎn)擊:1063
A+ A-
所屬頻道:新聞中心
在我們的產(chǎn)業(yè)中,很多關(guān)注都集中在開(kāi)發(fā)分析模型來(lái)解決關(guān)鍵商業(yè)問(wèn)題以及預(yù)測(cè)消費(fèi)者行為上。但是,當(dāng)數(shù)據(jù)科學(xué)家研發(fā)完模型,需要部署模型以供更大的組織使用時(shí),會(huì)發(fā)生什么情況?
沒(méi)有嚴(yán)格流程就部署模型會(huì)引發(fā)后患,看一下這個(gè)金融服務(wù)業(yè)的實(shí)例就知道了。
擁有自己的高頻貿(mào)易算法的Knight曾是美國(guó)最大的股票貿(mào)易商,在紐約證券交易所(NYSE)有17.3%的市場(chǎng)份額,在納斯達(dá)克(NASDAQ)有16.9%的市場(chǎng)占有率。但是,2012年由于一次計(jì)算機(jī)交易的小故障,Knight在不到一小時(shí)之內(nèi)蒙受了4.4億美元的損失。那年年底,公司被收購(gòu)。這充分證明:未經(jīng)適當(dāng)測(cè)試就輕易部署使用分析模型會(huì)有很大風(fēng)險(xiǎn),那些系統(tǒng)漏洞會(huì)給公司帶來(lái)嚴(yán)重后果。
在這篇博文中,我們將談?wù)勅绾瓮ㄟ^(guò)合理的模型管理和部署流程來(lái)避免后患。在部署模型之前,有幾個(gè)必須解決的問(wèn)題:
·模型結(jié)果是如何到達(dá)那些會(huì)從這一分析中獲益的決策者或者應(yīng)用程序那里的?
·這個(gè)模型能不出問(wèn)題的自主運(yùn)行嗎?如何從失敗中恢復(fù)運(yùn)行的?
·因?yàn)橛?xùn)練數(shù)據(jù)是不再相關(guān)的歷史數(shù)據(jù),模型也因此變得陳舊,會(huì)導(dǎo)致什么后果?
·在不阻斷下游消費(fèi)者的情況下,如何部署和管理新版模型?
我們可以把數(shù)據(jù)科學(xué)的開(kāi)發(fā)和應(yīng)用看作是兩個(gè)不同的流程,但是,這兩個(gè)過(guò)程又是更大的模型生命周期流程的一部分。下面示例圖說(shuō)明了這一過(guò)程。
1. 終端用戶(hù)與應(yīng)用程序交互,產(chǎn)生的數(shù)據(jù)存儲(chǔ)在應(yīng)用的線(xiàn)上產(chǎn)品數(shù)據(jù)庫(kù)中。
2. 然后這些數(shù)據(jù)會(huì)被傳到一個(gè)線(xiàn)下的歷史數(shù)據(jù)庫(kù)中(如 Hadoop 或 S3),由數(shù)據(jù)科學(xué)家進(jìn)行分析,搞清楚用戶(hù)是如何與應(yīng)用交互的。這些數(shù)據(jù)也有別的用處,比如構(gòu)建一個(gè)模型,根據(jù)用戶(hù)在應(yīng)用中的行為把他們進(jìn)行分類(lèi),這樣我們就可以利用這些信息對(duì)用戶(hù)進(jìn)行營(yíng)銷(xiāo)。
3. 一旦構(gòu)建出了一個(gè)模型,我們可以把它登記到一個(gè)模型注冊(cè)表中,這時(shí)一個(gè)治理程序會(huì)對(duì)模型進(jìn)行評(píng)估,批準(zhǔn)其投放產(chǎn)業(yè)應(yīng)用,并對(duì)模型部署要求進(jìn)行評(píng)估。
4. 當(dāng)模型的產(chǎn)業(yè)應(yīng)用被批準(zhǔn)后,我們就開(kāi)始部署模型。為此,我們要搞清楚組織會(huì)如何使用這個(gè)模型,作出相應(yīng)調(diào)整,確保模型能在特定性能約束下自主端到端運(yùn)行,同時(shí)也要進(jìn)行測(cè)試,以確保在部署之后模型仍與開(kāi)發(fā)出來(lái)的一致。一旦完成這些步驟,我們就在投入生產(chǎn)前,再次對(duì)模型進(jìn)行了評(píng)估和批準(zhǔn)。
5.最后,一旦部署完畢,模型所做出的預(yù)測(cè)就能服務(wù)于應(yīng)用程序,這些預(yù)測(cè)的權(quán)值都是根據(jù)用戶(hù)交互行為計(jì)算出的。這些信息有助于改進(jìn)模型,或提出一個(gè)新的商業(yè)問(wèn)題,這就又回到了過(guò)程(2)。
為了確保周期運(yùn)行成功,我們需要理解數(shù)據(jù)科學(xué)的開(kāi)發(fā)和部署有著不同的要求,這些要求都需要被滿(mǎn)足。這就是為什么你需要一個(gè)實(shí)驗(yàn)室,同時(shí)也需要一個(gè)工廠。
實(shí)驗(yàn)室
數(shù)據(jù)實(shí)驗(yàn)室是數(shù)據(jù)科學(xué)家進(jìn)行研究的地方,關(guān)注點(diǎn)不同于應(yīng)用產(chǎn)品。最終目標(biāo)也許是利用數(shù)據(jù)驅(qū)動(dòng)組織內(nèi)的決策制定,但是,實(shí)現(xiàn)這個(gè)之前,我們需要先弄清楚對(duì)組織而言,那些假設(shè)有意義,并證明其價(jià)值。因此,我們主要關(guān)注的是創(chuàng)造出一個(gè)環(huán)境——實(shí)驗(yàn)室,在這里,數(shù)據(jù)科學(xué)家可以提出問(wèn)題,構(gòu)建模型,并用數(shù)據(jù)進(jìn)行測(cè)試。
正如以下基于 CRISP-DM 模型的圖表所示,這個(gè)過(guò)程基本上迭代式的。
我們不會(huì)在本文討論太多細(xì)節(jié),但是我們有一個(gè)深入這個(gè)主題的教程。
在這里,我們關(guān)心的問(wèn)題是需要實(shí)驗(yàn)室來(lái)研發(fā)模型,還需要一個(gè)工廠,用以部署這個(gè)模型并將之自動(dòng)應(yīng)用到實(shí)時(shí)數(shù)據(jù),在約束條件下把結(jié)果傳送給適當(dāng)?shù)目蛻?hù),并且監(jiān)管整個(gè)過(guò)程,以防運(yùn)行失敗或異常。
工廠
在工廠里,我們要做的是優(yōu)化價(jià)值創(chuàng)造并降低成本,評(píng)估穩(wěn)定性和結(jié)構(gòu)彈性,確保在約束條件下把結(jié)果傳送給適當(dāng)?shù)目蛻?hù),同時(shí)能監(jiān)控和管理程序故障。我們需要給模型提供一個(gè)結(jié)構(gòu),根據(jù)生產(chǎn)中的情況進(jìn)行預(yù)期。
為了理解工廠的運(yùn)行過(guò)程,我們來(lái)看一下如何通過(guò)模型注冊(cè)表來(lái)管理模型,以及部署時(shí)需要考慮哪些問(wèn)題。
模型注冊(cè)表
為了給模型一個(gè)結(jié)構(gòu),我們會(huì)根據(jù)模型的組件進(jìn)行定義,包括數(shù)據(jù)依存性,腳本,配置以及文件。另外,我們會(huì)捕獲模型上的元數(shù)據(jù)及其不同版本,提供額外的商業(yè)環(huán)境和模型特定信息。給模型提供一個(gè)結(jié)構(gòu),接著就能將模型目錄清單存在模型注冊(cè)表中,包括了不同模型版本,以及執(zhí)行過(guò)程反饋的關(guān)聯(lián)結(jié)果。下面的圖示解釋了這個(gè)概念。
通過(guò)注冊(cè)表,我們可以:
·明確哪個(gè)版本的模型正在被使用,并控制它。
·查看發(fā)布說(shuō)明,搞清楚某個(gè)特定版本發(fā)生了什么變化。
·查看與模型相關(guān)聯(lián)的資產(chǎn)和文件,這對(duì)于創(chuàng)建一個(gè)已有模型的新版本或管理維護(hù)是有用的。
·監(jiān)管模型執(zhí)行的性能標(biāo)準(zhǔn),以及什么程序在使用它。這些信息是在模型執(zhí)行過(guò)程中產(chǎn)生的,會(huì)把權(quán)值反饋給注冊(cè)表。
你同樣也可以選擇在模型某個(gè)版本中加入 Jupyter Notebook 。這可以讓一個(gè)審閱者或開(kāi)發(fā)者遍歷此版本原始開(kāi)發(fā)者最初開(kāi)發(fā)時(shí)的思維過(guò)程和假設(shè)。有助于模型維護(hù),也有助于組織探索。
這里有一個(gè)矩陣,解構(gòu)了一個(gè)模型的不同元素:
注冊(cè)表需要捕捉到數(shù)據(jù)、腳本和訓(xùn)練過(guò)的模型對(duì)象之間的聯(lián)系,圖中說(shuō)明了與一個(gè)模型特定版本相關(guān)的文件。
這對(duì)我們的實(shí)踐有什么幫助?
·通過(guò)收集如何運(yùn)行一個(gè)模型所需的資產(chǎn)和元數(shù)據(jù),我們就能驅(qū)動(dòng)一個(gè)執(zhí)行工作流,將模型的特定版本用于實(shí)時(shí)數(shù)據(jù),為終端用戶(hù)預(yù)測(cè)結(jié)果。如果這是批量程序的一部分,我們就可以利用這些信息為模型創(chuàng)造一個(gè)暫態(tài)的執(zhí)行環(huán)境,來(lái)提取數(shù)據(jù)、腳本、運(yùn)行模型、在目標(biāo)存貯里保存結(jié)果,并在程序完成后關(guān)閉環(huán)境,在最大化資源的同時(shí)將成本最小化。
·從監(jiān)管角度來(lái)看,我們可以支持那些決定模型何時(shí)被推向產(chǎn)業(yè)化的商業(yè)工作流,這些工作流負(fù)責(zé)允許運(yùn)行中的模型監(jiān)視程序去做出一些決定,比如,當(dāng)我們發(fā)現(xiàn)模型預(yù)測(cè)已不再符合現(xiàn)實(shí)情況時(shí)是否應(yīng)該重新訓(xùn)練它。如果你有審計(jì)要求,你可能需要跟顧客解釋你是如何得到某個(gè)特定結(jié)論的。為了做到這一點(diǎn),你需要去考察在特定時(shí)間運(yùn)行的某個(gè)特定版本的模型,并且需要知道復(fù)現(xiàn)這個(gè)結(jié)果用到了什么樣的數(shù)據(jù)。
·如果我們?cè)谝粋€(gè)已有模型中發(fā)現(xiàn)了漏洞,我們可以把它標(biāo)記成不應(yīng)該使用,修復(fù)后發(fā)布此模型的新版本。對(duì)所有使用漏洞版本的用戶(hù)發(fā)送通知,他們就可以轉(zhuǎn)而使用新的修復(fù)版。
如果不進(jìn)行以上這些步驟,我們就有可能讓模型維護(hù)變成需要試圖理解原始開(kāi)發(fā)者意圖的冒險(xiǎn)行為,部署后的模型不再與那些正在開(kāi)發(fā)中模型相匹配,產(chǎn)生不正確的結(jié)果,在已有模型升級(jí)后還會(huì)擾亂下游用戶(hù)的正常使用。
模型部署
一旦模型被批準(zhǔn)部署,我們需要通過(guò)幾個(gè)步驟來(lái)確保模型能被部署。要有驗(yàn)證正確性的測(cè)試,還要測(cè)試提取原始數(shù)據(jù)的管道流程、特征生成,以及分析模型評(píng)分以確定模型可以自主運(yùn)行,以消費(fèi)者需要的方式產(chǎn)生出結(jié)果,滿(mǎn)足行業(yè)定義的性能要求。還要確保模型的執(zhí)行過(guò)程處于監(jiān)控中,以防發(fā)生錯(cuò)誤或模型過(guò)時(shí)不再產(chǎn)生準(zhǔn)確的結(jié)果。
在部署之前,我們要確保測(cè)試了下面幾項(xiàng):
·部署后的模型是否達(dá)到了原始模型開(kāi)發(fā)者的預(yù)期。通過(guò)采用一個(gè)在開(kāi)發(fā)過(guò)程中產(chǎn)生有效結(jié)果的測(cè)試輸入集,我們就能驗(yàn)證部署的代碼是否與開(kāi)發(fā)中的預(yù)期吻合。
·部署后的模型是否在多種不同的輸入下都能良好運(yùn)行,測(cè)試輸出的極端情況,以及由于數(shù)據(jù)質(zhì)量問(wèn)題潛在丟失的數(shù)值。同時(shí)應(yīng)該有防止這些輸入毀掉模型并最終影響下游顧客的的控制手段。
我們通過(guò)兩種方式來(lái)最小化部署后模型與開(kāi)發(fā)模型匹配時(shí)的風(fēng)險(xiǎn):1)部署到生產(chǎn)環(huán)節(jié)之前就運(yùn)行測(cè)試,2)捕獲環(huán)境細(xì)節(jié),比如特定的語(yǔ)言版本和模型的庫(kù)依存性(例如,一個(gè)Python requirements.txt 文件)。
一旦部署到生產(chǎn)環(huán)節(jié)后,我們就想對(duì)用戶(hù)顯示模型的預(yù)測(cè)結(jié)果。有多少用戶(hù)會(huì)使用這一模型進(jìn)行預(yù)測(cè)?在為模型打分時(shí),提供特征數(shù)據(jù)的速度要有多快?比如,欺詐偵測(cè)中,如果特征信息每24小時(shí)產(chǎn)生一次,那么,從事件發(fā)生到詐騙偵測(cè)模型檢測(cè)到此事件之間,會(huì)存在嚴(yán)重滯后。這就是我們需要解決的一些可擴(kuò)展性和性能方面的問(wèn)題。
就一個(gè)應(yīng)用程序來(lái)說(shuō),最理想的方式是通過(guò)網(wǎng)頁(yè)服務(wù)向用戶(hù)展示結(jié)果,方式是通過(guò)模型實(shí)時(shí)得分或是以線(xiàn)下批處理過(guò)程展示評(píng)分結(jié)果?;蛘呤?,模型需要支持一個(gè)商業(yè)過(guò)程,我們需要把模型的結(jié)果放在一個(gè)為決策者生成報(bào)告并遵照該這些結(jié)果予以行事的地方。無(wú)論是那種情況,如果沒(méi)有模型注冊(cè)表,想要知道哪里可以找到并使用當(dāng)前模型的結(jié)果是很困難的。
另一個(gè)應(yīng)用實(shí)例是想要搞清楚模型如何背離實(shí)時(shí)數(shù)據(jù)運(yùn)行,以考察模型是否變得陳舊,或者確定一個(gè)新開(kāi)發(fā)的模型性能是否超過(guò)舊模型。一個(gè)簡(jiǎn)單的例子就是用回歸模型來(lái)對(duì)比預(yù)期值和實(shí)際值。如果我們沒(méi)有監(jiān)測(cè)到模型結(jié)果隨時(shí)間變化,那么,我們可能是在根據(jù)不再適用于當(dāng)前情勢(shì)的歷史數(shù)據(jù)在做決策。
結(jié)論
這篇文章中,我們遍歷了模型周期,討論了對(duì)實(shí)驗(yàn)室和工廠的需要,意在降低部署那些可能影響商業(yè)決策(并且還可能帶來(lái)高成本)壞模型帶來(lái)的風(fēng)險(xiǎn)。另外,注冊(cè)表也提供了組織中模型的透明性和可發(fā)現(xiàn)性。這有利于通過(guò)呈現(xiàn)組織使用的現(xiàn)有技術(shù),來(lái)研發(fā)新模型,解決相似問(wèn)題,也有利于現(xiàn)有模型維護(hù)或通過(guò)澄清模型當(dāng)前版本、目前相關(guān)資產(chǎn)情況等來(lái)提升模型。
在SVDS ,我們正在研發(fā)一個(gè)架構(gòu),它能支持模型管理,把不同模型版本登入注冊(cè)表,并管理如何將這些模型版本部署到一個(gè)執(zhí)行引擎中。
(審核編輯: 林靜)
分享