官术网_书友最值得收藏!

3.1.4 有狀態(tài)函數(shù)應(yīng)用場(chǎng)景

Serverless的應(yīng)用場(chǎng)景如圖3-9所示,有狀態(tài)函數(shù)可以將Serverless拓展到更通用的應(yīng)用場(chǎng)景。

1. 微服務(wù)的應(yīng)用場(chǎng)景

微服務(wù)架構(gòu)的主要特點(diǎn)是,各微服務(wù)可獨(dú)立開(kāi)發(fā)、獨(dú)立部署和運(yùn)行,其應(yīng)用場(chǎng)景主要是交付周期短、需要頻繁變更的互聯(lián)網(wǎng)應(yīng)用,如Web應(yīng)用和移動(dòng)應(yīng)用的后端服務(wù)。傳統(tǒng)微服務(wù)框架開(kāi)發(fā)的場(chǎng)景可以使用有狀態(tài)函數(shù)開(kāi)發(fā),函數(shù)開(kāi)發(fā)可以使開(kāi)發(fā)者更加聚焦業(yè)務(wù)的實(shí)現(xiàn)而不用關(guān)心業(yè)務(wù)運(yùn)行的系統(tǒng)環(huán)境。

圖3-9 Serverless的應(yīng)用場(chǎng)景

2. 現(xiàn)有Serverless平臺(tái)的應(yīng)用場(chǎng)景

現(xiàn)有Serverless平臺(tái)的FaaS實(shí)現(xiàn)以無(wú)狀態(tài)函數(shù)為主,其應(yīng)用場(chǎng)景適合事件驅(qū)動(dòng)型應(yīng)用,包括物聯(lián)網(wǎng)場(chǎng)景、連接應(yīng)用與云服務(wù)的“膠水型”任務(wù)等,在應(yīng)用中起到連接各組件和進(jìn)行數(shù)據(jù)搬運(yùn)的作用。

3. 新一代Serverless的應(yīng)用場(chǎng)景

通過(guò)云平臺(tái)原生提供狀態(tài)管理能力,包括并發(fā)控制、一致性、伸縮能力等,有狀態(tài)函數(shù)更適用于以下低時(shí)延、高性能、高可靠的狀態(tài)使用場(chǎng)景。

? 大規(guī)模分布式機(jī)器學(xué)習(xí)中的模型訓(xùn)練和服務(wù),如迭代計(jì)算場(chǎng)景。

? 大數(shù)據(jù)與流處理,如對(duì)實(shí)時(shí)性要求較高的大數(shù)據(jù)預(yù)測(cè)和推薦、風(fēng)控服務(wù)。

? 用戶實(shí)時(shí)交互型應(yīng)用,如多人在線游戲、電商(秒殺、搶購(gòu))、在線票務(wù)系統(tǒng)。

? 多人共享的協(xié)作場(chǎng)景,如多人共享文檔協(xié)作、多人在線聊天室。

3.1.4.1 機(jī)器學(xué)習(xí)中的迭代計(jì)算場(chǎng)景

參數(shù)服務(wù)器是在分布式機(jī)器學(xué)習(xí)中新興的一種計(jì)算模式,在該模式下需要通過(guò)迭代計(jì)算循環(huán)更新參數(shù),參數(shù)數(shù)量可達(dá)到十億至萬(wàn)億個(gè)。如果狀態(tài)加載時(shí)延較長(zhǎng),會(huì)影響整體計(jì)算性能。因此,可使用有狀態(tài)函數(shù)顯著降低狀態(tài)加載的時(shí)延。

圖3-10為參數(shù)服務(wù)器計(jì)算集群的工作原理。集群中的節(jié)點(diǎn)分為計(jì)算節(jié)點(diǎn)(worker)和參數(shù)服務(wù)節(jié)點(diǎn)(server)。其中,worker負(fù)責(zé)對(duì)分配到自己本地的訓(xùn)練數(shù)據(jù)(塊)進(jìn)行計(jì)算,并更新對(duì)應(yīng)的參數(shù);server采用分布式存儲(chǔ)的方式,作為服務(wù)方接收計(jì)算節(jié)點(diǎn)的參數(shù)查詢和更新請(qǐng)求。一次迭代計(jì)算過(guò)程的具體步驟如下。

(1)計(jì)算(compute):訓(xùn)練數(shù)據(jù)(塊)分配到某個(gè)worker上,worker調(diào)用特定的機(jī)器學(xué)習(xí)算法進(jìn)行訓(xùn)練,大部分的算法是在構(gòu)建合適的損失函數(shù)后利用“鏈?zhǔn)椒▌t”進(jìn)行求導(dǎo)以計(jì)算出梯度,每個(gè)worker只負(fù)責(zé)對(duì)參數(shù)全集w中的一部分參數(shù)wi (i=1,…,m)進(jìn)行計(jì)算。

