數平精準推薦 | OCR技術之系統篇

導語:如果說算法和數據是跑車的發動機和汽油,那麼系統則是變速箱,穩定而靈活的變速箱,是圖像識別服務向前推進的基礎。算法、數據、系統三位一體,隨著算法的快速發展和數據的日益積累,系統也在高效而穩定地升級。

一、背景介紹

前面的系列文章分別介紹了算法和數據,如果說算法和數據是跑車的發動機和汽油,那麼系統則是變速箱,穩定而靈活的變速箱,是圖像識別服務向前推進的基礎。算法、數據、系統三位一體,組合成完整的OCR在線服務。伴隨著算法的升級和業務的持續接入,系統也經歷了從單機版升級到分佈式版本;從為了每個算法定製系統模塊,到分離框架和算法邏輯,提高算法的運行效率和模塊的可重用性;從單一的運行環境,升級到CPU/GPU異構並行。除了一般分佈式系統所需要提供的功能,我們還結合算法和運維特性,增加了單點熱更新和集群快照等特性。

二、我們面臨的挑戰

圖像識別服務框架作為一個提供在線服務的系統,既面臨一般的業務系統或平臺所面臨的挑戰,也面臨作為算法系統,需要支撐複雜算法和業務的挑戰,主要表現在以下幾點:

1.高性能與高可靠

任何在線系統都面臨性能和可靠性的挑戰。在我們系統中,圖像識別服務作為在線服務,需要能夠迅速響應並返回,並且不管在框架層還是算法層,都要保證高可用性。

2.系統解耦&高可擴展性

作為一個分佈式的算法系統,算法模塊與框架的解耦,可以使算法與後臺人員更高效的同步開發,分別對算法與框架進行更新迭代。而高可擴展性,既要求框架在集群上支持資源可擴展,又要求做到單機算法的迅速接入與替換。

3.複雜業務與算法的支撐

隨著業務的持續接入和算法的複雜化,需要在框架層靈活的支撐算法,高效的算法模塊重用以及迅速適配新算法並接入新業務。

4.不同運行環境的支持

算法系統,尤其是圖像識別算法系統,運行環境包括CPU與GPU,框架除了要支持不同環境的高效運行,也要支持不同環節運行在不同硬件環境,以保證資源合理高效的使用。

三、我們的解決方案

圖像識別從算法研究、模型訓練到規模化的提供服務,需要處理的流程比較多,我們將開發階段主要分為如下兩個階段:

算法研究&模型訓練:

算法人員進行算法研究、模型訓練,以及業務對接。算法無需關心框架以及系統的調度,只需輸出單個模塊的算法SO和訓練好的模型文件。

框架開發&算法集成:

後臺開發人員進行服務框架的開發及算法SO的集成運行,即把算法研究人員研究好的算法及模型文件集成到服務框架中,提供穩定的在線圖像識別服務。

接下來將重點介紹系統的設計和實現。

四、圖像識別服務框架

4.1 系統架構

框架層使用Java編碼,算法層採用插件化設計,可以加載jar包、so或者其他腳本,這是一個多語言的混編系統。圖像識別算法一般都是計算密集型,並且一部分需要運行在GPU上,所以在算法層,我們使用CUDA C++編寫so,使用JNI掛載so進行算法的執行和調度。如圖1,架構上主要分為三層:接入層、框架層、算法層,再加上評測系統、存儲系統、監控告警系統、日誌系統等周邊系統構成一套完整的圖像識別服務系統。

數平精準推薦 | OCR技術之系統篇

圖1 圖像識別服務框架系統構架圖

接入層:包括協議轉換、參數輸配和結果適配等

框架層:圖像識別服務運行的系統框架,加載運行算法SO,提供穩定的識別服務,包括

  • Master:接收接入層的請求,進行請求拆分、請求調度、結果合併等
  • Worker:實際執行算法的進程載體,主要包含算法SO/模型的加載、更新,進行算法的執行
  • Zookeeper:存儲worker心跳信息、算法映射關係、算法執行計劃、算法靜態/動態快照信息等
  • ConfigServer:監聽worker心跳並實時更新動態動態路由表,觸發master更新路由規則及連接池

算法層:算法人員提供各種算法模型及算法so

周邊系統

  • 評測系統:提供版本評測功能
  • 存儲系統:非敏感圖片及badcase存儲
  • 監控告警:監控服務的運行狀態,在異常時進行告警
  • 日誌系統:請求日誌的存儲,為問題的跟蹤排查提供依據框架運行時

4.2 系統運行態

本節將結合實際的OCR預測請求剖析框架的運行態。

1) 一個OCR識別實例

如圖2,我們以STR(Scene Text Recognition,場景文字識別)為例,一個典型的使用場景為廣告圖片素材理解。在任務中,我們將識別圖片中文字,並給出具體座標。

數平精準推薦 | OCR技術之系統篇

圖2 一個OCR識別實例

2) 系統運行態

如圖3,我們詳細剖析上述實例在框架中的運行過程

數平精準推薦 | OCR技術之系統篇

圖3 系統運行態

1. 業務側的請求攜帶圖片內容(或圖片URL)、bid(標識不同的業務)及tid(標識不同算法大類)。

2. 在master節點找到對應的算法,然後找到相應執行計劃,執行計劃中定義了算法的執行步驟;根據各個步驟找到相應的路由節點,master將請求拆分/打包/路由到相應的worker

