在 AI 項(xiàng)目中,大多時(shí)候開(kāi)發(fā)者的關(guān)注點(diǎn)都集中在如何進(jìn)行訓(xùn)練、如何調(diào)優(yōu)模型、如何達(dá)到滿(mǎn)意的識(shí)別率上面。但對(duì)于一個(gè)完整項(xiàng)目來(lái)說(shuō),通常是需求推動(dòng)項(xiàng)目,同時(shí),項(xiàng)目也最終要落到實(shí)際業(yè)務(wù)中來(lái)滿(mǎn)足需求。
對(duì)于常用的 AI 訓(xùn)練和機(jī)器學(xué)習(xí)工具如 TensorFlow,它本身也提供了 AI Serving 工具TensorFlow Serving。利用此工具,可以將訓(xùn)練好的模型簡(jiǎn)單保存為模型文件,然后通過(guò)的腳本在 TensorFlow Serving 加載模型,輸入待推理數(shù)據(jù),得到推理結(jié)果。
但與擁有較固定計(jì)算周期和運(yùn)行時(shí)長(zhǎng)的 AI 訓(xùn)練不同,AI 推理的調(diào)用會(huì)隨著業(yè)務(wù)的漲落而漲落,經(jīng)常出現(xiàn)類(lèi)似白天高、夜間低的現(xiàn)象。且在大規(guī)模高并發(fā)的節(jié)點(diǎn)需求情況下,常規(guī)的部署方案,明顯無(wú)法滿(mǎn)足此類(lèi)需求,此時(shí)需要使用更專(zhuān)業(yè)的 AI 推理模型和擴(kuò)縮容、負(fù)載均衡等技術(shù)完成預(yù)測(cè)推理。
UAI-Inference 采用類(lèi)似 Serverless 的架構(gòu),通過(guò)請(qǐng)求調(diào)度算法、定制擴(kuò)縮容策略,自動(dòng)完成 AI 請(qǐng)求的負(fù)載均衡,實(shí)行節(jié)點(diǎn)動(dòng)態(tài)擴(kuò)容和回收,可提供數(shù)萬(wàn)的 AI 在線(xiàn)推理服務(wù)節(jié)點(diǎn)。
某AI在線(xiàn)推理一天內(nèi)的請(qǐng)求訪問(wèn)情況
AI 推理(Inference)的在線(xiàn)執(zhí)行有兩大關(guān)鍵因素:一是通過(guò) GPU/CPU 對(duì)數(shù)據(jù)進(jìn)行快速?zèng)Q策,二是對(duì)訪問(wèn)請(qǐng)求的實(shí)時(shí)響應(yīng)。下圖為某一 AI 在線(xiàn)推理場(chǎng)景 24 小時(shí)內(nèi)的資源使用情況,其中,橫軸為時(shí)間、縱軸為用戶(hù)資源請(qǐng)求量,橙色線(xiàn)現(xiàn)表示資源配置情況。

凌晨 00:00-8:00 點(diǎn),用戶(hù)基本處于睡眠狀態(tài),此刻的資源請(qǐng)求較少,閑置資源較多;8:00 以后,手機(jī)等設(shè)備使用量增多,推理訪問(wèn)請(qǐng)求逐漸上升;直至中午,設(shè)備訪問(wèn)達(dá)到高峰,請(qǐng)求量超過(guò)設(shè)定的資源量,系統(tǒng)紡問(wèn)出現(xiàn)延遲;之后在線(xiàn)使用量降低,部分資源又將閑置……
可以看到,一天內(nèi)不同的時(shí)間段,訪問(wèn)量會(huì)隨著用戶(hù)作息規(guī)律而出現(xiàn)相應(yīng)的起伏,若是將資源配置設(shè)置過(guò)小,則會(huì)導(dǎo)致計(jì)算資源不足,系統(tǒng)吞吐量變低,致使訪問(wèn)延遲。但若投入過(guò)多的配置,又會(huì)產(chǎn)生大量的閑置資源,增加成本。
面向大規(guī)模的AI分布式在線(xiàn)推理設(shè)計(jì)與實(shí)現(xiàn)
UAI-Inference 整體架構(gòu)
為了應(yīng)對(duì)在線(xiàn)推理對(duì)實(shí)時(shí)擴(kuò)縮容以及大規(guī)模節(jié)點(diǎn)的需求,UAI-Inference 在每一臺(tái)虛擬機(jī)上都部署一個(gè) AI 在線(xiàn)服務(wù)計(jì)算節(jié)點(diǎn),以類(lèi)似 Serverless 的架構(gòu),通過(guò) SDK 工具包和 AI 在線(xiàn)服務(wù) PaaS 平臺(tái),來(lái)加載訓(xùn)練模型并處理推理(Inference)請(qǐng)求。整體架構(gòu)如下:

SDK 工具包:主要負(fù)責(zé)模型加載。包含接口代碼框架、代碼和數(shù)據(jù)打包模板以及第三方依賴(lài)庫(kù)描述模板。用戶(hù)根據(jù) SDK 工具包內(nèi)的代碼框架編寫(xiě)接口代碼,準(zhǔn)備好相關(guān)代碼和 AI 模型以及第三方庫(kù)列表,然后通過(guò)打包工具將訓(xùn)練模型進(jìn)行打包。
任務(wù)打包完畢后,系統(tǒng)自動(dòng)將業(yè)務(wù)部署在 AI 在線(xiàn)推理 PaaS 平臺(tái)上處理推理請(qǐng)求。這里,平臺(tái)每個(gè)計(jì)算節(jié)點(diǎn)都是同構(gòu)的,節(jié)點(diǎn)具有相等的計(jì)算能力,以保證系統(tǒng)的負(fù)載均衡能力。此外,動(dòng)態(tài)擴(kuò)縮容、分布式容災(zāi)等彈性可靠設(shè)計(jì)也是基于該平臺(tái)實(shí)現(xiàn)。
在線(xiàn)推理實(shí)現(xiàn)原理
在實(shí)現(xiàn)上,系統(tǒng)主要采用 CPU/GPU 計(jì)算節(jié)點(diǎn)來(lái)提供推理任務(wù)的基礎(chǔ)算力,通過(guò) Docker 容器技術(shù)封裝訓(xùn)練任務(wù),內(nèi)置 Django Server 來(lái)接受外部 HTTP 請(qǐng)求。下圖展現(xiàn)了處理請(qǐng)求的簡(jiǎn)單原理與流程:

在初始化過(guò)程中(init),Django Server 會(huì)先根據(jù) conf.json 加載 AI Inference 模塊,然后調(diào)用該模塊的 load_model 將 AI 模型加載到 Django HTTP 服務(wù)器中;在處理推理請(qǐng)求時(shí),Django 服務(wù)器會(huì)接受外部的 HTTP 請(qǐng)求,然后再調(diào)用 execute 函數(shù)來(lái)執(zhí)行推理任務(wù)并返回結(jié)果。
這里,采用容器技術(shù)的好處是可以將運(yùn)行環(huán)境完全隔離,不同任務(wù)之間不會(huì)產(chǎn)生軟件沖突,只要這些 AI 服務(wù)在平臺(tái)節(jié)點(diǎn)上運(yùn)行滿(mǎn)足延時(shí)要求,就可進(jìn)行 AI 在線(xiàn)推理服務(wù)部署。
功能特性
UAI-Inference 適用于常見(jiàn)的大規(guī)模 AI 在線(xiàn)服務(wù)場(chǎng)景,如圖像識(shí)別、自然語(yǔ)言處理等等。整體而言,該系統(tǒng)具有以下功能特點(diǎn):
面向 AI 開(kāi)發(fā):通過(guò)預(yù)制的 NVIDIA GPU 執(zhí)行環(huán)境和容器鏡像,UAI-Inference 提供基于 Docker 的 HTTP 在線(xiàn)服務(wù)基礎(chǔ)鏡像,支持 TensorFlow、Keras、Caffe、MXNet 多種 AI 框架,能快速 AI 算法的在線(xiàn)推理服務(wù)化。
海量計(jì)算資源:擁有十萬(wàn)核級(jí)別計(jì)算資源池,可以充分保障計(jì)算資源需求。且系統(tǒng)按照實(shí)際計(jì)算資源消耗收費(fèi),無(wú)需擔(dān)心資源閑置浪費(fèi)。
彈性伸縮、快速擴(kuò)容:隨著業(yè)務(wù)的高峰和低峰,系統(tǒng)自動(dòng)調(diào)整計(jì)算資源配比,對(duì)計(jì)算集群進(jìn)行橫向擴(kuò)展和回縮。
服務(wù)高可用:計(jì)算節(jié)點(diǎn)集群化,提供全系統(tǒng)容災(zāi)保障,無(wú)需擔(dān)心單點(diǎn)錯(cuò)誤。
用戶(hù)隔離:通過(guò) Docker 容器技術(shù),將多用戶(hù)存儲(chǔ)、網(wǎng)絡(luò)、計(jì)算資源隔離,具有安全可靠的特性。
簡(jiǎn)單易用:支持可視化業(yè)務(wù)管理和監(jiān)控,操作簡(jiǎn)單。
在線(xiàn)推理的可靠性設(shè)計(jì)
因?yàn)橥评碚?qǐng)求是隨著訪問(wèn)量的變化而變化的,因此,在線(xiàn)推理的可靠性設(shè)計(jì),考慮以下幾點(diǎn):1)充足資源池,保證在高并發(fā)情況下,系統(tǒng)擁有足夠的計(jì)算資源使請(qǐng)求訪問(wèn)正常;2)負(fù)載均衡:將請(qǐng)求合理的分配到各節(jié)點(diǎn)當(dāng)中;3)請(qǐng)求調(diào)度算法:用于計(jì)算資源的實(shí)時(shí)調(diào)度;4)性能監(jiān)控:查看用戶(hù)訪問(wèn)狀態(tài),為系統(tǒng)擴(kuò)縮容做參考;5)高可用部署:保證在單節(jié)點(diǎn)宕機(jī)時(shí),系統(tǒng)能夠正常運(yùn)行。
負(fù)載均衡
UAI-Inference 為每個(gè)在線(xiàn)服務(wù)提供了自動(dòng)負(fù)載均衡能力,當(dāng)用戶(hù)提交同構(gòu)、獨(dú)立的 AI 在線(xiàn)推理容器鏡像時(shí),平臺(tái)會(huì)根據(jù)請(qǐng)求的負(fù)載創(chuàng)建多個(gè)計(jì)算節(jié)點(diǎn),并使用負(fù)載均衡技術(shù)將請(qǐng)求轉(zhuǎn)發(fā)到計(jì)算集群中。

如圖所示,負(fù)載均衡主要包括網(wǎng)絡(luò)層和轉(zhuǎn)發(fā)層。網(wǎng)絡(luò)層中,同一個(gè)交換機(jī)(IP)可以接多個(gè)后端節(jié)點(diǎn),通過(guò)請(qǐng)求調(diào)度算法將請(qǐng)求分配到各個(gè)計(jì)算節(jié)點(diǎn)當(dāng)中。調(diào)度算法可以采用Hashing、RR(Round Robin)、Shortest Expected Delay等,其中,Hashing 適用于長(zhǎng)鏈接請(qǐng)求,Shortest Expected Delay 適用于短鏈接請(qǐng)求。目前,UAI-Inference 采用 RR 的方式在計(jì)算節(jié)點(diǎn)間調(diào)度請(qǐng)求。整個(gè)系統(tǒng)最底層是一個(gè)統(tǒng)一的資源池,用以保證充足的計(jì)算資源。
動(dòng)態(tài)擴(kuò)縮容
在實(shí)現(xiàn)擴(kuò)容之前,需要通過(guò)監(jiān)控了解各節(jié)點(diǎn)當(dāng)前的在線(xiàn)推理狀態(tài),這里,主要是通過(guò)實(shí)時(shí)收集節(jié)點(diǎn)的負(fù)載(CPU、內(nèi)存)、請(qǐng)求的 QPS 和延時(shí)信息,來(lái)制定動(dòng)態(tài)的擴(kuò)容和縮容策略。