(2)推送參數(shù)(push):各個(gè)worker將計(jì)算出的梯度gi (i=1,…,m)推送給server。

(3)更新參數(shù)(update):server將各個(gè)worker推送的梯度gi (i=1,…,m)進(jìn)行匯總,更新參數(shù)全集w

(4)加載參數(shù)(pull):各個(gè)worker從參數(shù)全集w中加載自己需要的參數(shù)wi (i=1,…,m),重復(fù)進(jìn)行上述步驟,完成下一次迭代。

圖3-10 參數(shù)服務(wù)器計(jì)算集群的工作原理

在上述場(chǎng)景中,如果使用微服務(wù)或無(wú)狀態(tài)函數(shù)來(lái)實(shí)現(xiàn),由于worker和server本身不保留狀態(tài)數(shù)據(jù),則需要將參數(shù)和梯度數(shù)據(jù)保存到外置存儲(chǔ)(如S3)上,使得worker和server需要多次從或向外部存儲(chǔ)上加載參數(shù)或推送梯度數(shù)據(jù)。在大規(guī)模機(jī)器學(xué)習(xí)訓(xùn)練中,訓(xùn)練數(shù)據(jù)的大小可以達(dá)到1TB~1PB,復(fù)雜模型的訓(xùn)練參數(shù)甚至多達(dá)109~1012個(gè),迭代次數(shù)可以達(dá)到數(shù)千至數(shù)萬(wàn)次。在這樣的過(guò)程中,參數(shù)本身的加載和梯度的推送占用了大量的時(shí)間,影響機(jī)器學(xué)習(xí)性能的提升。

如果使用有狀態(tài)函數(shù)實(shí)現(xiàn)參數(shù)服務(wù)功能,重構(gòu)后的參數(shù)服務(wù)器架構(gòu)如圖3-11所示。

圖3-11 使用有狀態(tài)函數(shù)重構(gòu)后的參數(shù)服務(wù)器架構(gòu)

其中,原有的server使用有狀態(tài)函數(shù)實(shí)現(xiàn),各個(gè)worker函數(shù)使用無(wú)狀態(tài)函數(shù)實(shí)現(xiàn)。各個(gè)參數(shù)wi (i=1, …, m)和各個(gè)梯度gi (i=1, …, m)作為狀態(tài)保留在server中,整個(gè)架構(gòu)不再需要外置存儲(chǔ)。

使用有狀態(tài)函數(shù)重新實(shí)現(xiàn)后,相比之前的無(wú)狀態(tài)函數(shù)計(jì)算過(guò)程具有以下優(yōu)勢(shì)。

? 性能提升:省去了對(duì)數(shù)據(jù)進(jìn)行序列化和反序列化的開(kāi)銷(xiāo)和網(wǎng)絡(luò)通信開(kāi)銷(xiāo),可顯著減少端到端時(shí)延。

? 節(jié)省空間:原有的計(jì)算過(guò)程需要將參數(shù)wi (i=1, …, m)和梯度gi (i=1, …, m)在worker、server和S3中各存儲(chǔ)一份,使用有狀態(tài)函數(shù)重構(gòu)后無(wú)須在外置存儲(chǔ)中進(jìn)行存儲(chǔ),節(jié)省了1/3的存儲(chǔ)空間。

3.1.4.2 大數(shù)據(jù)計(jì)算場(chǎng)景

在大數(shù)據(jù)計(jì)算場(chǎng)景下,經(jīng)常會(huì)產(chǎn)生大量數(shù)據(jù)I/O,這些數(shù)據(jù)量通常達(dá)到GB或TB級(jí)別。如果使用有狀態(tài)函數(shù),則可以顯著降低I/O開(kāi)銷(xiāo)。

例如,網(wǎng)絡(luò)規(guī)劃領(lǐng)域的某服務(wù)化工具,其使用流程如下。

? 服務(wù)編排設(shè)計(jì):設(shè)計(jì)工程師事先將原子服務(wù)(類(lèi)似函數(shù))按照所需要的業(yè)務(wù)流程進(jìn)行編排,組成一套任務(wù)流程,以達(dá)到服務(wù)復(fù)用的目的。

? 任務(wù)計(jì)算:系統(tǒng)從編排好的任務(wù)流程生成任務(wù)實(shí)例,服務(wù)工程師在使用時(shí)設(shè)定參數(shù)、上傳文件,系統(tǒng)按照指定的任務(wù)流程進(jìn)行自動(dòng)計(jì)算,最后給出分析結(jié)果。

