翟高粵 高乾龍 趙云杰 唐竹韻
摘 要:深度學(xué)習(xí)通常需要把訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)模型部署到生產(chǎn)環(huán)境中,并能夠以服務(wù)的形式提供給生產(chǎn)應(yīng)用。常用的兩種方案是基于Flask和基于TensorFlow Serving。本文先對TensorFlow Serving框架進(jìn)行介紹,然后對環(huán)境的搭建進(jìn)行說明,最后通過一個工程項目詳細(xì)說明TensorFlow Serving框架的部署方法。
關(guān)鍵詞:深度學(xué)習(xí);TensorFlow Serving;CIFAR-10;神經(jīng)網(wǎng)絡(luò)模型部署
在日常的生產(chǎn)應(yīng)用中,我們需要將訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)模型部署到生產(chǎn)環(huán)境中,并能夠以服務(wù)的形式提供給生產(chǎn)應(yīng)用?;赥ensorFlow 編寫的神經(jīng)網(wǎng)絡(luò)模型部署有兩種方案可以選擇:一是基于Flask等 Web框架;二是基于TensorFlow Serving。
TensorFlow Serving是一個用于機(jī)器學(xué)習(xí)模型serving的高性能開源庫。它可以將訓(xùn)練好的機(jī)器學(xué)習(xí)模型部署到線上,使用gRPC作為接口接受外部調(diào)用。它支持模型熱更新與自動模型版本管理。一旦部署TensorFlow Serving后,不需要為線上服務(wù)操心,只需要關(guān)心你的線下模型訓(xùn)練。本文接下來將介紹使用TensorFlow Serving進(jìn)行模型部署的方案,并以訓(xùn)練好的基于CNN的CIFAR-10圖像分類模型為部署案例進(jìn)行詳細(xì)說明。
一、TensorFlow Serving框架簡介
TensorFlow Serving是一個高性能、開源的機(jī)器學(xué)習(xí)服務(wù)系統(tǒng),為生產(chǎn)環(huán)境部署及更新TensorFlow模型而設(shè)計。TensorFlow Serving能夠讓訓(xùn)練好的模型更快、更易于投入生產(chǎn)環(huán)境中使用,提供了高效、高可用的模型服務(wù)治理能力。
二、TensorFlow Serving框架構(gòu)成
TensorFlow Serving包含四個核心模塊,分別是Servable、 Source、Loader和Manager,根據(jù)對官方文檔的研究,以這四個模塊為基礎(chǔ)繪制出TensorFlow Serving的整體架構(gòu),如圖1所示。下面簡單介紹架構(gòu)中各個模塊的定義。
(一)Servable
Servable是用于執(zhí)行計算的底層對象。單個Servable的大小和粒度是靈活可變的,因此其可以包括從單個模型到多個模型組合的所有信息。為了保證靈活性和可擴(kuò)展性,Servable可以是任意類型或者接口,比如Streaming result、Experimental API、Asynchronous modes of operation等。
(二)Source
Source的作用是在文件系統(tǒng)中查找并提供Servable,每個Source可以提供多個Servable stream,并會為每個Servable stream提供一個Loader實例,使其可以被加載或者調(diào)用。 Source可以在不同的文件系統(tǒng)中查找可用的Servable,并且支持RPC協(xié)議進(jìn)行遠(yuǎn)程調(diào)用。
(三)Loader
Loader的作用是對Servable的生命周期進(jìn)行管理。Loader API是一個獨立于學(xué)習(xí)算法、數(shù)據(jù)或者產(chǎn)品用例的公共組件,并且可以使用 標(biāo)準(zhǔn)化API來加載或消亡一個Servable。
(四) Manager
Manager會監(jiān)聽Source來跟蹤所有的Servable版本,在資源充足的 情況下,Manager會加載從Source監(jiān)聽到的所有需要加載的Servable,但是當(dāng)資源不足時會拒絕加載Servable的新請求。在Manager中支持基于策略的Servable卸載管理,當(dāng)策略是保證在所有時間內(nèi)至少有一個Servable版本被加載時,在新的Servable完成加載前Manager會延遲卸載老版本的Servable。
三、TensorFlow Serving環(huán)境搭建
TensorFlow Serving環(huán)境搭建有基于Docker和Ubuntu 16.04兩種方式,其中基于Docker的搭建方式具有跨平臺、操作簡單的特點,但是屏蔽了搭建細(xì)節(jié);基于Ubuntu 16.04的搭建方式則要求掌握一定的Linux環(huán)境的軟件安裝知識。下面以基于Docker搭建TensorFlow Serving環(huán)境為例,說明搭建的方法。
使用Docker搭建TensorFLow Serving環(huán)境是非常方便和快捷的,在安裝好Docker環(huán)境之后,可以直接使用如下命令完成Docker鏡像的 下載和運行。
docker pull tensorflow/serving
docker run -p 8500:8500 -p 8501:8501 --name tfserving_resnet \
-- mount type=bind,source=/tmp/resnet,target=/models/resnet \
-e MODEL_NAME=resnet -t tensorflow/serving
四、基于TensorFlow Serving項目工程結(jié)構(gòu)設(shè)計
整個項目工程結(jié)構(gòu)分為兩部分:文件夾和代碼文件,在編程實踐中強(qiáng)烈建議采用文件夾和代碼文件的方式來設(shè)計項目工程結(jié)構(gòu)。所謂的文件夾和代碼文件的方式就是指把所有的Python代碼文件放在根目錄下,其他需要存放的靜態(tài)文件、訓(xùn)練數(shù)據(jù)文件和模型文件等都放在文件夾中。
本項目分為三個部分,分別是模型文件導(dǎo)出模塊、模型文件部署模塊和Web應(yīng)用模塊。模型文件導(dǎo)出模塊提供了將已經(jīng)加載的模型導(dǎo)出TensorFlow Serving部署所需的文件;模型文件部署模塊提供了TensorFlow Serving部署功能;Web應(yīng)用模塊提供了可視化人機(jī)交互功能。
在文件夾中,model_dir存放訓(xùn)練完成的模型文件, predict_images存放我們上傳的需要預(yù)測的圖像,serving_model存放TensorFlow Serving部署所需的文件,static和templates存放Web應(yīng)用 程序所需的HTML、JS等靜態(tài)文件。
項目實現(xiàn)代碼包括工具類實現(xiàn)、模型文件導(dǎo)出模塊實現(xiàn)、模型文件部署模塊實現(xiàn)、Web應(yīng)用模塊實現(xiàn)的代碼。
(一)工具類實現(xiàn)
在實際的項目中,我們往往需要對參數(shù)進(jìn)行頻繁的調(diào)整,因此這里定義一個工具類來讀取配置文件中的配置參數(shù),這樣在調(diào)參時只需要對配置文件中的參數(shù)進(jìn)行調(diào)整,即可實現(xiàn)對全部參數(shù)的調(diào)整。部分關(guān)鍵代碼如下:
def get_config(config_file=’config.ini’):
parser=configparser.ConfigParser()
parser.read(config_file)
_conf_ints=[(key,int(value)) for key,value in parser.items(‘floats’)]
_conf_floats=[(key,str(value)) for key,value in parser.items(‘strings’)]
return dict(_conf_ints+_conf_floats+_conf_strings)
(二)模型文件部署模塊實現(xiàn)
模型文件部署模塊主要實現(xiàn)對Tensorflow Serving服務(wù)的啟動和停止。部分關(guān)鍵代碼如下:
try:
#先啟動TensorFlow Serving服務(wù),完成模型的部署
tf_model_server=subprocess.Popen([“tensorflow_model_server””--model_base_path=
gConfig[‘exeport_dir’]”
“--rest_api_port=gConfig[‘server_port’]
--model_name=ImageClassifier”],
Stdout=subprocess.DEVNULL,shell=True,preexec_fn=os.setsid)
Print(“TensorFlow Serving服務(wù)啟動成功” )
Except KeyboardInterrupt:
Print(“停止所有服務(wù)中....”)
Os.killpg(os.getpgid(tf_mod_server.pid)
Print(“所有服務(wù)停止成攻”)
(三)Web應(yīng)用模塊實現(xiàn)
Web應(yīng)用模塊主要實現(xiàn)預(yù)測、圖片上傳、預(yù)測結(jié)果返回等功能。
五、結(jié)論
TensorFlow Serving是google開源的一個適用于部署機(jī)器學(xué)習(xí)模型,具有靈活、高性能、可用于生產(chǎn)環(huán)境的模型框架。它支持模型版本控制和回滾;支持并發(fā);支持多模型部署;支持模型熱更新等,由于這些特性,使得我們不需要為部署線上服務(wù)而操心,只需要訓(xùn)練好線下模型即可。同時,TensorFlow Serving還提供gRPC和REST API兩種接口訪問形式,其中g(shù)RPC接口對應(yīng)的端口號為8500,而REST API對應(yīng)的端口號為8501。本文為應(yīng)用TensorFlow Serving框架的技術(shù)人員提供了一個較為詳細(xì)的使用價值。
參考文獻(xiàn):
[1] 江寧遠(yuǎn)等.基于微服務(wù)的深度學(xué)習(xí)模型服務(wù)系統(tǒng)[J],軟件工程,2021(4).
[2] 李建明等.基于深度學(xué)習(xí)的工業(yè)自動化包裝缺陷檢測方法[J],包裝工程,2021(4).
[3] 閆濤. 深度學(xué)習(xí)算法實踐 [M]. 電子工業(yè)出版社出版社,2020.
[4] 王宇石等.一種基于卷積神經(jīng)網(wǎng)絡(luò)的違禁品探測系統(tǒng)及部署方法[J],科技創(chuàng)新與應(yīng)用,2020(7).