機器學習應用程序正在蓬勃發展,可是數據工程師沒有不少工具能夠將這些強大的模型集成到生產系統中。在這裏,我將討論tensorflow serving如何幫助您加速在生產中交付模型。這篇博客文章是關於服務機器學習模型的-這是什麼意思?python
Serving是訓練後如何應用ML模型的方法-Noah Fiedel軟件工程師致力於tensorflow serving。git
爲了說明tensorflow serving的功能,我將逐步介紹serving一個對象檢測模型的步驟。在個人GitHub上找到與本文相關的全部代碼:https://github.com/fpaupier/tensorflow-serving_sidecar。github
簡而言之,Tensorflow Serving使您可以無縫地爲您的機器學習模型提供服務。docker
線上操做以前,最好先確保您的服務器能夠在本地運行。我在這裏提供了重要步驟,請在項目readme文件中找到更多文檔。查看設置步驟,以確保您能夠充分利用本教程:json
如今運行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輸出)
太好了,既然咱們的模型運行良好,就讓咱們將其部署在雲上。
在生產環境中,您但願可以隨着應用程序負載的增長而擴展。您不但願服務器不堪重負。
爲了不這個問題,您將使用kubernetes集羣爲您的tensorflow-server應用程序提供服務。預期的主要改進:
讓咱們深刻研究一下
首先,咱們要建立一個完整的帶有嵌入式對象檢測模型的docker鏡像。完成後,咱們將其部署在kubernetes集羣上。個人示例在Google Cloud Platform上運行。
將服務鏡像做爲守護程序運行:
docker run -d --name serving_base tensorflow/serving
拷貝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
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鏡像。
在將咱們的應用程序部署到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"
Tensorflow Serving提供了一個很好的基礎,您能夠依靠它以極少的開銷在生產中快速部署模型。