速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

使用 Kubernetes 和 TensorFlow Serving 将神经网络镜像分类进行弹性扩容

  • 2020-03-12
  • 本文字数:5321 字

    阅读完需:约 17 分钟

使用Kubernetes和TensorFlow Serving将神经网络镜像分类进行弹性扩容

Google 近日 3 月 23-24 日在美国旧金山举办首次谷歌云平台(Google Cloud Platform) GCP NEXT 大会,参会人数超过 2000 人。GCP NEXT 大会以机器学习、资料中心和云端安全为主要议题,为未来 GCP 发展做战略规划。

其中,关于机器学习,谷歌发布了云端机器学习平台(Cloud Machine Learning),为开发者和企业用户提供一整套包含视听及翻译的应用 API,例如 Cloud Translate API 和 Cloud Vision API。除了 machine learning,谷歌去年就推出了机器学习开放原始码平台 TensorFlow,鼓励开发者利用该平台来开发创新应用服务。现在 TensorFlow 和 Kubernetes 相结合,将建立更为强大的机器学习模型,扩充功能,开启人工智能机器学习在谷歌云端的新纪元。


在 2011 年,谷歌开发了一个内部深度学习基础设施叫做“DistBelief”,这个设施允许谷歌人创建更大的神经网络和扩容实训成千上万个核心。最近几年,谷歌引进了 TensorFlow,也就是它的二代机器学习系统。TensorFlow 的特点是通用,灵活的,便携的,易于使用,最重要的是,它是使用开源社区开发的。



将机器学习引入到你的产品的过程包括创建和训练数据集模型。引入机器学习到你的产品这个过程涉及到创建和训练模型在你的数据集上,然后 push 模型到生产过程来提供请求。在这篇博客中,我们将会展示给你们如何通过 TensorFlow 使用 Kubernetes,TensorFlow 是一个高性能,满足应用程序的扩展需求,为机器学习模型提供开源服务系统。


现在让我们以镜像作为例子。假设你的应用程序需要能够在一系列类别中正确的识别一个镜像。比如,给出下面这个可爱的小狗图,你的系统应该将它归类到猎犬这一类。



你可以通过 TensorFlow 使用从 ImageNet 数据集上面 trained 的 Inception-v3 模型,来实现图像分类。这个数据集包含图片和标签,允许 TensorFlow 学习者 train 一个模型,该模型可以被用在生产过程中。



一旦模型被训练和输出,TensorFlow 服务使用该模型来进行推理——基于客户提供的新数据的预言。在我们的例子中,客户在 gRPC 请求提交镜像分类,gRPC 是一个来自谷歌的高性能,开源 RPC 的框架。



推理可以是十分资源密集型的。我们的服务器执行以下 TensorFlow 来处理它接收到的每一个分类的要求。Inception-v3 模型有超过 2700 万个参数,每次运算推理(inference)运行 57 亿浮点。



幸运地,这就是 Kubernetes 可以帮助到我们的地方。Kubernetes 分布推断请求处理跨集群使用外部负载均衡器。集群中的每个 pod 都包含一个 TensorFlow 服务于 Docker 镜像,还有 TensorFlow 服务为基础的 gRPC 服务器,以及一个 trained 的 Inception-v3 模型。这个模型以文件集描述 TensorFlow 图的形式呈现,模型权重,资产等等。既然所有东西都是整齐的打包好放到一起,那么我们就可以使用 Kubernetes Replication Controller 动态的扩展复制 pods,以此来跟上服务要求。


为了帮助你自己试一试,我们写了一个 tutorial 教程,它展示了如何创建 TensorFlow 服务 Docker 容器来给 Inception-v3 镜像分类模型提供服务,安装 Kubernetes 集群,并且应对该集群运行分类请求。我们希望这个教程能够让你更加容易地去整合机器学习到你自己的程序上,以及用 Kubernetes 扩大规模。学习更多关于 TensorFlow,请看下文补充:

用 TensorFlow Serving 和 Kubernetes 给 Inception 模型提供服务

这个 tutorial 展示了如何使用 TensorFlow Serving 组件在容器里面的运用,以此来服务 TensorFlow 模型,还展示了如何用 Kubernetes 配置服务中的集群。


为了解更多关于 TensorFlow 服务的信息,我们推荐《TensorFlow 服务初级教程》和《TensorFlow 服务教程》。


