江寧遠(yuǎn) 張華熊
摘? 要:Tensorflow Serving是Google開源的一個(gè)服務(wù)系統(tǒng),針對Tensorflow Serving單體應(yīng)用吞吐量低、服務(wù)調(diào)用煩瑣、模型生命周期管理不完善等問題,本文設(shè)計(jì)了一種基于Tensorflow Serving的微服務(wù)軟件架構(gòu)方案,在部署Tensorflow Serving的Docker(開源的應(yīng)用容器引擎)容器里添加本文研發(fā)的監(jiān)控程序,該監(jiān)控程序根據(jù)各個(gè)實(shí)例模型加載情況,將可用模型服務(wù)主動注冊到微服務(wù)架構(gòu)中的注冊中心以實(shí)現(xiàn)對模型的編排管理。實(shí)驗(yàn)結(jié)果表明:采用本文的微服務(wù)架構(gòu)方案,有效提升了Tensorflow Serving服務(wù)的吞吐量,降低了服務(wù)響應(yīng)時(shí)間,簡化了模型調(diào)用流程,從而滿足Tensorflow Serving在生產(chǎn)環(huán)境中部署和運(yùn)維的實(shí)際需求。
關(guān)鍵詞:Tensorflow Serving;微服務(wù);第三方注冊
中圖分類號:TP311? ? ?文獻(xiàn)標(biāo)識碼: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]是目前主流的開源機(jī)器學(xué)習(xí)[2]平臺,它擁有一個(gè)包含各種工具、庫和社區(qū)資源的全面靈活的生態(tài)系統(tǒng)。為解決神經(jīng)網(wǎng)絡(luò)模型部署問題,TensorFlow推出在線原生模型服務(wù)系統(tǒng)Tensorflow Serving[3]。但隨著神經(jīng)網(wǎng)絡(luò)的發(fā)展,網(wǎng)絡(luò)的深度逐漸加深,進(jìn)行模型推理所需要的計(jì)算資源也在不斷擴(kuò)大。在線上的生產(chǎn)環(huán)境中,往往需要對請求進(jìn)行即時(shí)響應(yīng),Tensorflow Serving這種單體架構(gòu)已經(jīng)無法滿足企業(yè)對系統(tǒng)的需求,應(yīng)當(dāng)對其進(jìn)行相應(yīng)的架構(gòu)調(diào)整。
微服務(wù)[4]是一種軟件架構(gòu)風(fēng)格,利用模組化的方式組合出復(fù)雜的大型應(yīng)用程序。本文將Tensorflow Serving作為一個(gè)服務(wù)模塊嵌入微服務(wù)架構(gòu)中,使可用模型服務(wù)主動注冊到微服務(wù)架構(gòu)中的注冊中心。通過對模型的生命周期進(jìn)行管理,使整個(gè)系統(tǒng)擁有更好的可擴(kuò)展性、易維護(hù)性和資源隔離性。微服務(wù)架構(gòu)下多實(shí)例化也能滿足高并發(fā)時(shí)的快速響應(yīng),大幅提高系統(tǒng)的性能。
2? ?相關(guān)技術(shù)簡介(Related technology introduction)
2.1? ?Tensorflow Serving簡介
2016年2月,TensorFlow團(tuán)隊(duì)在GitHub開源一個(gè)名為“Tensorflow Serving”的項(xiàng)目。Tensorflow Serving是一種靈活、高性能的機(jī)器學(xué)習(xí)模型服務(wù)系統(tǒng),適用于生產(chǎn)環(huán)境,通過GRPC或HTTP接口對外提供服務(wù),HTTP接口如表1所示。Tensorflow Serving 使得Tensorflow深度學(xué)習(xí)模型開箱即用,也可以輕松擴(kuò)展服務(wù)于其他類型的模型和數(shù)據(jù)。
Tensorflow Serving加載的標(biāo)準(zhǔn)模型格式為pb模型,pb模型文件實(shí)際上是使用了protocol buffer格式存儲的模型圖和模型參數(shù)文件。如圖1所示,pb模型文件可以保存整個(gè)網(wǎng)絡(luò)模型(計(jì)算圖+參數(shù)),并將所有的變量固化為常量。
此外,Tensorflow Serving可以通過配置文件自定義模型版本的加載策略,管理模型迭代。在部署方面,Tensorflow Serving可以使用apt二級制安裝、源碼編譯和Docker[5]容器(官方推薦)部署,支持調(diào)用CPU和NVIDIA GPU資源。
2.2? ?服務(wù)注冊和發(fā)現(xiàn)簡介
服務(wù)注冊和發(fā)現(xiàn)[6]是微服務(wù)架構(gòu)運(yùn)行的基礎(chǔ)。服務(wù)注冊通常是將服務(wù)提供者的網(wǎng)絡(luò)信息發(fā)送至注冊中心[7],而后服務(wù)消費(fèi)者通過服務(wù)發(fā)現(xiàn)從注冊中心獲取部署服務(wù)提供者所在的網(wǎng)絡(luò)地址。在這一過程中,注冊中心需要支持服務(wù)動態(tài)上下線并能夠?qū)崟r(shí)推送網(wǎng)絡(luò)信息列表的變化。注冊中心主要維護(hù)服務(wù)實(shí)例名稱及其相應(yīng)的網(wǎng)絡(luò)地址信息,此外我們往往要對不健康或特定的實(shí)例進(jìn)行篩選,那么注冊中心還需存儲實(shí)例的權(quán)重、健康狀態(tài)等數(shù)據(jù)。
自注冊和第三方注冊[8]是目前主要的兩種服務(wù)注冊方式。其中,自注冊是由服務(wù)實(shí)例本身負(fù)責(zé)在服務(wù)注冊表中注冊、注銷以及維持心跳。而在第三方注冊中,由一個(gè)第三方獨(dú)立的服務(wù)registrar通過輪詢部署環(huán)境或訂閱事件等方式去跟蹤運(yùn)行中實(shí)例的變化,負(fù)責(zé)實(shí)例的注冊與注銷。
3? ?系統(tǒng)設(shè)計(jì)(System design)
3.1? ?系統(tǒng)設(shè)計(jì)原則
(1)擴(kuò)展性。本系統(tǒng)是面向微服務(wù)設(shè)計(jì)的,開發(fā)的各組件需能夠獨(dú)立運(yùn)行和部署,根據(jù)業(yè)務(wù)的需求,易于擴(kuò)展,節(jié)省硬件成本。
(2)低開銷。嵌入原生Tensorflow Serving容器中的第三方監(jiān)控收集數(shù)據(jù)的業(yè)務(wù)邏輯應(yīng)當(dāng)簡單,沒有復(fù)雜的依賴,對服務(wù)器資源占用也較少,對被監(jiān)控對象的影響也要盡可能小。
(3)穩(wěn)定性。在生產(chǎn)環(huán)境中,網(wǎng)絡(luò)的波動、模型版本的迭代會經(jīng)常發(fā)生,系統(tǒng)需要保證模型服務(wù)的可用性、穩(wěn)定性。
(4)時(shí)效性。當(dāng)模型服務(wù)新上線或不可用時(shí),需要及時(shí)更新模型注冊列表,確保模型服務(wù)能被成功調(diào)用。
3.2? ?系統(tǒng)總體設(shè)計(jì)
系統(tǒng)總體架構(gòu)如圖2所示,Tensorflow Serving作為模型服務(wù)的提供者,在微服務(wù)架構(gòu)中要被服務(wù)消費(fèi)者調(diào)用,消費(fèi)者需要從注冊中心獲取服務(wù)提供者的服務(wù)名、IP及端口等信息。本系統(tǒng)在部署了Tensorflow Serving的Docker端里構(gòu)建了一個(gè)第三方監(jiān)控程序,該監(jiān)控程序?qū)@取Tensorflow Serving的IP、端口、成功加載的模型名及模型版本號。獲得這些信息后,監(jiān)控程序通過HTTP接口以JSON的形式向注冊中心注冊模型信息。
模型注冊中心是整個(gè)系統(tǒng)中最基礎(chǔ)的組件,它維護(hù)各模型的信息,信息包括:模型名、模型版本號、模型健康狀態(tài)、模型服務(wù)IP地址及端口號等。其中模型健康狀態(tài)是由心跳檢測維持的,心跳的周期默認(rèn)是5 s,若服務(wù)注冊中心在15 s內(nèi)沒收到某實(shí)例的心跳信息,就將該實(shí)例設(shè)置為不健康;若在30 s內(nèi)沒收到實(shí)例的心跳信息,就將該實(shí)例摘除。
如圖3所示,服務(wù)的調(diào)用可分為五個(gè)步驟:(1)第三方監(jiān)控程序獲取成功被Tensorflow Serving加載的模型相關(guān)信息。(2)第三方監(jiān)控程序向模型注冊中心進(jìn)行模型注冊或注銷,并維持心跳。(3)模型注冊中心更新模型注冊表。(4)服務(wù)消費(fèi)者從模型注冊中心獲取模型的調(diào)用地址信息。(5)服務(wù)消費(fèi)者根據(jù)模型網(wǎng)絡(luò)地址,調(diào)用模型服務(wù)。
4? 系統(tǒng)實(shí)現(xiàn)及分析(System implementation and analysis)
4.1? ?監(jiān)控程序?qū)崿F(xiàn)
第三方監(jiān)控程序基于Spring Boot開發(fā),使用
@EnableSchedul開啟定時(shí)任務(wù),實(shí)時(shí)監(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í)行:向模型注冊中心進(jìn)行模型注冊或注銷,并更新監(jiān)控程序本地模型表。
(4)此外,監(jiān)控程序還需定時(shí)向注冊中心發(fā)送心跳信息。
4.2? ?模型注冊中心實(shí)現(xiàn)
模型注冊中心基于Nacos,Nacos是阿里巴巴在2018年7月發(fā)布的一個(gè)易于構(gòu)建云原生應(yīng)用的動態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺。Nacos與當(dāng)前主流微服務(wù)框架Spring Cloud和Dubbo緊密融合,可通過NacosSync與Zookeeper、Eureka、Consul等主流注冊中心進(jìn)行數(shù)據(jù)同步。在Nacos中,以{ip#端口#集群名#分組名@服務(wù)名}設(shè)定一個(gè)實(shí)例ID,本文模型注冊中心使用{ip#端口#集群名#模型名@版本號}來確定一個(gè)模型實(shí)例。本系統(tǒng)實(shí)現(xiàn)的模型注冊中心界面如圖5所示。
4.3? ?Docker端改造
第三方監(jiān)控程序需要和Tensorflow Serving在同一個(gè)Docker容器中運(yùn)行,查閱Tensorflow Serving原生dockerfile文件,啟動命令為:
ENTRYPOINT ["/usr/bin/tf_serving_entrypoint.sh"]
那么只需在tf_serving_entrypoint.sh文檔中添加執(zhí)行第三方監(jiān)控程序的命令,如圖6所示。
4.4? ?實(shí)驗(yàn)分析
為了評價(jià)第三方監(jiān)控程序?qū)υ鶷ensorflow Serving服務(wù)的性能影響,在進(jìn)行監(jiān)控和不進(jìn)行監(jiān)控的情況下對服務(wù)的平均響應(yīng)時(shí)間、吞吐量進(jìn)行對比,得出第三方監(jiān)控程序本身的執(zhí)行代價(jià)。服務(wù)器采用四臺物理機(jī)(操作系統(tǒng)Windows 7、Intel i5 4590@3.3 GHz CPU、8 GB內(nèi)存、10 M/s帶寬),其中一臺作為消費(fèi)者使用性能測試工具ContiPerf,另外三臺分別部署Docker容器并加載ResNet模型提供模型調(diào)用服務(wù)。實(shí)驗(yàn)對單節(jié)點(diǎn)有監(jiān)控和無監(jiān)控、多節(jié)點(diǎn)負(fù)載均衡(采用三臺相同配置的節(jié)點(diǎn),并使用本系統(tǒng)的模型注冊中心,采用輪詢的負(fù)載均衡調(diào)用方式發(fā)送請求)三種情況進(jìn)行對比,記錄不同請求并發(fā)數(shù)下服務(wù)平均響應(yīng)時(shí)間和服務(wù)吞吐量的數(shù)值,實(shí)驗(yàn)結(jié)果如圖7和圖8所示。
由圖7和圖8可知,隨并發(fā)請求數(shù)的增加,模型服務(wù)的平均響應(yīng)時(shí)間也逐漸增加,且兩者基本成正比的關(guān)系。對比單節(jié)點(diǎn)有監(jiān)控和無監(jiān)控情況下服務(wù)響應(yīng)時(shí)間及吞吐量的關(guān)系,計(jì)算得出由第三方監(jiān)控造成的服務(wù)響應(yīng)延遲時(shí)間的代價(jià)為10—100 ms,對吞吐量幾乎不構(gòu)成影響。同時(shí)當(dāng)請求并發(fā)數(shù)達(dá)到20時(shí),平均響應(yīng)時(shí)間已達(dá)到1,000 ms,有明顯的響應(yīng)延遲現(xiàn)象。當(dāng)由1 個(gè)服務(wù)節(jié)點(diǎn)擴(kuò)充至3 個(gè)服務(wù)節(jié)點(diǎn)并采用負(fù)載均衡的請求方式后,服務(wù)的吞吐量大幅提升,服務(wù)響應(yīng)時(shí)間明顯下降。綜上所述,說明本文的基于微服務(wù)架構(gòu)的深度學(xué)習(xí)模型服務(wù)系統(tǒng)在性能方面有明顯的優(yōu)勢。
5? ?結(jié)論(Conclusion)
本文改造Tensorflow Serving原生Docker端,在Docker容器中以較小的侵入性添加第三方監(jiān)控程序,并使用第三方注冊的模式同已有的微服務(wù)框架進(jìn)行整合。仿真實(shí)驗(yàn)結(jié)果表明,本文的基于微服務(wù)的深度學(xué)習(xí)模型服務(wù)系統(tǒng)設(shè)計(jì),一定程度上簡化了模型的部署、調(diào)用;另一方面,實(shí)驗(yàn)測試了多實(shí)例負(fù)載均衡的調(diào)用方式,實(shí)驗(yàn)結(jié)果表明本文的設(shè)計(jì)符合高吞吐、高并發(fā)、高可用的性能要求。
參考文獻(xiàn)(References)
[1] 費(fèi)寧,張浩然.TensorFlow架構(gòu)與實(shí)現(xiàn)機(jī)制的研究[J].計(jì)算機(jī)技術(shù)與發(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的容器虛擬化技術(shù)[J].中國新通信,2020,22(09):68.
[6] 段麗君.Web服務(wù)發(fā)現(xiàn)研究現(xiàn)狀分析[J].計(jì)算機(jī)科學(xué)與應(yīng)用,2017,7(12):1270-1277.
[7] 張子龍,毛新軍,尹俊文,等.面向自主Web服務(wù)的注冊中心模型及其實(shí)現(xiàn)技術(shù)[J].計(jì)算機(jī)科學(xué),2014,041(011):118-123.
[8] RICHARDSON C. Microservice patterns[M].Greenwich: Manning, 2017:80-85.
作者簡介:
江寧遠(yuǎn)(1996-),男,碩士生.研究領(lǐng)域:軟件開發(fā),信息研究.
張華熊(1971-),男,博士,教授.研究領(lǐng)域:軟件開發(fā),信息研究.