能夠簡單快捷地提供機器學習模型是從試驗轉向生產的關鍵挑戰之一。服務機器學習模型就是采用經訓練的模型并使其能夠應對預測請求的過程。在生產中服務時,您需要確保您的環境可重現,強制隔離并且是安全的。為此,提供機器學習模型的最簡單方法之一是就是將 TensorFlow Serving 與 Docker 結合起來。 Docker 是一種將軟件打包成單元(我們稱之為容器)的工具,其中包含運行軟件所需的一切。
TensorFlowServing 在 Docker 容器中運行
自 TensorFlowServing 1.8 發布以來,我們一直在改進對 Docker 的支持。 我們現在提供 Docker images 用于 CPU 和 GPU 模型的服務和開發。為了解使用 TensorFlowServing 部署模型究竟有多么容易,讓我們嘗試將 ResNet 模型投入生產。 此模型在 ImageNet 數據集上進行訓練,并將 JPEG 鏡像作為輸入并返回鏡像的分類類別。
我們的示例將假設您正在運行 Linux,不過它在 macOS 或 Windows 應該也可以運行,僅需少量修改,甚至不需要修改。
使用 TensorFlowServing 和 Docker 服務 ResNet
第一步安裝 Docker CE。 這將為您提供運行和管理 Docker 容器所需的所有工具。
TensorFlow Serving 為其 ML 模型使用 SavedModel 格式。SavedModel 是一種語言中立的,可恢復的,密集的序列化格式,使更高級別的系統和工具能夠生成,使用和轉換 TensorFlow 模型。 有幾種方法可以導出 SavedModel(包括來自 Keras)。 在本練習中,我們只需下載預先訓練的 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
我們現在應該在 / tmp / resnet 中有一個包含我們模型的文件夾。可以通過運行來驗證這一點:
$ ls / tmp / resnet 1538687457
現在我們有了模型,使用 Docker 服務就像拉來最新發布的 TensorFlowServing 來服務環境鏡像一樣簡單,并將其指向模型:
$ 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運行ModelServer ...... ... main.cc:337]導出HTTP / REST API:localhost:8501 ...
分解命令行參數,我們:
-p 8501:8501 : 將容器的端口 8501(TensorFlow 服務響應 REST API 請求)發布到主機的端口 8501
--name tfserving_resnet : 我們為容器創建名稱為 “tfserving_resnet”,這樣稍后我們可以作參考
--mount type=bind,source=/tmp/resnet,target=/models/resnet : 在容器(/ models / resnet)上安裝主機的本地目錄(/ tmp / resnet),以便 TensorFlow 服務可以從容器內部讀取模型。
-e MODEL_NAME=resnet : 告訴 TensorFlow Serving 下載名為 “resnet” 的模型
-t tensorflow/serving : 基于服務鏡像 “tensorflow / serving” 運行 Docker 容器
接下來,讓我們下載 python 客戶端腳本,它將發送服務的模型鏡像并獲取預測。 我們還將測量服務器響應時間。
$ curl -o /tmp/resnet/resnet_client.py https://raw.githubusercontent.com/tensorflow/serving/master/tensorflow_serving/example/resnet_client.py
此腳本將下載貓的鏡像并在測量響應時間時將其重復發送到服務器,如腳本的主循環中所示:
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))
此腳本使用請求模塊,因此如果您尚未安裝,則需要安裝它。通過運行此腳本,您應該看到如下所示的輸出:
$ python /tmp/resnet/resnet_client.py
Prediction class: 282, avg latency: 185.644 ms
如您所見,使用 TensorFlow Serving 和 Docker 創建模型非常簡單直白。您甚至可以創建自己的嵌入式模型的自定義 Docker 鏡像,以便更輕松地進行部署。
通過構建優化的 TensorFlow Serving 二進制文件來提高性能
既然我們在 Docker 中提供了一個模型,您可能已經注意到來自 TensorFlowServing 的日志消息如下所示:
Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
TensorFlowServing 已發布的 Docker 鏡像旨在竭盡所能來使用 CPU 架構,因此省略了一些優化以最大限度地提高兼容性。如果您沒有看到此消息,則您的二進制文件可能已針對您的 CPU 進行了優化。
根據您的模型執行的操作,這些優化可能會對您的服務性能產生重大影響。值得慶幸的是,將您自己的優化服務鏡像組合在一起非常簡單。
首先,我們要構建 TensorFlowServing 的優化版本。最簡單的方法是構建官方的 TensorFlowServing 開發環境 Docker 鏡像。這具有為鏡像構建的系統自動生成優化的 TensorFlow 服務二進制文件的良好特性。為了區分我們創建的鏡像和官方鏡像,我們將 $USER/ 添加到鏡像名稱之前。讓我們稱這個開發鏡像為 $USER/ tensorflow-serving-devel:
$ docker build -t $USER/tensorflow-serving-devel -f Dockerfile.devel https://github.com/tensorflow/serving.git#:tensorflow_serving/tools/docker
構建 TensorFlow 服務開發鏡像可能需要一段時間,具體取決于計算機的速度。 完成之后,讓我們使用優化的二進制文件構建一個新的服務鏡像,并將其命名為 $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
現在我們有了新的服務鏡像,讓我們再次啟動服務器:
$ 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 &
最后運行我們的客戶端:
$ python /tmp/resnet/resnet_client.pyPrediction class: 282, avg latency: 84.8849 ms
在我們的機器上,我們看到使用原生優化二進制文件,每次預測平均加速超過 100 毫秒(119%)。在不同的機器(和型號)上您可能會看到不同的結果。
最后,隨意銷毀 TensorFlow Serving 容器:
$ docker kill tfserving_resnet
現在您已經使用 Docker 運行 TensorFlowServing,您可以輕松地在容器中部署機器學習模型,同時最大限度地提高部署和性能。
-
機器學習
+關注
關注
66文章
8438瀏覽量
132928 -
tensorflow
+關注
關注
13文章
329瀏覽量
60590
原文標題:使用 TensorFlow Serving 和 Docker 快速服務于機器學習
文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論