系統(tǒng)狀態(tài)實(shí)時(shí)監(jiān)控
此外,UAI-Inference 系統(tǒng)將 HTTP 請(qǐng)求、延時(shí)和 HTTP 返回碼實(shí)時(shí)記錄成日志,然后通過(guò)數(shù)據(jù)統(tǒng)計(jì)來(lái)在圖形界面展示 HTTP 請(qǐng)求量、延時(shí)、成功率等信息。平臺(tái)會(huì)實(shí)時(shí)收集所有計(jì)算節(jié)點(diǎn)的 stdout 數(shù)據(jù),并錄入日志系統(tǒng),用戶(hù)可以通過(guò)觀察線(xiàn)上運(yùn)行日志來(lái)了解線(xiàn)上運(yùn)行狀態(tài),并根據(jù)監(jiān)控信息自動(dòng)選擇擴(kuò)容和縮容。
高可用
除了基本的擴(kuò)縮容和負(fù)載均衡,我們也通過(guò)將計(jì)算節(jié)點(diǎn)集群化的方式,提供全系統(tǒng)容災(zāi)保障。如下圖所示,系統(tǒng)會(huì)把整個(gè)服務(wù)切分成多個(gè) set,部署在跨機(jī)房的某幾個(gè)機(jī)架或者區(qū)域里面,當(dāng)某一個(gè)機(jī)房或者 set 宕機(jī)時(shí),其他地區(qū)的在線(xiàn)推理處理還在進(jìn)行。這種方式的好處是當(dāng)出現(xiàn)單點(diǎn)故障時(shí),其他區(qū)域的計(jì)算節(jié)點(diǎn)能夠保證整個(gè)在線(xiàn)推理請(qǐng)求的正常執(zhí)行,避免因單節(jié)點(diǎn)故障導(dǎo)致的系統(tǒng)不可用。

總結(jié)
本文通過(guò)對(duì) UAI-Inference 的實(shí)現(xiàn)原理、架構(gòu)設(shè)計(jì)以及彈性擴(kuò)縮容、負(fù)載均衡、高可用等可靠策略的介紹,講解了大規(guī)模、高并發(fā)在線(xiàn)推理請(qǐng)求時(shí),UCloud 的部分解決策略和方案。希望能夠拋磚引玉,為其他開(kāi)發(fā)者做AI在線(xiàn)推理部署時(shí)帶來(lái)新的思路。
截止目前,UAI-Inference 提供了 CPU/GPU 數(shù)萬(wàn)節(jié)點(diǎn)的在線(xiàn)推理服務(wù)。未來(lái),我們會(huì)兼顧高性能在線(xiàn)服務(wù)和高性?xún)r(jià)比的在線(xiàn)服務(wù)兩個(gè)方向,同時(shí)提供針對(duì) GPU 硬件和 CPU 硬件的優(yōu)化技術(shù),進(jìn)一步提升在線(xiàn)服務(wù)的效率。同時(shí)也會(huì)著力于公有云和私有云的結(jié)合,后期將會(huì)推出私有云的在線(xiàn)推理服務(wù)。
作者 ·宋翔
UCloud 高級(jí)研發(fā)工程師。負(fù)責(zé) UCloud AI 產(chǎn)品的研發(fā)和運(yùn)營(yíng)工作,曾先后于系統(tǒng)領(lǐng)域頂級(jí)會(huì)議 Eurosys、Usinex ATC 等發(fā)表論文,在系統(tǒng)體系架構(gòu)方面具有豐富的經(jīng)驗(yàn)。