能夠簡(jiǎn)單快捷地提供機(jī)器學(xué)習(xí)模型是從試驗(yàn)轉(zhuǎn)向生產(chǎn)的關(guān)鍵挑戰(zhàn)之一。服務(wù)機(jī)器學(xué)習(xí)模型就是采用經(jīng)訓(xùn)練的模型并使其能夠應(yīng)對(duì)預(yù)測(cè)請(qǐng)求的過程。在生產(chǎn)中服務(wù)時(shí),您需要確保您的環(huán)境可重現(xiàn),強(qiáng)制隔離并且是安全的。為此,提供機(jī)器學(xué)習(xí)模型的最簡(jiǎn)單方法之一是就是將 TensorFlow Serving 與 Docker 結(jié)合起來。 Docker 是一種將軟件打包成單元(我們稱之為容器)的工具,其中包含運(yùn)行軟件所需的一切。
TensorFlowServing 在 Docker 容器中運(yùn)行
自 TensorFlowServing 1.8 發(fā)布以來,我們一直在改進(jìn)對(duì) Docker 的支持。 我們現(xiàn)在提供 Docker images 用于 CPU 和 GPU 模型的服務(wù)和開發(fā)。為了解使用 TensorFlowServing 部署模型究竟有多么容易,讓我們嘗試將 ResNet 模型投入生產(chǎn)。 此模型在 ImageNet 數(shù)據(jù)集上進(jìn)行訓(xùn)練,并將 JPEG 鏡像作為輸入并返回鏡像的分類類別。
我們的示例將假設(shè)您正在運(yùn)行 Linux,不過它在 macOS 或 Windows 應(yīng)該也可以運(yùn)行,僅需少量修改,甚至不需要修改。
使用 TensorFlowServing 和 Docker 服務(wù) ResNet
第一步安裝 Docker CE。 這將為您提供運(yùn)行和管理 Docker 容器所需的所有工具。
TensorFlow Serving 為其 ML 模型使用 SavedModel 格式。SavedModel 是一種語言中立的,可恢復(fù)的,密集的序列化格式,使更高級(jí)別的系統(tǒng)和工具能夠生成,使用和轉(zhuǎn)換 TensorFlow 模型。 有幾種方法可以導(dǎo)出 SavedModel(包括來自 Keras)。 在本練習(xí)中,我們只需下載預(yù)先訓(xùn)練的 pre-trained ResNetSavedModel:
$ mkdir / tmp / resnet $ curl -s https://storage.googleapis.com/download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NHWC_jpg.tar.gz | tar --strip-components = 2 -C / tmp / resnet -xvz
我們現(xiàn)在應(yīng)該在 / tmp / resnet 中有一個(gè)包含我們模型的文件夾。可以通過運(yùn)行來驗(yàn)證這一點(diǎn):
$ ls / tmp / resnet 1538687457
現(xiàn)在我們有了模型,使用 Docker 服務(wù)就像拉來最新發(fā)布的 TensorFlowServing 來服務(wù)環(huán)境鏡像一樣簡(jiǎn)單,并將其指向模型:
$ docker pull tensorflow / serving $ docker run -p 8501:8501 - name tfserving_resnet --mount type = bind,source = / tmp / resnet,target = / models / resnet -e MODEL_NAME = resnet -t tensorflow / serving &... ... main.cc:327]在0.0.0.0:8500運(yùn)行ModelServer ...... ... main.cc:337]導(dǎo)出HTTP / REST API:localhost:8501 ...
分解命令行參數(shù),我們:
-p 8501:8501 : 將容器的端口 8501(TensorFlow 服務(wù)響應(yīng) REST API 請(qǐng)求)發(fā)布到主機(jī)的端口 8501
--name tfserving_resnet : 我們?yōu)槿萜鲃?chuàng)建名稱為 “tfserving_resnet”,這樣稍后我們可以作參考
--mount type=bind,source=/tmp/resnet,target=/models/resnet : 在容器(/ models / resnet)上安裝主機(jī)的本地目錄(/ tmp / resnet),以便 TensorFlow 服務(wù)可以從容器內(nèi)部讀取模型。
-e MODEL_NAME=resnet : 告訴 TensorFlow Serving 下載名為 “resnet” 的模型
-t tensorflow/serving : 基于服務(wù)鏡像 “tensorflow / serving” 運(yùn)行 Docker 容器
接下來,讓我們下載 python 客戶端腳本,它將發(fā)送服務(wù)的模型鏡像并獲取預(yù)測(cè)。 我們還將測(cè)量服務(wù)器響應(yīng)時(shí)間。
$ curl -o /tmp/resnet/resnet_client.py https://raw.githubusercontent.com/tensorflow/serving/master/tensorflow_serving/example/resnet_client.py
此腳本將下載貓的鏡像并在測(cè)量響應(yīng)時(shí)間時(shí)將其重復(fù)發(fā)送到服務(wù)器,如腳本的主循環(huán)中所示:
1# The server URL specifies the endpoint of your server running the ResNet
2# model with the name "resnet" and using the predict interface.
3SERVER_URL = 'http://localhost:8501/v1/models/resnet:predict'
4
5...
6
7# Send few actual requests and time average latency.
8total_time = 0
9num_requests = 10
10for _ in xrange(num_requests):
11response = requests.post(SERVER_URL, data=predict_request)
12response.raise_for_status()
13total_time += response.elapsed.total_seconds()
14prediction = response.json()['predictions'][0]
15
16print('Prediction class: {}, avg latency: {} ms'.format(
17prediction['classes'], (total_time*1000)/num_requests))
此腳本使用請(qǐng)求模塊,因此如果您尚未安裝,則需要安裝它。通過運(yùn)行此腳本,您應(yīng)該看到如下所示的輸出:
$ python /tmp/resnet/resnet_client.py
Prediction class: 282, avg latency: 185.644 ms
如您所見,使用 TensorFlow Serving 和 Docker 創(chuàng)建模型非常簡(jiǎn)單直白。您甚至可以創(chuàng)建自己的嵌入式模型的自定義 Docker 鏡像,以便更輕松地進(jìn)行部署。
通過構(gòu)建優(yōu)化的 TensorFlow Serving 二進(jìn)制文件來提高性能
既然我們?cè)?Docker 中提供了一個(gè)模型,您可能已經(jīng)注意到來自 TensorFlowServing 的日志消息如下所示:
Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
TensorFlowServing 已發(fā)布的 Docker 鏡像旨在竭盡所能來使用 CPU 架構(gòu),因此省略了一些優(yōu)化以最大限度地提高兼容性。如果您沒有看到此消息,則您的二進(jìn)制文件可能已針對(duì)您的 CPU 進(jìn)行了優(yōu)化。
根據(jù)您的模型執(zhí)行的操作,這些優(yōu)化可能會(huì)對(duì)您的服務(wù)性能產(chǎn)生重大影響。值得慶幸的是,將您自己的優(yōu)化服務(wù)鏡像組合在一起非常簡(jiǎn)單。
首先,我們要構(gòu)建 TensorFlowServing 的優(yōu)化版本。最簡(jiǎn)單的方法是構(gòu)建官方的 TensorFlowServing 開發(fā)環(huán)境 Docker 鏡像。這具有為鏡像構(gòu)建的系統(tǒng)自動(dòng)生成優(yōu)化的 TensorFlow 服務(wù)二進(jìn)制文件的良好特性。為了區(qū)分我們創(chuàng)建的鏡像和官方鏡像,我們將 $USER/ 添加到鏡像名稱之前。讓我們稱這個(gè)開發(fā)鏡像為 $USER/ tensorflow-serving-devel:
$ docker build -t $USER/tensorflow-serving-devel -f Dockerfile.devel https://github.com/tensorflow/serving.git#:tensorflow_serving/tools/docker
構(gòu)建 TensorFlow 服務(wù)開發(fā)鏡像可能需要一段時(shí)間,具體取決于計(jì)算機(jī)的速度。 完成之后,讓我們使用優(yōu)化的二進(jìn)制文件構(gòu)建一個(gè)新的服務(wù)鏡像,并將其命名為 $USER/tensorflow-serving:
$ docker build -t $USER/tensorflow-serving --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel https://github.com/tensorflow/serving.git#:tensorflow_serving/tools/docker
現(xiàn)在我們有了新的服務(wù)鏡像,讓我們?cè)俅螁?dòng)服務(wù)器:
$ docker kill tfserving_resnet$ docker run -p 8501:8501 --name tfserving_resnet --mount type=bind,source=/tmp/resnet,target=/models/resnet -e MODEL_NAME=resnet -t $USER/tensorflow-serving &
最后運(yùn)行我們的客戶端:
$ python /tmp/resnet/resnet_client.pyPrediction class: 282, avg latency: 84.8849 ms
在我們的機(jī)器上,我們看到使用原生優(yōu)化二進(jìn)制文件,每次預(yù)測(cè)平均加速超過 100 毫秒(119%)。在不同的機(jī)器(和型號(hào))上您可能會(huì)看到不同的結(jié)果。
最后,隨意銷毀 TensorFlow Serving 容器:
$ docker kill tfserving_resnet
現(xiàn)在您已經(jīng)使用 Docker 運(yùn)行 TensorFlowServing,您可以輕松地在容器中部署機(jī)器學(xué)習(xí)模型,同時(shí)最大限度地提高部署和性能。
-
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8423瀏覽量
132757 -
tensorflow
+關(guān)注
關(guān)注
13文章
329瀏覽量
60540
原文標(biāo)題:使用 TensorFlow Serving 和 Docker 快速服務(wù)于機(jī)器學(xué)習(xí)
文章出處:【微信號(hào):tensorflowers,微信公眾號(hào):Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論