机器学习模型常用Docker部署,而如何对Docker部署的模型进行管理呢?工业界的解决方案是使用Kubernetes来管理、编排容器。Kubernetes的理论知识不是本文讨论的重点,这里不再赘述,有关Kubernetes的优点读者可自行Google。笔者整理的Kubernetes入门系列重点是如何实操,前三节介绍了Kubernets的安装、Dashboard的安装,以及如何在Kubernetes中部署一个无状态的应用,本节将讨论如何在Kubernetes中部署一个可对外服务的Tensorflow机器学习模型,作为Kubernetes入门系列的结尾。

希望Kubernetes入门系列能对K8S初学者提供一些参考,对文中描述有不同观点,或者对工业级部署与应用机器学习算法模型有什么建议,欢迎大家在评论区讨论与交流~~~

1. Docker中运行TensorFolw Serving

  • 运行half_plus_two模型 [1]
  1. # Download the TensorFlow Serving Docker image and repo
  2. docker pull tensorflow/serving
  3. mkdir /data0/modules
  4. cd /data0/modules
  5. git clone https://github.com/tensorflow/serving
  6. # Location of demo models
  7. TESTDATA="/data0/modules/serving/tensorflow_serving/servables/tensorflow/testdata/"
  8. # Start TensorFlow Serving container and open the REST API port
  9. docker run -dit --rm -p 8501:8501 \
  10. -v /data0/modules/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu:/models/half_plus_two \
  11. -e MODEL_NAME=half_plus_two tensorflow/serving
  12. # Query the model using the predict API
  13. curl -d '{"instances": [1.0, 2.0, 5.0]}' \
  14. -X POST http://localhost:8501/v1/models/half_plus_two:predict
  15. # Returns => { "predictions": [2.5, 3.0, 4.5] }

2. 构建TensorFolw模型的Docker镜像

  • 后台运行serving容器
  1. docker run -d --rm --name serving_base tensorflow/serving
  • 拷贝模型数据到容器中的model目录
  1. docker cp /data0/modules/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu serving_base:/models/half_plus_two
  • 生成关于模型的镜像
  1. docker commit --change "ENV MODEL_NAME half_plus_two" serving_base ljh/half_plus_two
  • 停止serving容器
  1. docker kill serving_base
  2. docker rm serving_base
  • 启动服务
  1. docker run -dit --rm -p 8501:8501 \
  2. -e MODEL_NAME=half_plus_two ljh/half_plus_two
  • 查询模型
  1. curl -d '{"instances": [1.0, 2.0, 5.0]}' -X POST http://localhost:8501/v1/models/half_plus_two:predict
  2. # Returns => { "predictions": [2.5, 3.0, 4.5] }

3. Kubernetes部署TensorFolw模型

创建关于模型的Deployment

  • yaml文件
  1. cat deployment.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: halfplustwo-deployment
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: halfplustwo
  10. replicas: 1
  11. template:
  12. metadata:
  13. labels:
  14. app: halfplustwo
  15. spec:
  16. containers:
  17. - name: halfplustwo
  18. image: ljh/half_plus_two:latest
  19. imagePullPolicy: IfNotPresent
  20. ports:
  21. - containerPort: 8501
  22. name: restapi
  23. - containerPort: 8500
  24. name: grpc
  • 创建一个Deployment:
  1. kubectl apply -f deployment.yaml
  • 展示Deployment相关信息:
  1. kubectl get deployment -o wide
  2. kubectl describe deployment halfplustwo-deployment
  • 列出deployment创建的pods:
  1. kubectl get pods -l app=halfplustwo
  • 展示某一个pod信息
  1. kubectl describe pod <pod-name>

使用service暴露你的应用

  • yaml文件
  1. cat service.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. labels:
  6. run: halfplustwo-service
  7. name: halfplustwo-service
  8. spec:
  9. ports:
  10. - port: 8501
  11. targetPort: 8501
  12. name: restapi
  13. - port: 8500
  14. targetPort: 8500
  15. name: grpc
  16. selector:
  17. app: halfplustwo
  18. type: LoadBalancer
  • 启动service
  1. kubectl create -f service.yaml
  2. or
  3. kubectl apply -f service.yaml
  • 查看service
  1. kubectl get service
  2. #output:
  3. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  4. halfplustwo-service LoadBalancer 10.96.181.116 <pending> 8501:30771/TCP,8500:31542/TCP 4s
  5. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d
  6. nginx NodePort 10.96.153.10 <none> 80:30088/TCP 29h

测试

  1. curl -d '{"instances": [1.0, 2.0, 5.0]}' -X POST http://localhost:8501/v1/models/half_plus_two:predict
  2. {"predictions": [2.5, 3.0, 4.5]}

删除deployment和service

  1. kubectl delete -f deployment.yaml
  2. kubectl delete -f service.yaml

