江寧遠 張華熊



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