3. master將原始圖片路由分發到檢測子系統。檢測過程運行在GPU上,算法so檢測出模塊中各個圖片框(如圖2中的“京東”、“內外真皮”等),切分好之後將結果返回給master

4. master將檢測結果拆分,並行分發到識別子系統。識別過程運行在GPU上,算法so將識別出單個圖片框的文字,分別返回給master

5. master將識別結果彙總,一起發送到重排序子系統。重排序子系統運行在CPU上,算法so將結果返回給master

6. master將最終結果封裝並返回

每個模塊在整個過程中的作用為:

  • 算法映射:由bid+tid映射到一個具體的子算法。相同的tid與不同的bid組合,可以支持不同業務對同類算法的定製
  • 執行計劃:定義算法的執行步驟,比如圖中STR圖片文字識別,包含三個步驟:檢測、識別和重排序
  • 動態快照:即動態路由表,定義了算法每個階段映射到的具體節點。worker上報心跳,由ConfigServer整理生成動態路由表,由Master節點監聽路由表的變更

4.3 容災與集群熱更新

熱更新能力是一個系統提供可靠和穩定服務的基礎功能,即可以保證系統的無損升級,又可以保障系統的容災能力。如圖4,系統主要藉助zookeeper和worker的心跳機制實現集群熱更新。

數平精準推薦 | OCR技術之系統篇

圖4 集群熱更新

  • Worker:在啟動的時候與zookeeper建立臨時節點維持心跳信息
  • Configserver:監聽worker在zookeeper的心跳信息,如果worker斷連或重連,configserver立刻感知到並修改動態快照
  • Master:監聽zookeeper上的動態快照信息,動態快照變更立刻觸發路由規則及路由連接池的更新

通過這幾個角色的配合,在worker節點出現異常的情況下,master迅速就完成了切換,保證了系統的穩定。這種機制也支持了集群的熱更新,在需要對某個worker進行更新時,先對worker進行下線,master感知後不向此worker發請求,完成更新啟動後,master再跟其重新建立連接併發送請求。

4.4 單點熱更新

單點熱更新,指的是在不重啟服務的前提下,對進程內單個或多個模塊進行替換升級。與其他業務系統不一樣的,在算法平臺下,考慮以下兩種場景:

1) 一個進程內加載了多個算法SO,需要對其中一個算法模塊進行更新;

2) 算法鏈上串行多個模塊,需要對其中一個模塊進行實驗或更新。

這兩種場景下,使用集群熱更新或者對進程進行重啟,就有點重了,所以我們實現了一套進程內單個so的動態更新方案。通過Java代碼是無法直接實現SO的動態加載的,如圖4,我們引入了代理so,通過在代理so進行(dlopen,dlsym和dlclose)操作,從而達到動態加載SO的目的。同時在代理so中,我們封裝了所有JNI轉換和算法需要使用的接口,很好的進行了框架和算法的解耦。除了so的動態加載,我們還實現了模型的動態加載。

數平精準推薦 | OCR技術之系統篇

圖5 單點熱更新

4.5 靜態快照

通常在分佈式框架中,是不需要靜態快照的。但在算法系統中,我們通常需要頻繁上下線一批so,而這些so會分佈在不同機器不同節點上。雖然簡單的通過上傳/刪除服務器上的本地so文件,可以觸發相關進程的動態加載/卸載,但這種操作繁複,在算法複雜,一個進程加載了很多so的時候,操作容易出錯。所以,這裡我們需要在運維上對系統進行優化,提高系統可運維性。

如圖5,我們在動態快照的同時還引入了靜態快照,靜態快照由運維通過腳本或配置文件寫入靜態路由表,將一個集群的預期初始狀態配置到zookeeper上。ConfigServer整理靜態快照和worker上報的心跳信息,生成最終的動態快照。

數平精準推薦 | OCR技術之系統篇

圖6 靜態快照

這種動靜態快照結合的集群快照機制相比只有動態快照在運維上會稍微複雜,但可以通過運維工具降低複雜度。動靜態集群快照機制優勢也很明顯,第一、在複雜算法下,不容易出錯;第二、可以在動態快照之餘快速上下線一些算法或者更改算法流程。

五、框架的一些思考

我們成功地將Java與CUDA C++混編系統作為圖像識別服務框架,並且支撐了眾多業務。成熟穩定的框架,可以解放更多的人力用於算法開發和業務接入。依託於Java成熟的開源工具,可以迅速開發出框架和進行維護,使用Java作為框架調度層和網絡層,對比傳統C++框架並沒有性能差異;而使用CUDA C++編寫SO的方式,可以更好的適配GPU環境和深度學習框架,更高效地利用機器計算資源。當然,我們的系統還在持續進化,後續將進一步在資源利用率、調度效率、業務接入速度和運維精細化等方向繼續努力。

六、結束語

我們推出了OCR技術系列文章總共包括了《OCR技術之檢測篇》、《OCR技術之識別篇》、《OCR技術之數據篇》、《OCR技術之系統篇》等4篇文章,希望通過這些文章能夠與大家一同探討OCR領域的一些技術與應用。在後續的工作中,團隊也將繼續在OCR領域深耕細作,不斷前行,持續提升技術水平與服務質量,為OCR技術的發展貢獻微薄之力。

原文發佈於微信公眾號 - 騰訊技術工程官方號(Tencent_TEG)

相關推薦

推薦中...