4. 参考资料

  1. [1] https://www.tensorflow.org/tfx/serving/docker TensorFlow Serving 与 Docker
  2. [2] https://www.tensorflow.org/tfx/serving/serving_kubernetes?hl=zh_cn 将TensorFlow Serving与 Kubernetes结合使用
  3. [3] https://towardsdatascience.com/scaling-machine-learning-models-using-tensorflow-serving-kubernetes-ed00d448c917 Scaling Machine Learning models using Tensorflow Serving & Kubernetes
  4. [4] http://www.tuwee.cn/2019/03/03/Kubernetes+Tenserflow-serving%E6%90%AD%E5%BB%BA%E5%8F%AF%E5%AF%B9%E5%A4%96%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%BA%94%E7%94%A8/ Kubernetes+Tenserflow-serving搭建可对外服务的机器学习应用

Kubernetes入门(四)——如何在Kubernetes中部署一个可对外服务的Tensorflow机器学习模型的更多相关文章

  1. 如何在 Knative 中部署 WebSocket 和 gRPC 服务?

    作者 | 冬岛  阿里云容器平台工程师 导读:虽然说 Knative 默认就支持 WebSocket 和 gRPC,但在使用中会发现,有时想要把自己的 WebSocket 或 gRPC 部署到 Kna ...

  2. kubernetes入门(01)kubernetes是什么?

    一.kubernetes是什么? Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署.大规模可伸缩.应用容器化管理.在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以 ...

  3. 如何在JAVA中实现一个固定最大size的hashMap

    如何在JAVA中实现一个固定最大size的hashMap 利用LinkedHashMap的removeEldestEntry方法,重载此方法使得这个map可以增长到最大size,之后每插入一条新的记录 ...

  4. 如何在tomcat前部署一个nginx

    在tomcat应用已经发布后,如何在tomcat前部署一个nginx,可以正常访问jsp,静态资源(html,css,js) 这里tomcat的端口号是8888 upstream morris { s ...

  5. 如何在idea中引入一个新maven项目

    如何在idea中引入一个新的maven项目,请参见如下操作:      

  6. 如何在html中把一个图片或者表格覆盖在一张已有图片上的任意位置

    如何在html中把一个图片或者表格覆盖在一张已有图片上的任意位置   <div style="position:relative;"> <img src=&quo ...

  7. (转)如何在Linux中统计一个进程的线程数

    如何在Linux中统计一个进程的线程数 原文:http://os.51cto.com/art/201509/491728.htm 我正在运行一个程序,它在运行时会派生出多个线程.我想知道程序在运行时会 ...

  8. docker 中部署一个springBoot项目

    docker 中部署一个springBoot项目 (1)介绍 springBoot项目 1.项目结构 2.pom.xml <?xml version="1.0" encodi ...

  9. kubernetes入门(04)kubernetes的核心概念(1)

    一.ReplicationController/ReplicaSet 在Kubernetes集群中,ReplicationController能够确保在任意时刻,指定数量的Pod副本正在运行.如果Po ...

随机推荐

  1. java class类和object类

    Class类 介绍 Java的Class类是java反射机制的基础,通过Class类我们可以获得关于一个类的相关信息 Java.lang.Class是一个比较特殊的类,它用于封装被装入到JVM中的类( ...

  2. yum安装软件时,提示No package netstat available.的解决方法

    1. 序言 如笔者在本机上运行netstat时,提示没有这个命令,向来简单粗暴,直接yum -y install netstat,显然是不能正常安装的. [root@hadoop-103 ~]# yu ...

  3. Magento add product attribute and assign to all group

    $attributes = array( 'product_type' => array( 'type' => 'int', 'input' => 'select', 'source ...

  4. openVswitch(OVS)源代码分析之工作流程(flow流表查询)

    原文链接: openVswitch(OVS)源代码分析之工作流程(flow流表查询)

  5. OpenStack 服务心跳机制和状态监控

    参考链接: OpenStack服务心跳机制和状态监控 https://blog.csdn.net/qqhappy8/article/details/79304221

  6. [Redhat虚拟机安装][VirtualBox][NET:Registered protocol family 2]

    错误情况 今晚试着用VirtualBox虚拟机安装RedHat,但是安装过程中一直卡在一个NET:Registered protocol family 2这个地方. 错误截图 情况如下图所示: 解决方 ...

  7. ZERO:新手应该如何学习SEO优化

    http://www.wocaoseo.com/thread-325-1-1.html 有一个10000小时理论,说是在各行各业,想成为大师级的人物就要付出10000小时的努力,在SEO这边也是如此. ...

  8. 关于Chrome浏览器自动同步的问题

    Chrome浏览器是开发者最喜欢的浏览器,没有之一,那么公司办公和在家办公的话数据需要有一致性,这个时候就用到了浏览器的自动同步的功能 因为网络的问题,谷歌账户很难登录,基本需要VPN翻墙处理之后才能 ...

  9. python - 平方根格式化 + 字符串分段组合

    题目来源:python123 平方根格式化 描述 获得用户输入的一个整数a,计算a的平方根,保留小数点后3位,并打印输出.‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪ ...

  10. Netty源码分析之ByteBuf(一)—ByteBuf中API及类型概述

    ByteBuf是Netty中主要的数据容器与操作工具,也是Netty内存管理优化的具体实现,本章我们先从整体上对ByteBuf进行一个概述: AbstractByteBuf是整个ByteBuf的框架类 ...