江寧遠 張華熊



摘? 要:Tensorflow Serving是Google開源的一個服務系統(tǒng),針對Tensorflow Serving單體應用吞吐量低、服務調(diào)用煩瑣、模型生命周期管理不完善等問題,本文設計了一種基于Tensorflow Serving的微服務軟件架構方案,在部署Tensorflow Serving的Docker(開源的應用容器引擎)容器里添加本文研發(fā)的監(jiān)控程序,該監(jiān)控程序根據(jù)各個實例模型加載情況,將可用模型服務主動注冊到微服務架構中的注冊中心以實現(xiàn)對模型的編排管理。實驗結果表明:采用本文的微服務架構方案,有效提升了Tensorflow Serving服務的吞吐量,降低了服務響應時間,簡化了模型調(diào)用流程,從而滿足Tensorflow Serving在生產(chǎn)環(huán)境中部署和運維的實際需求。
關鍵詞:Tensorflow Serving;微服務;第三方注冊
中圖分類號:TP311? ? ?文獻標識碼:A
Deep Learning Model Service System based on Microservice
JIANG Ningyuan, ZHANG Huaxiong
(School of Information, Zhejiang Sci-Tech University, Hangzhou 310018, China)
240662137@qq.com; zhxhz@zstu.edu.cn
Abstract: Tensorflow Serving, an open source service system of Google, has problems of low throughput of Tensorflow Serving single application, cumbersome service invocation, and imperfect model lifecycle management. Aiming at these problems, this paper proposes to design a microservice software architecture solution based on Tensorflow Serving. Monitoring program developed in this research is added to Docker (open source application container engine) container where Tensorflow Serving is deployed. The monitoring program actively registers available model services to the registry of the microservice architecture according to loading status of each instance model, so to realize orchestration management of the model. Experimental results show that the proposed microservice architecture solution effectively improves throughput of Tensorflow Serving services, reduces service response time, and simplifies model invocation process. It can meet actual needs of Tensorflow Serving deployment, operation, and maintenance in production environment.
Keywords: Tensorflow Serving; microservice; third-party registration
1? ?引言(Introduction)
TensorFlow[1]是目前主流的開源機器學習[2]平臺,它擁有一個包含各種工具、庫和社區(qū)資源的全面靈活的生態(tài)系統(tǒng)。為解決神經(jīng)網(wǎng)絡模型部署問題,TensorFlow推出在線原生模型服務系統(tǒng)Tensorflow Serving[3]。但隨著神經(jīng)網(wǎng)絡的發(fā)展,網(wǎng)絡的深度逐漸加深,進行模型推理所需要的計算資源也在不斷擴大。在線上的生產(chǎn)環(huán)境中,往往需要對請求進行即時響應,Tensorflow Serving這種單體架構已經(jīng)無法滿足企業(yè)對系統(tǒng)的需求,應當對其進行相應的架構調(diào)整。
微服務[4]是一種軟件架構風格,利用模組化的方式組合出復雜的大型應用程序。本文將Tensorflow Serving作為一個服務模塊嵌入微服務架構中,使可用模型服務主動注冊到微服務架構中的注冊中心。通過對模型的生命周期進行管理,使整個系統(tǒng)擁有更好的可擴展性、易維護性和資源隔離性。微服務架構下多實例化也能滿足高并發(fā)時的快速響應,大幅提高系統(tǒng)的性能。
2? ?相關技術簡介(Related technology introduction)
2.1? ?Tensorflow Serving簡介
2016年2月,TensorFlow團隊在GitHub開源一個名為“Tensorflow Serving”的項目。Tensorflow Serving是一種靈活、高性能的機器學習模型服務系統(tǒng),適用于生產(chǎn)環(huán)境,通過GRPC或HTTP接口對外提供服務,HTTP接口如表1所示。Tensorflow Serving 使得Tensorflow深度學習模型開箱即用,也可以輕松擴展服務于其他類型的模型和數(shù)據(jù)。
Tensorflow Serving加載的標準模型格式為pb模型,pb模型文件實際上是使用了protocol buffer格式存儲的模型圖和模型參數(shù)文件。如圖1所示,pb模型文件可以保存整個網(wǎng)絡模型(計算圖+參數(shù)),并將所有的變量固化為常量。
此外,Tensorflow Serving可以通過配置文件自定義模型版本的加載策略,管理模型迭代。在部署方面,Tensorflow Serving可以使用apt二級制安裝、源碼編譯和Docker[5]容器(官方推薦)部署,支持調(diào)用CPU和NVIDIA GPU資源。
2.2? ?服務注冊和發(fā)現(xiàn)簡介
服務注冊和發(fā)現(xiàn)[6]是微服務架構運行的基礎。服務注冊通常是將服務提供者的網(wǎng)絡信息發(fā)送至注冊中心[7],而后服務消費者通過服務發(fā)現(xiàn)從注冊中心獲取部署服務提供者所在的網(wǎng)絡地址。在這一過程中,注冊中心需要支持服務動態(tài)上下線并能夠?qū)崟r推送網(wǎng)絡信息列表的變化。注冊中心主要維護服務實例名稱及其相應的網(wǎng)絡地址信息,此外我們往往要對不健康或特定的實例進行篩選,那么注冊中心還需存儲實例的權重、健康狀態(tài)等數(shù)據(jù)。
自注冊和第三方注冊[8]是目前主要的兩種服務注冊方式。其中,自注冊是由服務實例本身負責在服務注冊表中注冊、注銷以及維持心跳。而在第三方注冊中,由一個第三方獨立的服務registrar通過輪詢部署環(huán)境或訂閱事件等方式去跟蹤運行中實例的變化,負責實例的注冊與注銷。
3? ?系統(tǒng)設計(System design)
3.1? ?系統(tǒng)設計原則
(1)擴展性。本系統(tǒng)是面向微服務設計的,開發(fā)的各組件需能夠獨立運行和部署,根據(jù)業(yè)務的需求,易于擴展,節(jié)省硬件成本。
(2)低開銷。嵌入原生Tensorflow Serving容器中的第三方監(jiān)控收集數(shù)據(jù)的業(yè)務邏輯應當簡單,沒有復雜的依賴,對服務器資源占用也較少,對被監(jiān)控對象的影響也要盡可能小。
(3)穩(wěn)定性。在生產(chǎn)環(huán)境中,網(wǎng)絡的波動、模型版本的迭代會經(jīng)常發(fā)生,系統(tǒng)需要保證模型服務的可用性、穩(wěn)定性。
(4)時效性。當模型服務新上線或不可用時,需要及時更新模型注冊列表,確保模型服務能被成功調(diào)用。
3.2? ?系統(tǒng)總體設計
系統(tǒng)總體架構如圖2所示,Tensorflow Serving作為模型服務的提供者,在微服務架構中要被服務消費者調(diào)用,消費者需要從注冊中心獲取服務提供者的服務名、IP及端口等信息。本系統(tǒng)在部署了Tensorflow Serving的Docker端里構建了一個第三方監(jiān)控程序,該監(jiān)控程序?qū)@取Tensorflow Serving的IP、端口、成功加載的模型名及模型版本號。獲得這些信息后,監(jiān)控程序通過HTTP接口以JSON的形式向注冊中心注冊模型信息。
模型注冊中心是整個系統(tǒng)中最基礎的組件,它維護各模型的信息,信息包括:模型名、模型版本號、模型健康狀態(tài)、模型服務IP地址及端口號等。其中模型健康狀態(tài)是由心跳檢測維持的,心跳的周期默認是5 s,若服務注冊中心在15 s內(nèi)沒收到某實例的心跳信息,就將該實例設置為不健康;若在30 s內(nèi)沒收到實例的心跳信息,就將該實例摘除。
如圖3所示,服務的調(diào)用可分為五個步驟:(1)第三方監(jiān)控程序獲取成功被Tensorflow Serving加載的模型相關信息。(2)第三方監(jiān)控程序向模型注冊中心進行模型注冊或注銷,并維持心跳。(3)模型注冊中心更新模型注冊表。(4)服務消費者從模型注冊中心獲取模型的調(diào)用地址信息。(5)服務消費者根據(jù)模型網(wǎng)絡地址,調(diào)用模型服務。
4? 系統(tǒng)實現(xiàn)及分析(System implementation and analysis)
4.1? ?監(jiān)控程序?qū)崿F(xiàn)
第三方監(jiān)控程序基于Spring Boot開發(fā),使用
@EnableSchedul開啟定時任務,實時監(jiān)測Tensorflow Serving狀態(tài)的變化。通過Tensorflow Serving已有的HTTP接口獲取模型及其版本的狀態(tài),監(jiān)控流程如圖4所示。
(1)信息的獲取:通過Monitoring日志信息獲取Tensorflow Serving加載的模型名;再根據(jù)模型名,通過Model status API獲取該模型的狀態(tài)信息,如表2所示。
操作方式 API信息
范例輸入 查詢ResNet模型信息
訪問方式 GET
范例URL http://localhost:8501/v1/models/ResNet
范例輸出 {
"model_version_status":
{
"version": "1",
"state": "AVAILABLE",
"status": {
"error_code": "OK",
"error_message": ""
}
}
}
(2)分析:根據(jù)Model status API返回的信息,同監(jiān)控程序本地模型表對比,判斷是否存在新增或異常的模型。
(3)執(zhí)行:向模型注冊中心進行模型注冊或注銷,并更新監(jiān)控程序本地模型表。
(4)此外,監(jiān)控程序還需定時向注冊中心發(fā)送心跳信息。
4.2? ?模型注冊中心實現(xiàn)
模型注冊中心基于Nacos,Nacos是阿里巴巴在2018年7月發(fā)布的一個易于構建云原生應用的動態(tài)服務發(fā)現(xiàn)、配置管理和服務管理平臺。Nacos與當前主流微服務框架Spring Cloud和Dubbo緊密融合,可通過NacosSync與Zookeeper、Eureka、Consul等主流注冊中心進行數(shù)據(jù)同步。在Nacos中,以{ip#端口#集群名#分組名@服務名}設定一個實例ID,本文模型注冊中心使用{ip#端口#集群名#模型名@版本號}來確定一個模型實例。本系統(tǒng)實現(xiàn)的模型注冊中心界面如圖5所示。
4.3? ?Docker端改造
第三方監(jiān)控程序需要和Tensorflow Serving在同一個Docker容器中運行,查閱Tensorflow Serving原生dockerfile文件,啟動命令為:
ENTRYPOINT ["/usr/bin/tf_serving_entrypoint.sh"]
那么只需在tf_serving_entrypoint.sh文檔中添加執(zhí)行第三方監(jiān)控程序的命令,如圖6所示。
4.4? ?實驗分析
為了評價第三方監(jiān)控程序?qū)υ鶷ensorflow Serving服務的性能影響,在進行監(jiān)控和不進行監(jiān)控的情況下對服務的平均響應時間、吞吐量進行對比,得出第三方監(jiān)控程序本身的執(zhí)行代價。服務器采用四臺物理機(操作系統(tǒng)Windows 7、Intel i5 4590@3.3 GHz CPU、8 GB內(nèi)存、10 M/s帶寬),其中一臺作為消費者使用性能測試工具ContiPerf,另外三臺分別部署Docker容器并加載ResNet模型提供模型調(diào)用服務。實驗對單節(jié)點有監(jiān)控和無監(jiān)控、多節(jié)點負載均衡(采用三臺相同配置的節(jié)點,并使用本系統(tǒng)的模型注冊中心,采用輪詢的負載均衡調(diào)用方式發(fā)送請求)三種情況進行對比,記錄不同請求并發(fā)數(shù)下服務平均響應時間和服務吞吐量的數(shù)值,實驗結果如圖7和圖8所示。
由圖7和圖8可知,隨并發(fā)請求數(shù)的增加,模型服務的平均響應時間也逐漸增加,且兩者基本成正比的關系。對比單節(jié)點有監(jiān)控和無監(jiān)控情況下服務響應時間及吞吐量的關系,計算得出由第三方監(jiān)控造成的服務響應延遲時間的代價為10—100 ms,對吞吐量幾乎不構成影響。同時當請求并發(fā)數(shù)達到20時,平均響應時間已達到1,000 ms,有明顯的響應延遲現(xiàn)象。當由1 個服務節(jié)點擴充至3 個服務節(jié)點并采用負載均衡的請求方式后,服務的吞吐量大幅提升,服務響應時間明顯下降。綜上所述,說明本文的基于微服務架構的深度學習模型服務系統(tǒng)在性能方面有明顯的優(yōu)勢。
5? ?結論(Conclusion)
本文改造Tensorflow Serving原生Docker端,在Docker容器中以較小的侵入性添加第三方監(jiān)控程序,并使用第三方注冊的模式同已有的微服務框架進行整合。仿真實驗結果表明,本文的基于微服務的深度學習模型服務系統(tǒng)設計,一定程度上簡化了模型的部署、調(diào)用;另一方面,實驗測試了多實例負載均衡的調(diào)用方式,實驗結果表明本文的設計符合高吞吐、高并發(fā)、高可用的性能要求。
參考文獻(References)
[1] 費寧,張浩然.TensorFlow架構與實現(xiàn)機制的研究[J].計算機技術與發(fā)展,2019,029(009):31-34.
[2] HAO X, ZHANG G, MA S. Deep learning[J]. International Journal of Semantic Computing, 2016, 10(03):417-439.
[3] OLSTON C, FIEDEL N, GOROVOY K, et al. TensorFlow-Serving: Flexible, high-performance ML serving[J/OL]. ArXiv Preprint ArXiv:1712.06139v2, 2017-12-27[2021-04-08]. https://arxiv.org/pdf/1712.06139.pdf.
[4] LARRUCEA X, SANTAMARIA I, COLOMO-PALACIOS R, et al. Microservices[J].IEEE Software, 2018, 35(3):96-100.
[5] 林躍,馮薇樺,孫源澤.基于Docker的容器虛擬化技術[J].中國新通信,2020,22(09):68.
[6] 段麗君.Web服務發(fā)現(xiàn)研究現(xiàn)狀分析[J].計算機科學與應用,2017,7(12):1270-1277.
[7] 張子龍,毛新軍,尹俊文,等.面向自主Web服務的注冊中心模型及其實現(xiàn)技術[J].計算機科學,2014,041(011):118-123.
[8] RICHARDSON C. Microservice patterns[M].Greenwich: Manning, 2017:80-85.
作者簡介:
江寧遠(1996-),男,碩士生.研究領域:軟件開發(fā),信息研究.
張華熊(1971-),男,博士,教授.研究領域:軟件開發(fā),信息研究.