兩函數(shù)串行編排流程如圖3-12所示,函數(shù)A接收輸入,將計(jì)算得到的中間結(jié)果交給函數(shù)B繼續(xù)計(jì)算,函數(shù)B輸出最終結(jié)果。這一場(chǎng)景分別使用無(wú)狀態(tài)函數(shù)和有狀態(tài)函數(shù)的實(shí)現(xiàn)方式比較如下。

(1)使用無(wú)狀態(tài)函數(shù)+外部存儲(chǔ)實(shí)現(xiàn)。如圖3-13所示,如果用無(wú)狀態(tài)函數(shù)+外部存儲(chǔ)來(lái)存儲(chǔ)中間結(jié)果,那么函數(shù)A和函數(shù)B就不可避免地要通過(guò)網(wǎng)絡(luò)I/O來(lái)讀寫(xiě)中間結(jié)果。然而,大數(shù)據(jù)場(chǎng)景下的中間結(jié)果往往較大,I/O耗時(shí)成為其主要瓶頸。用戶關(guān)心的是最終結(jié)果而不是中間結(jié)果,最后還需要?jiǎng)h除中間結(jié)果以避免長(zhǎng)期占用額外空間。

(2)使用無(wú)狀態(tài)函數(shù)+內(nèi)部存儲(chǔ)實(shí)現(xiàn)。使用無(wú)狀態(tài)函數(shù)+外部存儲(chǔ)實(shí)現(xiàn)方式的主要痛點(diǎn)在于使用了外部存儲(chǔ),造成網(wǎng)絡(luò)I/O開(kāi)銷(xiāo)大。如果使用無(wú)狀態(tài)函數(shù)+內(nèi)部存儲(chǔ)實(shí)現(xiàn)會(huì)怎樣呢?

如圖3-14所示,如果使用無(wú)狀態(tài)函數(shù)+內(nèi)部存儲(chǔ)實(shí)現(xiàn),就需要將函數(shù)A和函數(shù)B“親和性”部署到同一個(gè)虛擬機(jī)或物理機(jī)中,從而借助同一份內(nèi)部存儲(chǔ)(通常是內(nèi)存或磁盤(pán))來(lái)傳遞中間結(jié)果。由于使用的是內(nèi)部存儲(chǔ),可以顯著降低I/O耗時(shí),也避免了將中間結(jié)果持久化到外部存儲(chǔ)及刪除所帶來(lái)的開(kāi)銷(xiāo)。

圖3-12 兩函數(shù)串行編排流程

圖3-13 無(wú)狀態(tài)函數(shù)+外部存儲(chǔ)

圖3-14 無(wú)狀態(tài)函數(shù)+內(nèi)部存儲(chǔ)

對(duì)用戶來(lái)說(shuō),需要自己開(kāi)發(fā)一個(gè)函數(shù)調(diào)度平臺(tái)來(lái)實(shí)現(xiàn)對(duì)函數(shù)節(jié)點(diǎn)的親和性部署、調(diào)度和維護(hù)。這個(gè)平臺(tái)類(lèi)似于一個(gè)小型的PaaS,要實(shí)現(xiàn)較高的可用性和資源利用率,對(duì)普通用戶來(lái)說(shuō)是有一定門(mén)檻的。這種方式的主要痛點(diǎn)在于函數(shù)調(diào)度平臺(tái)的開(kāi)發(fā)和維護(hù)成本較高。

(3)使用有狀態(tài)函數(shù)實(shí)現(xiàn)。使用無(wú)狀態(tài)函數(shù)+內(nèi)部存儲(chǔ)實(shí)現(xiàn)方式中的函數(shù)實(shí)例與狀態(tài)緊密綁定,這實(shí)際上就是有狀態(tài)函數(shù)的雛形。如果其中的函數(shù)調(diào)度工作由Serverless平臺(tái)完成,并且對(duì)用戶透明,實(shí)際上就是有狀態(tài)函數(shù)的應(yīng)用。

如圖3-15所示,如果使用有狀態(tài)函數(shù)實(shí)現(xiàn),可以將函數(shù)A和函數(shù)B親和性部署到同一個(gè)Serverless運(yùn)行時(shí)中,它們可以借助同一個(gè)狀態(tài)數(shù)據(jù)來(lái)傳遞中間結(jié)果。這種方式的優(yōu)勢(shì)在于,一是狀態(tài)數(shù)據(jù)在內(nèi)部存儲(chǔ)中,避免了網(wǎng)絡(luò)I/O開(kāi)銷(xiāo);二是用戶無(wú)須關(guān)心如何調(diào)度函數(shù)實(shí)例,降低了開(kāi)發(fā)和維護(hù)成本。

