機器學習應用程序正在蓬勃發展,但是數據工程師沒有很多工具可以將這些強大的模型集成到生產系統中。在這裏,我將討論tensorflow serving如何幫助您加速在生產中交付模型。這篇博客文章是關於服務機器學習模型的-這是什麼意思?
Serving是訓練後如何應用ML模型的方法-Noah Fiedel軟件工程師致力於tensorflow serving。
爲了說明tensorflow serving的功能,我將逐步介紹serving一個對象檢測模型的步驟。在我的GitHub上找到與本文相關的所有代碼:https://github.com/fpaupier/tensorflow-serving_sidecar。
簡而言之,Tensorflow Serving使您能夠無縫地爲您的機器學習模型提供服務。
- 部署模型的新版本,讓tensorflow serving 優雅地完成當前請求,同時開始爲新模型提供新請求。
- 另外,數據科學家可以專注於構建出色的模型,而Ops可以專注於構建可以爲這些模型提供服務的高彈性和可擴展架構。
Part 1 — 預熱: 建立一個本地的tensorflow server
線上操作之前,最好先確保您的服務器可以在本地運行。我在這裏提供了重要步驟,請在項目readme文件中找到更多文檔。查看設置步驟,以確保您可以充分利用本教程:
- git clone https://github.com/fpaupier/t...,創建一個python3.6.5虛擬環境並安裝requirements.txt
- 獲取tensorflow serving 的docker鏡像。docker pull tensorflow /serving
- 獲取一個模型去serving。我用這個,它執行對象檢測faster_rcnn_resnet101_coco
- 轉到模型目錄,並使用版本號重命名已保存的模型子目錄,因爲我們在這裏進行的是v1,因此我們將其稱爲00001(必須爲數字)。我們這樣做是因爲tensorflow serving docker鏡像在搜索要服務的模型時會搜索以該約定命名的文件夾。
-
現在運行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 &
在繼續之前,需要提到一點:
這裏,我們將容器的端口和本地主機綁定在一起。因此,當我們調用localhost:8501時,我們實際上將調用tensorflow服務器。
您還注意到,我們將本地目錄目錄fast_rcnn_resnet101_coco_2018_01_28(用於存儲模型)與容器/ models / faster_rcnn_resnet路徑鏈接。
請切記,此時,saveModel.pb僅在您的計算機上,而不在容器中。
-
執行客戶端調用
# 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輸出)
太好了,既然我們的模型運行良好,就讓我們將其部署在雲上。
Part 2— 通過tensorflow serving 和 kubernetes部署你的機器學習模型
在生產環境中,您希望能夠隨着應用程序負載的增加而擴展。您不希望服務器不堪重負。
爲了避免這個問題,您將使用kubernetes集羣爲您的tensorflow-server應用程序提供服務。預期的主要改進:
- 您的副本之間的負載將達到平衡,而無需再考慮它。
- 您是否要在不停機的情況下部署新模型?沒問題,kubernetes支持了您。執行滾動更新以逐步服務於您的新模型,同時優雅地終止舊模型上的當前請求。
讓我們深入研究一下
首先,我們要創建一個完整的帶有嵌入式對象檢測模型的docker鏡像。完成後,我們將其部署在kubernetes集羣上。我的示例在Google Cloud Platform上運行。
創建一個定製的 tensorflow-serving docker image
-
將服務鏡像作爲守護程序運行:
docker run -d --name serving_base tensorflow/serving
-
拷貝faster_rcnn_resnet101_coco 模型數據到容器的
models/ folder
下。# From tensorflow-serving_sidecar/ docker cp $(pwd)/data/faster_rcnn_resnet101_coco_2018_01_28 serving_base:/models/faster_rcnn_resnet
-
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鏡像:
-
Stop serving base container
docker kill serving_base docker rm serving_base
太好了,下一步是測試我們全新的fast_rcnn_resnet_serving圖片。
測試定製server
在將我們的應用程序部署到kubernetes之前,請確保它可以正常運行。
-
啓動服務
docker run -p 8501:8501 -t faster_rcnn_resnet_serving &
注意:確保您已停止(docker stop <CONTAINER_NAME>)先前運行的服務器,否則端口8501可能已被綁定。
-
我們可以使用相同的客戶端代碼來調用服務器。
# 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
-
首先將定製的鏡像推送到鏡像倉庫。
docker push gcr.io/tensorflow-serving-229609/faster_rcnn_resnet_serving:v0.1.0
-
創建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服務。
一切啓動和運行可能需要一段時間。服務外部IP地址在LoadBalancer入口旁邊列出。您可以使用kubectl describe service命令進行檢查:
kubectl describe service faster-rcnn-resnet-service
查詢你的線上模型
最後,讓我們測試一下。我們可以使用相同的客戶端代碼。只需用上面指定的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"
結語
ensorflow服務提供了一個很好的基礎,您可以依靠它以極少的開銷在生產中快速部署模型。
- 機器學習應用程序的容器化可用於部署,從而將操作人員和數據科學家之間的關注點分開
- 諸如Kubernetes之類的容器編排解決方案與tensorflow-serving相結合,即使對於不熟悉分佈式計算的人,也可以在數分鐘內部署高可用性模型。