導(dǎo)語(yǔ):如果說(shuō)算法和數(shù)據(jù)是跑車(chē)的發(fā)動(dòng)機(jī)和汽油,那么系統(tǒng)則是變速箱,穩(wěn)定而靈活的變速箱,是圖像識(shí)別服務(wù)向前推進(jìn)的基礎(chǔ)。算法、數(shù)據(jù)、系統(tǒng)三位一體,隨著算法的快速發(fā)展和數(shù)據(jù)的日益積累,系統(tǒng)也在高效而穩(wěn)定地升級(jí)。
成都創(chuàng)新互聯(lián)公司擁有一支富有激情的企業(yè)網(wǎng)站制作團(tuán)隊(duì),在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)深耕10余年,專(zhuān)業(yè)且經(jīng)驗(yàn)豐富。10余年網(wǎng)站優(yōu)化營(yíng)銷(xiāo)經(jīng)驗(yàn),我們已為成百上千中小企業(yè)提供了成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)解決方案,按需設(shè)計(jì),設(shè)計(jì)滿意,售后服務(wù)無(wú)憂。所有客戶皆提供一年免費(fèi)網(wǎng)站維護(hù)!1.高性能與高可靠
任何在線系統(tǒng)都面臨性能和可靠性的挑戰(zhàn)。在我們系統(tǒng)中,圖像識(shí)別服務(wù)作為在線服務(wù),需要能夠迅速響應(yīng)并返回,并且不管在框架層還是算法層,都要保證高可用性。
2.系統(tǒng)解耦&高可擴(kuò)展性
作為一個(gè)分布式的算法系統(tǒng),算法模塊與框架的解耦,可以使算法與后臺(tái)人員更高效的同步開(kāi)發(fā),分別對(duì)算法與框架進(jìn)行更新迭代。而高可擴(kuò)展性,既要求框架在集群上支持資源可擴(kuò)展,又要求做到單機(jī)算法的迅速接入與替換。
3.復(fù)雜業(yè)務(wù)與算法的支撐
隨著業(yè)務(wù)的持續(xù)接入和算法的復(fù)雜化,需要在框架層靈活的支撐算法,高效的算法模塊重用以及迅速適配新算法并接入新業(yè)務(wù)。
4.不同運(yùn)行環(huán)境的支持
算法系統(tǒng),尤其是圖像識(shí)別算法系統(tǒng),運(yùn)行環(huán)境包括CPU與GPU,框架除了要支持不同環(huán)境的高效運(yùn)行,也要支持不同環(huán)節(jié)運(yùn)行在不同硬件環(huán)境,以保證資源合理高效的使用。
算法研究&模型訓(xùn)練:
算法人員進(jìn)行算法研究、模型訓(xùn)練,以及業(yè)務(wù)對(duì)接。算法無(wú)需關(guān)心框架以及系統(tǒng)的調(diào)度,只需輸出單個(gè)模塊的算法SO和訓(xùn)練好的模型文件。
框架開(kāi)發(fā)&算法集成:
后臺(tái)開(kāi)發(fā)人員進(jìn)行服務(wù)框架的開(kāi)發(fā)及算法SO的集成運(yùn)行,即把算法研究人員研究好的算法及模型文件集成到服務(wù)框架中,提供穩(wěn)定的在線圖像識(shí)別服務(wù)。
接下來(lái)將重點(diǎn)介紹系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)。
框架層使用Java編碼,算法層采用插件化設(shè)計(jì),可以加載jar包、so或者其他腳本,這是一個(gè)多語(yǔ)言的混編系統(tǒng)。圖像識(shí)別算法一般都是計(jì)算密集型,并且一部分需要運(yùn)行在GPU上,所以在算法層,我們使用CUDA C++編寫(xiě)so,使用JNI掛載so進(jìn)行算法的執(zhí)行和調(diào)度。如圖1,架構(gòu)上主要分為三層:接入層、框架層、算法層,再加上評(píng)測(cè)系統(tǒng)、存儲(chǔ)系統(tǒng)、監(jiān)控告警系統(tǒng)、日志系統(tǒng)等周邊系統(tǒng)構(gòu)成一套完整的圖像識(shí)別服務(wù)系統(tǒng)。
圖1 圖像識(shí)別服務(wù)框架系統(tǒng)構(gòu)架圖
接入層:包括協(xié)議轉(zhuǎn)換、參數(shù)輸配和結(jié)果適配等
框架層:圖像識(shí)別服務(wù)運(yùn)行的系統(tǒng)框架,加載運(yùn)行算法SO,提供穩(wěn)定的識(shí)別服務(wù),包括
Master:接收接入層的請(qǐng)求,進(jìn)行請(qǐng)求拆分、請(qǐng)求調(diào)度、結(jié)果合并等
Worker:實(shí)際執(zhí)行算法的進(jìn)程載體,主要包含算法SO/模型的加載、更新,進(jìn)行算法的執(zhí)行
Zookeeper:存儲(chǔ)worker心跳信息、算法映射關(guān)系、算法執(zhí)行計(jì)劃、算法靜態(tài)/動(dòng)態(tài)快照信息等
ConfigServer:監(jiān)聽(tīng)worker心跳并實(shí)時(shí)更新動(dòng)態(tài)動(dòng)態(tài)路由表,觸發(fā)master更新路由規(guī)則及連接池
算法層:算法人員提供各種算法模型及算法so
周邊系統(tǒng)
評(píng)測(cè)系統(tǒng):提供版本評(píng)測(cè)功能
存儲(chǔ)系統(tǒng):非敏感圖片及badcase存儲(chǔ)
監(jiān)控告警:監(jiān)控服務(wù)的運(yùn)行狀態(tài),在異常時(shí)進(jìn)行告警
日志系統(tǒng):請(qǐng)求日志的存儲(chǔ),為問(wèn)題的跟蹤排查提供依據(jù)框架運(yùn)行時(shí)
本節(jié)將結(jié)合實(shí)際的OCR預(yù)測(cè)請(qǐng)求剖析框架的運(yùn)行態(tài)。
1) 一個(gè)OCR識(shí)別實(shí)例
如圖2,我們以STR(Scene Text Recognition,場(chǎng)景文字識(shí)別)為例,一個(gè)典型的使用場(chǎng)景為廣告圖片素材理解。在任務(wù)中,我們將識(shí)別圖片中文字,并給出具體坐標(biāo)。
圖2 一個(gè)OCR識(shí)別實(shí)例
2) 系統(tǒng)運(yùn)行態(tài)
如圖3,我們?cè)敿?xì)剖析上述實(shí)例在框架中的運(yùn)行過(guò)程
圖3 系統(tǒng)運(yùn)行態(tài)
1. 業(yè)務(wù)側(cè)的請(qǐng)求攜帶圖片內(nèi)容(或圖片URL)、bid(標(biāo)識(shí)不同的業(yè)務(wù))及tid(標(biāo)識(shí)不同算法大類(lèi))。
2. 在master節(jié)點(diǎn)找到對(duì)應(yīng)的算法,然后找到相應(yīng)執(zhí)行計(jì)劃,執(zhí)行計(jì)劃中定義了算法的執(zhí)行步驟;根據(jù)各個(gè)步驟找到相應(yīng)的路由節(jié)點(diǎn),master將請(qǐng)求拆分/打包/路由到相應(yīng)的worker
3. master將原始圖片路由分發(fā)到檢測(cè)子系統(tǒng)。檢測(cè)過(guò)程運(yùn)行在GPU上,算法so檢測(cè)出模塊中各個(gè)圖片框(如圖2中的“京東”、“內(nèi)外真皮”等),切分好之后將結(jié)果返回給master
4. master將檢測(cè)結(jié)果拆分,并行分發(fā)到識(shí)別子系統(tǒng)。識(shí)別過(guò)程運(yùn)行在GPU上,算法so將識(shí)別出單個(gè)圖片框的文字,分別返回給master
5. master將識(shí)別結(jié)果匯總,一起發(fā)送到重排序子系統(tǒng)。重排序子系統(tǒng)運(yùn)行在CPU上,算法so將結(jié)果返回給master
6. master將最終結(jié)果封裝并返回
每個(gè)模塊在整個(gè)過(guò)程中的作用為:
算法映射:由bid+tid映射到一個(gè)具體的子算法。相同的tid與不同的bid組合,可以支持不同業(yè)務(wù)對(duì)同類(lèi)算法的定制
執(zhí)行計(jì)劃:定義算法的執(zhí)行步驟,比如圖中STR圖片文字識(shí)別,包含三個(gè)步驟:檢測(cè)、識(shí)別和重排序
動(dòng)態(tài)快照:即動(dòng)態(tài)路由表,定義了算法每個(gè)階段映射到的具體節(jié)點(diǎn)。worker上報(bào)心跳,由ConfigServer整理生成動(dòng)態(tài)路由表,由Master節(jié)點(diǎn)監(jiān)聽(tīng)路由表的變更
熱更新能力是一個(gè)系統(tǒng)提供可靠和穩(wěn)定服務(wù)的基礎(chǔ)功能,即可以保證系統(tǒng)的無(wú)損升級(jí),又可以保障系統(tǒng)的容災(zāi)能力。如圖4,系統(tǒng)主要借助zookeeper和worker的心跳機(jī)制實(shí)現(xiàn)集群熱更新。
圖4 集群熱更新
Worker:在啟動(dòng)的時(shí)候與zookeeper建立臨時(shí)節(jié)點(diǎn)維持心跳信息
Configserver:監(jiān)聽(tīng)worker在zookeeper的心跳信息,如果worker斷連或重連,configserver立刻感知到并修改動(dòng)態(tài)快照
Master:監(jiān)聽(tīng)zookeeper上的動(dòng)態(tài)快照信息,動(dòng)態(tài)快照變更立刻觸發(fā)路由規(guī)則及路由連接池的更新
通過(guò)這幾個(gè)角色的配合,在worker節(jié)點(diǎn)出現(xiàn)異常的情況下,master迅速就完成了切換,保證了系統(tǒng)的穩(wěn)定。這種機(jī)制也支持了集群的熱更新,在需要對(duì)某個(gè)worker進(jìn)行更新時(shí),先對(duì)worker進(jìn)行下線,master感知后不向此worker發(fā)請(qǐng)求,完成更新啟動(dòng)后,master再跟其重新建立連接并發(fā)送請(qǐng)求。
單點(diǎn)熱更新,指的是在不重啟服務(wù)的前提下,對(duì)進(jìn)程內(nèi)單個(gè)或多個(gè)模塊進(jìn)行替換升級(jí)。與其他業(yè)務(wù)系統(tǒng)不一樣的,在算法平臺(tái)下,考慮以下兩種場(chǎng)景:
1) 一個(gè)進(jìn)程內(nèi)加載了多個(gè)算法SO,需要對(duì)其中一個(gè)算法模塊進(jìn)行更新;
2) 算法鏈上串行多個(gè)模塊,需要對(duì)其中一個(gè)模塊進(jìn)行實(shí)驗(yàn)或更新。
這兩種場(chǎng)景下,使用集群熱更新或者對(duì)進(jìn)程進(jìn)行重啟,就有點(diǎn)重了,所以我們實(shí)現(xiàn)了一套進(jìn)程內(nèi)單個(gè)so的動(dòng)態(tài)更新方案。通過(guò)Java代碼是無(wú)法直接實(shí)現(xiàn)SO的動(dòng)態(tài)加載的,如圖4,我們引入了代理so,通過(guò)在代理so進(jìn)行(dlopen,dlsym和dlclose)操作,從而達(dá)到動(dòng)態(tài)加載SO的目的。同時(shí)在代理so中,我們封裝了所有JNI轉(zhuǎn)換和算法需要使用的接口,很好的進(jìn)行了框架和算法的解耦。除了so的動(dòng)態(tài)加載,我們還實(shí)現(xiàn)了模型的動(dòng)態(tài)加載。
圖5 單點(diǎn)熱更新
通常在分布式框架中,是不需要靜態(tài)快照的。但在算法系統(tǒng)中,我們通常需要頻繁上下線一批so,而這些so會(huì)分布在不同機(jī)器不同節(jié)點(diǎn)上。雖然簡(jiǎn)單的通過(guò)上傳/刪除服務(wù)器上的本地so文件,可以觸發(fā)相關(guān)進(jìn)程的動(dòng)態(tài)加載/卸載,但這種操作繁復(fù),在算法復(fù)雜,一個(gè)進(jìn)程加載了很多so的時(shí)候,操作容易出錯(cuò)。所以,這里我們需要在運(yùn)維上對(duì)系統(tǒng)進(jìn)行優(yōu)化,提高系統(tǒng)可運(yùn)維性。
如圖5,我們?cè)趧?dòng)態(tài)快照的同時(shí)還引入了靜態(tài)快照,靜態(tài)快照由運(yùn)維通過(guò)腳本或配置文件寫(xiě)入靜態(tài)路由表,將一個(gè)集群的預(yù)期初始狀態(tài)配置到zookeeper上。ConfigServer整理靜態(tài)快照和worker上報(bào)的心跳信息,生成最終的動(dòng)態(tài)快照。
圖6 靜態(tài)快照
這種動(dòng)靜態(tài)快照結(jié)合的集群快照機(jī)制相比只有動(dòng)態(tài)快照在運(yùn)維上會(huì)稍微復(fù)雜,但可以通過(guò)運(yùn)維工具降低復(fù)雜度。動(dòng)靜態(tài)集群快照機(jī)制優(yōu)勢(shì)也很明顯,第一、在復(fù)雜算法下,不容易出錯(cuò);第二、可以在動(dòng)態(tài)快照之余快速上下線一些算法或者更改算法流程。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。