圖3-15 使用有狀態(tài)函數(shù)實(shí)現(xiàn)

3.1.4.3 實(shí)時(shí)交互型場(chǎng)景

大型多人在線游戲(Massively Multiplayer Online Game,簡(jiǎn)稱(chēng)MMOG或MMO)通常需要與百萬(wàn)級(jí)用戶產(chǎn)生每秒高達(dá)數(shù)百萬(wàn)次的實(shí)時(shí)交互,它對(duì)于時(shí)延的要求非常高,通常端到端的時(shí)延大于100ms就會(huì)給用戶帶來(lái)不可接受的影響,其中網(wǎng)絡(luò)時(shí)延和玩家自身網(wǎng)絡(luò)情況有關(guān),無(wú)法完全避免,這就需要服務(wù)端的計(jì)算和I/O時(shí)延盡可能低。

對(duì)戰(zhàn)類(lèi)的游戲是有狀態(tài)的,這是因?yàn)槎嗳思尤胪粓?chǎng)戰(zhàn)斗時(shí),會(huì)同時(shí)在一臺(tái)服務(wù)器上進(jìn)行,不能分布在多處。如果分布在多臺(tái)服務(wù)器上進(jìn)行處理,就需要通過(guò)外部數(shù)據(jù)庫(kù)存儲(chǔ)狀態(tài),導(dǎo)致在游戲過(guò)程中頻繁連接數(shù)據(jù)庫(kù)而增加時(shí)延。如果整場(chǎng)戰(zhàn)斗在同一臺(tái)服務(wù)器上進(jìn)行,在內(nèi)存中保留狀態(tài)并進(jìn)行計(jì)算,則可以顯著降低時(shí)延。

那么,如何對(duì)游戲的狀態(tài)進(jìn)行管理呢?通常會(huì)采用游戲?qū)ο螅℅ame Object)的設(shè)計(jì)模式來(lái)設(shè)計(jì)MMO游戲。游戲?qū)ο髮⒂螒驙顟B(tài)封裝到一個(gè)邏輯抽象中,其中不僅包含游戲中所有有意義的實(shí)體數(shù)據(jù),還包括玩家角色、NPC條目、互動(dòng)世界對(duì)象等。這個(gè)抽象對(duì)象有一個(gè)ID標(biāo)識(shí)元素,每個(gè)游戲?qū)ο髮?shí)例擁有在整個(gè)游戲系統(tǒng)中唯一的ID,如圖3-16所示。

圖3-16 游戲?qū)ο笫疽?/p>

這是一種stateful的設(shè)計(jì)模式,游戲?qū)顟B(tài)保留在內(nèi)存中以便重復(fù)使用直到不再需要,結(jié)合有狀態(tài)函數(shù)的使用,其主要特點(diǎn)如下。

? 位置唯一性:每個(gè)游戲?qū)ο髮?shí)例在某個(gè)時(shí)間只存在一個(gè)有狀態(tài)函數(shù)實(shí)例中,游戲?qū)ο蟛辉试S在函數(shù)實(shí)例之間復(fù)制移動(dòng),從而降低對(duì)象創(chuàng)建和同步的開(kāi)銷(xiāo)。位置唯一性使系統(tǒng)更容易定位到某個(gè)特定的游戲?qū)嵗⑶矣兄谠鰪?qiáng)數(shù)據(jù)狀態(tài)的一致性。

? 資源獨(dú)享:不需要共享資源,也避免了多線程對(duì)資源的競(jìng)爭(zhēng)。

因此,在該類(lèi)場(chǎng)景下,有狀態(tài)函數(shù)主要利用數(shù)據(jù)本地化的優(yōu)勢(shì)帶來(lái)更低的時(shí)延。

主站蜘蛛池模板: 锡林浩特市| 玛曲县| 冕宁县| 昌黎县| 富民县| 呼图壁县| 清水县| 库伦旗| 怀来县| 汉源县| 信丰县| 东港市| 娄烦县| 夏河县| 明水县| 凤翔县| 平顶山市| 乡宁县| 永宁县| 蒲江县| 五台县| 苍梧县| 万全县| 邳州市| 辰溪县| 蓬莱市| 台南县| 扎鲁特旗| 盐亭县| 湘西| 宜丰县| 孝感市| 民丰县| 左贡县| 红河县| 区。| 蓬溪县| 东源县| 大竹县| 章丘市| 宁化县|