机器学习应用程序正在蓬勃发展,可是数据工程师没有不少工具能够将这些强大的模型集成到生产系统中。在这里,我将讨论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提供了一个很好的基础,您能够依靠它以极少的开销在生产中快速部署模型。