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

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

1. Docker中运行TensorFolw Serving

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

2. 构建TensorFolw模型的Docker镜像

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

# Returns => { "predictions": [2.5, 3.0, 4.5] }

3. Kubernetes部署TensorFolw模型

创建关于模型的Deployment

  • yaml文件
cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: halfplustwo-deployment
spec:
selector:
matchLabels:
app: halfplustwo
replicas: 1
template:
metadata:
labels:
app: halfplustwo
spec:
containers:
- name: halfplustwo
image: ljh/half_plus_two:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8501
name: restapi
- containerPort: 8500
name: grpc
  • 创建一个Deployment:
kubectl apply -f deployment.yaml
  • 展示Deployment相关信息:
kubectl get deployment -o wide
kubectl describe deployment halfplustwo-deployment
  • 列出deployment创建的pods:
kubectl get pods -l app=halfplustwo
  • 展示某一个pod信息
kubectl describe pod <pod-name>

使用service暴露你的应用

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

测试

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

删除deployment和service

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

4. 参考资料

[1] https://www.tensorflow.org/tfx/serving/docker    TensorFlow Serving 与 Docker
[2] https://www.tensorflow.org/tfx/serving/serving_kubernetes?hl=zh_cn 将TensorFlow Serving与 Kubernetes结合使用
[3] https://towardsdatascience.com/scaling-machine-learning-models-using-tensorflow-serving-kubernetes-ed00d448c917 Scaling Machine Learning models using Tensorflow Serving & Kubernetes
[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. 【MySQL】记一次线上重大事故:二狗子竟然把线上数据库删了!!

    写在前面 估计二狗子这几天是大姨夫来了,心情很郁闷,情绪也很低落,工作的时候也有点心不在焉.让他发个版本,结果,一行命令下去把线上的数据库删了!你没听错:是删掉了线上的数据库!运营那边顿时炸了锅:怎么 ...

  2. C++ Templates (1.1 初窥函数模板 A First Look at Function Templates)

    返回完整目录 目录 1.1 初窥函数模板 A First Look at Function Templates 1.1.1 定义模板 Defining the Template 1.1.2 使用模板 ...

  3. Networks of Spiking Neurons: The Third Generation of Neural Network Models

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 顺便安利一下同组的大佬做的SNN教程:https://spikingflow.readthedocs.io/zh_CN/latest/Tu ...

  4. Camera学习--光源

    进入CV 领域,视频图像的成像,最前端的camera,camera的sensor 以及影响成像质量的光源,噪声等因素是绕不开的问题. 那么今天就从成像的光源说起. 标准光源(Standard Ligh ...

  5. 启动Spring后,连接mysql报错

    连接失败,原因是Mysql服务未启动 解决方法:启动mysql服务 方法一: 以管理员身份运行CMD 输入命令:net start mysql 方法二: 右键计算机-管理-服务和应用程序-服务 右键启 ...

  6. 新网站seo如何优化

    http://www.wocaoseo.com/thread-189-1-1.html      做seo优化也有一段时间了,有做过自己的博客,自己的论坛,也有做过公司企业的网站,有同时一个人完成8个 ...

  7. 如何发挥微博客在seo营销中的作用

    http://www.wocaoseo.com/thread-158-1-1.html 我们知道,现在微博客已经发展的相当成熟,普通一个人,只要会上网,就能开通属于自己的博客,进而可以时时地通过微博客 ...

  8. 贝塞尔曲线(B-spline)的原理与应用

    什么是贝塞尔曲线? 贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线. 来源 贝塞尔曲线于1962,由法国工程师皮埃尔·贝塞尔(Pierre Béz ...

  9. 如何设计Restful风格的API

    RestfulAPI就是由后台(SERVER端)来提供接口,前端来调用.前端调用API向后台发起HTTP请求,后台响应请求将处理结果反馈给前端.也就是说Restful 是典型的基于HTTP的协议.那么 ...

  10. laravel5Eloquent模型与数据表的创建

    下面是有关管理员模型与表的创建 生成模型时同时生成数据库迁移文件 在生成的迁移文件中添加字段 运行命令行生成数据表 命令进行混合运用 生成工厂文件,数据填充文件 工厂模型代码 数据填充文件代码 数据填 ...