为了解更多关于 TensorFlow Inception 模型,我们推荐《Inception in TensorFlow》。


Part0 展示的是怎样为配置创建一个 TensorFlow 服务 Docker


Part1 展示的是如何在本地容器运行镜像


Part2 展示了如何在 kubernetes 上配置

Part0: 创建一个 Docker 镜像

请参考《通过 Docker 使用 TensorFlow 服务》来了解创建过程中的更多细节。

运行容器

我们使用 Dockerfile.devel 来创建一个基底镜像 $USER/tensorflow-serving-devel,然后使用创建好的镜像来启动本地容器。


USER/tensorflow-serving-devel -f tensorflow_serving/tools/docker/Dockerfile.devel .USER/tensorflow-serving-devel

在容器中克隆,配置以及创建 TensorFlow 服务

在运行的容器中,我们克隆,配置以及创建 TensorFlow 服务。然后测试运行 [inception_inference]。(网址:https://github.com/tensorflow/serving/blob/master/tensorflow_serving/example/inception_inference.cc)


root@c97d8e820ced:/# git clone --recurse-submodules https://github.com/tensorflow/servingroot@c97d8e820ced:/# cd serving/tensorflowroot@c97d8e820ced:/serving/tensorflow# ./configureroot@c97d8e820ced:/serving# cd ..root@c97d8e820ced:/serving# bazel build -c opt tensorflow_serving/...root@c97d8e820ced:/serving# lsAUTHORS          LICENSE    RELEASE.md  bazel-bin       bazel-out      bazel-testlogs  tensorflow          zlib.BUILDCONTRIBUTING.md  README.md  WORKSPACE   bazel-genfiles  bazel-serving  grpc            tensorflow_servingroot@c97d8e820ced:/serving# bazel-bin/tensorflow_serving/example/inception_inferenceE tensorflow_serving/example/inception_inference.cc:362] Usage: inception_inference --port=9000 /path/to/exports
复制代码

容器中的输出 Inception

在容器中,我们运行inception_export.py使用发布的Inception model training checkpoint来出口 inception 模型。


我们使用训练有素的现成的动态检查点来恢复直接推理,并且直接输出它。


root@c97d8e820ced:/serving# curl -O http://download.tensorflow.org/models/image/imagenet/inception-v3-2016-03-01.tar.gzroot@c97d8e820ced:/serving# tar xzf inception-v3-2016-03-01.tar.gzroot@c97d8e820ced:/serving# ls inception-v3README.txt  checkpoint  model.ckpt-157585root@c97d8e820ced:/serving# bazel-bin/tensorflow_serving/example/inception_export --checkpoint_dir=inception-v3 --export_dir=inception-exportSuccessfully loaded model from inception-v3/model.ckpt-157585 at step=157585.Successfully exported model to inception-exportroot@c97d8e820ced:/serving# ls inception-export00157585root@c97d8e820ced:/serving# [Ctrl-p] + [Ctrl-q]
复制代码

提交镜像到配置

注意我们从上述指令的容器中分离出来而不是终止它,因为我们想要为 Kubernetes 配置提交所有的修改到新的镜像 $USER/inception_serving。


$ docker commit inception_container $USER/inception_serving$ docker stop inception_container
复制代码

Part1:在本地 Docker 容器运行

让我们在本地用创建的镜像测试一下服务流程。


USER/inception_serving

开启服务器

在容器中运行 gRPC 服务器


root@f07eec53fd95:/# cd servingroot@f07eec53fd95:/serving# bazel-bin/tensorflow_serving/example/inception_inference --port=9000 inception-export &> inception_log &[1] 45
复制代码

查询服务器

用 inception_client.py.(https://github.com/tensorflow/serving/blob/master/tensorflow_serving/example/inception_client.py)。客户端通过gRPC用一个命令行参数发送一个指定的镜像到服务器。然后查找ImageNet同义词集合和元数据文件,并且返回到人类可读的分类。


root@f07eec53fd95:/serving# bazel-bin/tensorflow_serving/example/inception_client --server=localhost:9000 --image=/path/to/my_cat_image.jpg8.976576 : tabby, tabby cat8.725506 : Egyptian cat6.883981 : tiger cat2.659257 : lynx, catamount2.028728 : window screenroot@f07eec53fd95:/serving# exit
复制代码


它运行起来了!服务器成功地分类了你的 cat 镜像!

Part2:在 kubernetes 上配置

在这一节里,我们使用 Part0 中创建的容器镜像来配置一个服务集群,用的是 Google Cloud Platform 中的 Kubernetes。

GCloud 项目登录

这里我们假设你已经创建并且已经登陆了名“ tensorflow-serving”gcloud 项目。


$ gcloud auth login --project tensorflow-serving
复制代码

创建一个容器集群

首先,我们为服务配置创建一个 Google Container Engine 集群。


$ gcloud container clusters create inception-serving-cluster --num-nodes 5Creating cluster inception-serving-cluster...done.Created [https://container.googleapis.com/v1/projects/tensorflow-serving/zones/us-central1-f/clusters/inception-serving-cluster].kubeconfig entry generated for inception-serving-cluster.NAME                       ZONE           MASTER_VERSION  MASTER_IP        MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUSinception-serving-cluster  us-central1-f  1.1.8           104.197.163.119  n1-standard-1  1.1.8         5          RUNNING
复制代码


为 gcloud 容器命令设置默认集群,并且发送集群凭证到 kubectl。


$ gcloud config set container/cluster inception-serving-cluster$ gcloud container clusters get-credentials inception-serving-clusterFetching cluster endpoint and auth data.kubeconfig entry generated for inception-serving-cluster.
复制代码

上传 Docker 镜像

现在让我们来把我们的镜像 push 到Google Container Registry,这样我们就可以在 Google Cloud Platform 上面运行了。


首先,我们给 $USER/inception_serving 镜像贴上标签,用 Container Registry 格式以及我们的项目名称,


$ docker tag $USER/inception_serving gcr.io/tensorflow-serving/inception 
复制代码


下面我们 push 镜像到 Registry,


$ gcloud docker push gcr.io/tensorflow-serving/inception
复制代码

创建 Kubernetes ReplicationController 和服务

配置包括不同的副本 inception_inference 被一个 kubernetes Replication Controller 服务器控制。副本是由 Kubernetes 以及外部负载均衡起暴露在外部的。


我们使用那个 Kubernetes 公式 inception_k8s.json 的例子创建他们。


$ kubectl create -f tensorflow_serving/example/inception_k8s.jsonreplicationcontroller "inception-controller" createdservice "inception-service" created
复制代码


来看一下副本控制器和 pods:


$ kubectl get rcCONTROLLER             CONTAINER(S)          IMAGE(S)                              SELECTOR               REPLICAS   AGEinception-controller   inception-container   gcr.io/tensorflow-serving/inception   worker=inception-pod   3          20s
复制代码


$ kubectl get podNAME                         READY     STATUS    RESTARTS   AGEinception-controller-bbcbc   1/1       Running   0          1minception-controller-cj6l2   1/1       Running   0          1minception-controller-t1uep   1/1       Running   0          1m
复制代码


来看一下服务的状态:


$ kubectl get svcNAME                CLUSTER_IP      EXTERNAL_IP      PORT(S)    SELECTOR               AGEinception-service   10.15.242.244   146.148.88.232   9000/TCP   worker=inception-pod   3mkubernetes          10.15.240.1     <none>           443/TCP    <none>                 1h
复制代码


$ kubectl describe svc inception-serviceName:     inception-serviceNamespace:    defaultLabels:     <none>Selector:   worker=inception-podType:     LoadBalancerIP:     10.15.242.244LoadBalancer Ingress: 146.148.88.232Port:     <unnamed> 9000/TCPNodePort:   <unnamed> 32006/TCPEndpoints:    10.12.2.4:9000,10.12.4.4:9000,10.12.4.5:9000Session Affinity: NoneEvents:  FirstSeen LastSeen  Count From      SubobjectPath Reason      Message  ───────── ────────  ───── ────      ───────────── ──────      ───────  4m    3m    2 {service-controller }     CreatingLoadBalancer  Creating load balancer  3m    2m    2 {service-controller }     CreatedLoadBalancer   Created load balancer
复制代码


任何东西上传或者运行都需要时间。服务的外部 IP 地址就在 LoadBalancer 旁边被列出来。

查询模型

我们现在可以从我们的本地主机外部地址查询服务。


$ bazel-bin/tensorflow_serving/example/inception_client --server=146.148.88.232:9000 --image=/path/to/my_cat_image.jpg8.976576 : tabby, tabby cat8.725506 : Egyptian cat6.883981 : tiger cat2.659257 : lynx, catamount2.028728 : window screen
复制代码


你已经在 Kubernetes 里成功部署了 inception 服务。


本文转载自才云 Caicloud 公众号。


原文链接:https://mp.weixin.qq.com/s/Hf5NrNDuNYY5cgYvQXfxaQ


2020-03-12 22:52883

评论

发布
暂无评论
发现更多内容

创业开发一个体育直播软件平台的宏观环境:机会与威胁分析

软件开发-梦幻运营部

观测云:零售行业数据分析的利器

可观测技术

集成与 API 支持:开放架构的灵活性

可观测技术

LSP 协议:模块化 PoS 的全新叙事方案

股市老人

掌握良好的API设计原则:是什么、为什么和怎么办

幂简集成

API API 设计

远程访问Voice Engine AI工具:无需公网IP,轻松实现高效创作

贝锐

AI 花生壳 贝锐

解析 LSP 经济循环系统,如何推动生态形成价值增长?

股市老人

蓝易云 - 解析海外服务器改如何面对黑客的攻击和干扰!

百度搜索:蓝易云

云计算 运维 服务器 云服务器 高防服务器

Emby for Mac(轻松管理多媒体影音库)1.9.9中文版

iMac小白

ByteHouse高性能向量检索实践——“以图搜图”

字节跳动数据平台

数据库 大数据 云原生 Clickhouse 数仓

简单好用的京东商品详情API使用入门指南

技术冰糖葫芦

API 安全 API 文档 API 测试 API 优先 pinduoduo API

PromQL全方位解读:监控与性能分析的关键技术

快乐非自愿限量之名

性能分析 解读

单集群 100 节点!资源占用远小于 Grafana Mimir——GreptimeDB 海量数据写入性能报告

Greptime 格睿科技

数据库 性能测试 数据存储 Mimir 基准测试

IoTDB 集群性能优化:内存配置详解

Apache IoTDB

面试官:你的项目有哪些难点?

王磊

Java 面试

华为发布全新星盾安全架构 助力金融类鸿蒙原生应用更安全

最新动态

即时通讯和即时通信,即时通讯和实时通信

WorkPlus

华为大咖说 | 揭秘巴黎奥运会门票定价:为什么最低门票定24欧?

华为云PaaS服务小智

人工智能 华为云

大模型检索X一键成片,巴黎奥运的AI新演绎

阿里云CloudImagine

云计算 AI技术 大模型 视频云 奥运会

telegraf 常用命令总结

不在线第一只蜗牛

服务器 命令

玩转漫画、小说等跨模态AI创作,百度文库联合玄机科技举办国内首个AI漫画大赛

Geek_2d6073

万字干货:从消息流平台Serverless之路,看Serverless标准演进

华为云开发者联盟

Serverless lvm 信息流 企业号 8 月 PK 榜

强烈推荐这个大佬的 Redis 系列,看完直呼过瘾

码哥字节

redis 底层原理 Redis 7

蓝易云 - openproject在docker下的安装

百度搜索:蓝易云

Docker 云计算 运维 云服务器 OpenProject

蓝易云 - go、Java、python三门语言的优缺点和各自擅长做什么

百度搜索:蓝易云

Java Python Go Linux 运维

观测云:企业监控的定制化与精细化管理专家

可观测技术

可信数据库发展大会回顾 | 天谋科技乔嘉林:Apache TsFile & IoTDB 联合赋能智慧能源

Apache IoTDB

解锁AI安全新高度,安全极客全新升级

云起无垠

全网热议!GitHub发布的最简单的黑客入门教程,你值得拥有!

我再BUG界嘎嘎乱杀

黑客 网络安全 安全 信息安全 网安

发布更便宜的GPT-4o mini,OpenAI也打起了价格战

蓉蓉

openai GPT-4o mini

万字长文分享快手 Kolors 可图大模型应用实践

快手技术

#开源 #大模型

使用Kubernetes和TensorFlow Serving将神经网络镜像分类进行弹性扩容_行业深度_才云科技_InfoQ精选文章