經過tensorflow serving 和 kubernetes部署你的機器學習模型

tk.png

機器學習應用程序正在蓬勃發展,可是數據工程師沒有不少工具能夠將這些強大的模型集成到生產系統中。在這裏,我將討論tensorflow serving如何幫助您加速在生產中交付模型。這篇博客文章是關於服務機器學習模型的-這是什麼意思?python

Serving是訓練後如何應用ML模型的方法-Noah Fiedel軟件工程師致力於tensorflow serving。git

爲了說明tensorflow serving的功能,我將逐步介紹serving一個對象檢測模型的步驟。在個人GitHub上找到與本文相關的全部代碼:https://github.com/fpaupier/tensorflow-serving_sidecar。github

serving-01.png

簡而言之,Tensorflow Serving使您可以無縫地爲您的機器學習模型提供服務。docker

  • 部署模型的新版本,讓tensorflow serving 優雅地完成當前請求,同時開始爲新模型提供新請求。
  • 另外,數據科學家能夠專一於構建出色的模型,而Ops能夠專一於構建能夠爲這些模型提供服務的高彈性和可擴展架構。

Part 1 — 預熱: 創建一個本地的tensorflow server

線上操做以前,最好先確保您的服務器能夠在本地運行。我在這裏提供了重要步驟,請在項目readme文件中找到更多文檔。查看設置步驟,以確保您能夠充分利用本教程:json

  1. git clone https://github.com/fpaupier/t...,建立一個python3.6.5虛擬環境並安裝requirements.txt
  2. 獲取tensorflow serving 的docker鏡像。docker pull tensorflow /serving
  3. 獲取一個模型去serving。我用這個,它執行對象檢測faster_rcnn_resnet101_coco
  4. 轉到模型目錄,並使用版本號重命名已保存的模型子目錄,由於咱們在這裏進行的是v1,所以咱們將其稱爲00001(必須爲數字)。咱們這樣作是由於tensorflow serving docker鏡像在搜索要服務的模型時會搜索以該約定命名的文件夾。
  5. 如今運行tensorflow 服務服務器

    # From tensorflow-serving_sidecar/
    docker run -t --rm -p 8501:8501 \
       -v "$(pwd)/data/faster_rcnn_resnet101_coco_2018_01_28:/models/faster_rcnn_resnet" \
       -e MODEL_NAME=faster_rcnn_resnet \
       tensorflow/serving &

    在繼續以前,須要提到一點:
    serving-2.jpeg架構

    這裏,咱們將容器的端口和本地主機綁定在一塊兒。所以,當咱們調用localhost:8501時,咱們實際上將調用tensorflow服務器。負載均衡

    您還注意到,咱們將本地目錄目錄fast_rcnn_resnet101_coco_2018_01_28(用於存儲模型)與容器/ models / faster_rcnn_resnet路徑連接。機器學習

    請切記,此時,saveModel.pb僅在您的計算機上,而不在容器中。分佈式

  6. 執行客戶端調用

    # Don't forget to activate your python3.6.5 venv
    
    # From tensorflow-serving_sidecar/
    python client.py --server_url "http://localhost:8501/v1/models/faster_rcnn_resnet:predict" \
    --image_path "$(pwd)/object_detection/test_images/image1.jpg" \
    --output_json "$(pwd)/object_detection/test_images/out_image1.json" \
    --save_output_image "True" \
    --label_map "$(pwd)/data/labels.pbtxt"

    去檢查--output_json指定的路徑並享受結果。 (可用json和jpeg輸出)

serving-3.jpeg

太好了,既然咱們的模型運行良好,就讓咱們將其部署在雲上。

Part 2— 經過tensorflow serving 和 kubernetes部署你的機器學習模型

在生產環境中,您但願可以隨着應用程序負載的增長而擴展。您不但願服務器不堪重負。

serving-5.png

爲了不這個問題,您將使用kubernetes集羣爲您的tensorflow-server應用程序提供服務。預期的主要改進:

  • 您的副本之間的負載將達到平衡,而無需再考慮它。
  • 您是否要在不停機的狀況下部署新模型?沒問題,kubernetes支持了您。執行滾動更新以逐步服務於您的新模型,同時優雅地終止舊模型上的當前請求。

讓咱們深刻研究一下

首先,咱們要建立一個完整的帶有嵌入式對象檢測模型的docker鏡像。完成後,咱們將其部署在kubernetes集羣上。個人示例在Google Cloud Platform上運行。

