一篇帶你搞定TensorFlow Serving 架構(gòu)、部署和應(yīng)用
開(kāi)篇
一般在練完機(jī)器學(xué)習(xí)的模型之后,需要將模型host成服務(wù)才能供使用者調(diào)用。TensorFlow的機(jī)器學(xué)習(xí)模型的部署也遵循這個(gè)方式,它會(huì)通過(guò)TensorFlow Serving的方式將模型做成服務(wù),讓使用者通過(guò)某種方式來(lái)調(diào)用模型,而不是直接運(yùn)行模型推測(cè)的代碼,也不需要使用者進(jìn)行模型的部署和安裝工作。整個(gè)過(guò)程需要通過(guò)TensorFlow Serving 把模型部署到服務(wù)器上。通常來(lái)說(shuō)會(huì)使用Web框架(例如:flask、Django、tornado)創(chuàng)建服務(wù)器應(yīng)用,這個(gè)應(yīng)用會(huì)承載TensorFlow 生成的機(jī)器學(xué)習(xí)模型,應(yīng)用啟動(dòng)后就會(huì)一直在后臺(tái)運(yùn)行,并等待客戶端請(qǐng)求,當(dāng)應(yīng)用檢測(cè)到有請(qǐng)求,就會(huì)執(zhí)行模型進(jìn)行推測(cè),將推測(cè)結(jié)果返回給用戶。本文主要介紹TensorFlow Serving 的工作原理、安裝以及應(yīng)用。
TensorFlow Serving 架構(gòu)介紹
如果要了解TensorFlow Serving 的架構(gòu)就需要了解它所包含的組件,以及組件之間是如何配合工作的。
TensorFlow Serving 組件
首先介紹一下TensorFlow Serving的主要組件,TensorFlow Serving的功能可抽象為一些組件,每個(gè)組件實(shí)現(xiàn)了不同的API任務(wù),其中最重要的是Servable, Loader, Source, 和 Manager,我們先看看這些組件是如何定義的。
Servable
Servable 是 TensorFlow Serving 中最核心的抽象,是客戶端用于執(zhí)行計(jì)算 (例如:預(yù)測(cè)或推斷) 的底層對(duì)象。Servables 的大小和力度是靈活的,單個(gè) Servable 可能包含從一個(gè)查找表的單個(gè)分片,到一個(gè)單獨(dú)的模型,或是推理模型的元組。Servables 可以是任何類型或接口,這使得其具有靈活性并易于將來(lái)的改進(jìn),例如:流式結(jié)果、實(shí)驗(yàn)性 APIs、異步操作模式。但是,Servables 并不管理自身的生命周期。
由于每個(gè)模型都就可能進(jìn)行改,特別是算法配置、權(quán)重等參數(shù)會(huì)隨著對(duì)模型的深入了解而進(jìn)行調(diào)整。TensorFlow Serving 能夠?yàn)榉?wù)實(shí)例的生命周期內(nèi)處理一個(gè)或多個(gè) 版本 (versions) 的 Servable,這使得新的算法配置,權(quán)重和其他數(shù)據(jù)可以隨時(shí)被加載。這就是 Servables Versions,它可以使多個(gè)版本的 Servable 可以并發(fā)加載。在提供服務(wù)時(shí),客戶端可以請(qǐng)求最新版本的模型或是制定版本 ID 的模型。
正如上面說(shuō)到的一個(gè)Servable 會(huì)有多個(gè)Version,那么多個(gè)版本的 Servable 的序列就成為Servable Stream,它會(huì)按照版本號(hào)的遞增排序。
Model
TensorFlow Serving 將一個(gè) 模型 (model) 表示為一個(gè)或多個(gè) Servables。一個(gè)機(jī)器學(xué)習(xí)模型可能包括一個(gè)或多個(gè)算法 (包括學(xué)習(xí)到的權(quán)重) 和查找表。
你可以將一個(gè)復(fù)合模型 (composite model) 表示成:多個(gè)獨(dú)立的 Servables或者一個(gè)組合的 Servables。一個(gè) Servable 也可能是一個(gè)模型的一部分,例如,一個(gè)大的查找表可能被分割到多個(gè)不同的 TensorFlow Serving 實(shí)例中。
Loader
Loader 管理Servable 的生命周期。Loader API 提供了一個(gè)獨(dú)立于特定機(jī)器學(xué)習(xí)算法,數(shù)據(jù)和用戶產(chǎn)品用例的通用基礎(chǔ)平臺(tái)。具體說(shuō),Loader 主要處理Servable 的加載和卸載,并為其提供標(biāo)準(zhǔn)的API。
Source
Source 是用于查找和提供 Servable 的插件模塊,每個(gè) Source 提供零個(gè)或多個(gè) Servable Stream。對(duì)于每個(gè) Servable Stream,一個(gè) Source 為一個(gè) Loader 實(shí)例對(duì)不同版本的載入提供支持。(一個(gè) Source 通常是由零個(gè)或多個(gè) SourceAdapter 鏈接在一起,其中最后一項(xiàng)將觸發(fā) Loader。)
TensorFlow Serving 中 Source 的接口可以從任意的存儲(chǔ)系統(tǒng)中發(fā)現(xiàn) Servable,TesorFlow Serving 包含了 Source 實(shí)現(xiàn)的通用引用。例如:Source 可以利用 RPC 等機(jī)制,并可以輪訓(xùn)文件系統(tǒng)。Source 可以維護(hù)多個(gè) Servable 或 不同版本分片中的狀態(tài),這將有助于 Servable 在不同版本之間進(jìn)行更新。
Manager
前面說(shuō)到了Servable,它自己是不會(huì)維護(hù)自己的生命周期的,需要通過(guò)Managers 來(lái)維護(hù) Servable 的整個(gè)生命周期,包括:加載 Servable,
為 Servable 提供服務(wù),卸載 Servable。
Managers 從 Source 獲取信息并跟蹤所有的 Version。Manager 盡可能的滿足 Source 的請(qǐng)求,但當(dāng)所需的資源不存在時(shí),會(huì)拒絕載入一個(gè) Aspired Versions。Manager 也可能延遲觸發(fā)一個(gè)卸載 (unload),例如:基于要確保任意時(shí)點(diǎn)都要至少有一個(gè) Version 被加載的策略,Manager 需要等待一個(gè)新的 Version 完成加載后再卸載之前的 Version。
Tensorflow Serving Manager 提供一個(gè)簡(jiǎn)單窄接口 (narrow interface),GetServableHandler(),用于客戶端訪問(wèn)以加載的 Servable 實(shí)例。
TensorFlow Serving 工作流程
上面介紹了TensorFlow Serving的幾個(gè)組件,包括:Servable、Model、Loader、Source、Manager。接下來(lái)看看它們是如何合作工作的--TensorFlow Serving 工作流。如圖1 所示,TensorFlow Serving的工作流程主要分為以下幾個(gè)步驟:
● 先看圖1 中右下方的Source組件,順著Source 向上的箭頭它會(huì)為要加載的模型創(chuàng)建一個(gè)Loader,Loader中會(huì)包含要加載模型的全部信息;
● 接著,Source通知Manager有新的模型需要進(jìn)行加載;
● Manager(DynamicManager)通過(guò)版本管理策略(Version Policy)來(lái)確定哪些模型需要被下架,哪些模型需要被加載;
● Manager在確認(rèn)需要加載的模型符合加載策略,便通知Loader來(lái)加載最新的模型;
● Client(客戶端)向服務(wù)端請(qǐng)求模型結(jié)果時(shí),可以通過(guò)ServableHandle指定模型的版本(Servable Version),這部分的信息由Manager進(jìn)行管理(Manager管理Servable的生命周期),然后通過(guò)Manager返回給客戶端;
圖片來(lái)源:??https://www.tensorflow.org/static/tfx/serving/images/serving_architecture.svg?hl=zh-cn??
圖1 TensorFlow Serving 工作流程
TensorFlow Serving 安裝和部署
上面我們介紹了TensorFlow Serving 的組成和工作流程,這里我們接著來(lái)說(shuō)說(shuō)如何安裝TensorFlow Serving,這里推薦使用docker 和 apt-get兩種安裝方式。
TensorFlow Serving 的Docker 安裝方式
首先保證已經(jīng)安裝了Docker ,然后通過(guò)運(yùn)行以下命令拉取最新的 TensorFlow Serving docker 鏡像。
這將拉取安裝TensorFlow Serving 的最小 Docker 鏡像。
接著需要對(duì)如下屬性進(jìn)行設(shè)置,gRPC 公開(kāi)的端口 8500,REST API 公開(kāi)的端口 8501,可選環(huán)境變量MODEL_NAME(默認(rèn)為model),可選環(huán)境變量MODEL_BASE_PATH(默認(rèn)為/models)。這些屬性的設(shè)置參考如下命令:
然后,就是就是設(shè)置主機(jī)開(kāi)放端口,設(shè)置所服務(wù)的SavedModel,設(shè)置客戶將引用的模型名稱。
以上的命令,啟動(dòng)了一個(gè) Docker 容器,將 REST API 端口 8501 發(fā)布到主機(jī)的端口 8501,并采用名為my_model的模型并將其綁定到默認(rèn)模型基本路徑 ( ${MODEL_BASE_PATH}/${MODEL_NAME}= /models/my_model)。最后,填充了環(huán)境變量 MODEL_NAME,并保留MODEL_BASE_PATH其默認(rèn)值。
TensorFlow Serving apt-get安裝
設(shè)置安裝源如下命令
更新源后,即可使用 apt-get 安裝
TensorFlow模型導(dǎo)出
既然已經(jīng)安裝好了TensorFlow Serving,那么就需要加載對(duì)應(yīng)的模型進(jìn)行機(jī)器學(xué)習(xí)的推演。TensorFlow 提供了Keras 模型可以方便地導(dǎo)出為 SavedModel 格式。假設(shè)我們有一個(gè)名為 model 的 Keras 模型,使用下面的代碼即可將模型導(dǎo)出為 SavedModel:
TensorFlow模型部署
安裝好TensorFlow Serving 并且將模型導(dǎo)出,接下來(lái)就是將模型部署到TensorFlow Serving上了。 我們利用如下命令,設(shè)置模型所暴露的端口號(hào),模型名以及模型所存儲(chǔ)的路徑。
想詳細(xì)了解如何快速應(yīng)用 TensorFlow 實(shí)現(xiàn)多端部署的同學(xué),可以報(bào)名學(xué)習(xí)中國(guó)大學(xué) MOOC 上的官方課程:??https://www.icourse163.org/course/youdao-1467217161#/info?? ,或者看看谷歌開(kāi)發(fā)者專家對(duì)TensorFlow部署的介紹和講解:
??https://zhibo.51cto.com/liveDetail/373??
TensorFlow Serving 客戶端調(diào)用
好了到這里,我們完成了TensorFlow Serving 的安裝和部署工作,此時(shí)我們訓(xùn)練好的機(jī)器學(xué)習(xí)模型已經(jīng)靜靜地躺在服務(wù)器上了,就等著客戶端調(diào)用了。TensorFlow Serving 支持gRPC 和 RESTful API的 調(diào)用。本文主要介紹較為通用的 RESTful API 方法的調(diào)用。
RESTful API 以標(biāo)準(zhǔn)的 HTTP POST 方法進(jìn)行交互,請(qǐng)求和回復(fù)均為 JSON 對(duì)象。為了調(diào)用服務(wù)器端的模型,我們?cè)诳蛻舳讼蚍?wù)器發(fā)送以下格式的請(qǐng)求:
請(qǐng)求內(nèi)容如下:
Python 客戶端例子
以下示例使用 ??Python 的 Requests 庫(kù)?? 向本機(jī)的 TensorFlow Serving 服務(wù)器發(fā)送 MNIST 測(cè)試集的前 10 幅圖像并返回預(yù)測(cè)結(jié)果,同時(shí)與測(cè)試集的真實(shí)標(biāo)簽進(jìn)行比較。從代碼中可以看出,使用了MNISTLoader 方法獲取要加載的數(shù)據(jù),通過(guò)json.dumps 方法輸入要請(qǐng)求的數(shù)據(jù)。接著設(shè)置headers,通過(guò)requests的post方法請(qǐng)求本地端口為8501 的TensorFlow Serving 服務(wù),并將返回的結(jié)果賦值給json_response,最后把預(yù)測(cè)結(jié)果中的predictions返回進(jìn)行響應(yīng)的處理。
總結(jié)
本文分三個(gè)部分分別介紹了TensorFlow Serving 的組成和工作方式,TensorFlow Serving由Servable、Model、Loader、Source和Manager等組件組成,它們各司其職完成搜索Servable,加載Servable以及管理Servable生命周期的工作。接著,我們使用Docket 和apt-get的方式安裝TensorFlow Serving ,并導(dǎo)出機(jī)器學(xué)習(xí)模型將其部署到TensorFlow Serving上。最后,使用客戶端(Python為例)對(duì)機(jī)器學(xué)習(xí)模型進(jìn)行調(diào)用并返回結(jié)果。
本文介紹的TensorFlow Serving 知識(shí)僅僅只是冰山一角,如果想進(jìn)一步探索機(jī)器學(xué)習(xí)更多領(lǐng)域,大家可以學(xué)習(xí)??《 TensorFlow 入門實(shí)操課程 》??。想提升機(jī)器學(xué)習(xí)能力,挑戰(zhàn)自己,也歡迎報(bào)名參與 TensorFlow 開(kāi)發(fā)者認(rèn)證計(jì)劃??https://tensorflow.google.cn/certificate??,掌握更多機(jī)器學(xué)習(xí)技能,強(qiáng)化你的核心競(jìng)爭(zhēng)力。
作者介紹
崔皓,51CTO社區(qū)編輯,資深架構(gòu)師,擁有20年架構(gòu)經(jīng)驗(yàn)。曾任惠普技術(shù)專家,參與多個(gè)機(jī)器學(xué)習(xí)項(xiàng)目,撰寫、翻譯20多篇機(jī)器學(xué)習(xí)、NLP等熱門技術(shù)文章。《分布式架構(gòu)原理與實(shí)踐》作者。