建立一個定製的 tensorflow-serving docker image

  1. 將服務鏡像做爲守護程序運行:

    docker run -d --name serving_base tensorflow/serving
  2. 拷貝faster_rcnn_resnet101_coco 模型數據到容器的 models/文件夾下。

    # From tensorflow-serving_sidecar/
    docker cp $(pwd)/data/faster_rcnn_resnet101_coco_2018_01_28 serving_base:/models/faster_rcnn_resnet
  3. commit容器,將新的鏡像保存爲serving faster_rcnn_resnet:

    docker commit --change "ENV MODEL_NAME faster_rcnn_resnet" serving_base faster_rcnn_resnet_serving

    注意:若是使用其餘模型,請在--change參數中相應更改faster_rcnn_resnet。

    fast_rcnn_resnet_serving將是咱們的新的鏡像。您能夠經過運行docker鏡像進行檢查,您應該會看到一個新的docker鏡像:

serving-4.png

  1. Stop serving base container

    docker kill serving_base
    docker rm serving_base

太好了,下一步是測試咱們全新的fast_rcnn_resnet_serving鏡像。

測試定製server

在將咱們的應用程序部署到kubernetes以前,請確保它能夠正常運行。

  1. 啓動服務

    docker run -p 8501:8501 -t faster_rcnn_resnet_serving &

    注意:確保您已中止(docker stop <CONTAINER_NAME>)先前運行的服務器,不然端口8501可能已被綁定。

  2. 咱們可使用相同的客戶端代碼來調用服務器。

    # From tensorflow-serving_sidecar/
    python client.py --server_url "http://localhost:8501/v1/models/faster_rcnn_resnet:predict" \
    --image_path "$(pwd)/object_detection/test_images/image1.jpg" \
    --output_json "$(pwd)/object_detection/test_images/out_image2.json" \
    --save_output_image "True" \
    --label_map "$(pwd)/data/labels.pbtxt"

    咱們能夠檢查是否具備相同的功能。如今讓咱們在kubernetes集羣上運行它。

    部署咱們的應用到kubernetes


  1. 首先將定製的鏡像推送到鏡像倉庫。

    docker push gcr.io/tensorflow-serving-229609/faster_rcnn_resnet_serving:v0.1.0
  2. 建立deployment和service。

    經過Kubernetes deployment部署fast-rcnn推理服務。經過Kubernetes service 和藉助於外部負載均衡器實現外部訪問。

    使用單個副本實際上沒有任何意義。我這樣作是爲了在免費套餐中經過。若是隻有一個實例能夠直接進行查詢,那麼進行負載平衡是沒有用的。在生產設置中,使用多個副本。

    咱們使用示例Kubernetes配置quick_rcnn_resnet_k8s.yaml建立它們。您只須要更新要在文件中使用的docker鏡像,將行鏡像<YOUR_FULL_IMAGE_NAME_HERE>替換爲您的實際鏡像全名。

    執行下面命令:

    # From tensorflow-serving_sidecar/
    kubectl create -f faster_rcnn_resnet_k8s.yaml

    要檢查部署和Pod的狀態,請對整個部署使用kubectl get部署,kubectl get pod能夠監視部署的每一個副本,併爲該服務提供kubectl get服務。

    serving-6.png

    一切啓動和運行可能須要一段時間。服務外部IP地址在LoadBalancer入口旁邊列出。您可使用kubectl describe service命令進行檢查:

    kubectl describe service faster-rcnn-resnet-service

    serving-7.png

    查詢你的線上模型


最後,讓咱們測試一下。咱們可使用相同的客戶端代碼。只需用上面指定的LoadBalancer Ingress的IP地址替換--server-url arg中之前使用的localhost。

# From tensorflow-serving_sidecar/
python client.py --server_url "http://34.73.137.228:8501/v1/models/faster_rcnn_resnet:predict" \
--image_path "$(pwd)/object_detection/test_images/image1.jpg" \
--output_json "$(pwd)/object_detection/test_images/out_image3.json" \
--save_output_image "True" \
--label_map "$(pwd)/data/labels.pbtxt"

結語

Tensorflow Serving提供了一個很好的基礎,您能夠依靠它以極少的開銷在生產中快速部署模型。

  • 機器學習應用程序的容器化可用於部署,從而將操做人員和數據科學家之間的關注點分開
  • 諸如Kubernetes之類的容器編排解決方案與tensorflow-serving相結合,即便對於不熟悉分佈式計算的人,也能夠在數分鐘內部署高可用性模型。
相關文章
相關標籤/搜索