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 ,请看下文补充:
这个 tutorial 展示了如何使用 TensorFlow Serving 组件在容器里面的运用,以此来服务 TensorFlow 模型,还展示了如何用 Kubernetes 配置服务中的集群。
为了解更多关于 TensorFlow 服务的信息,我们推荐《 TensorFlow 服务初级教程》和《 TensorFlow 服务教程》。
为了解更多关于 TensorFlow Inception 模型,我们推荐《 Inception in TensorFlow 》。
- Part0 展示的是怎样为配置创建一个 TensorFlow 服务 Docker
- Part1 展示的是如何在本地容器运行镜像
- Part2 展示了如何在 kubernetes 上配置
请参考《通过 Docker 使用 TensorFlow 服务》来了解创建过程中的更多细节。
运行容器
我们使用 Dockerfile.devel 来创建一个基底镜像$USER/tensorflow-serving-devel ,然后使用创建好的镜像来启动本地容器。
在容器中克隆,配置以及创建 TensorFlow 服务
在运行的容器中,我们克隆,配置以及创建 TensorFlow 服务。然后测试运行 inception_inference ( https://github.com/tensorflow/serving/blob/master/tensorflow_serving/example/inception_inference.cc)
容器中的输出 Inception
在容器中,我们运行 inception_export.py
( https://github.com/tensorflow/serving/blob/master/tensorflow_serving/example/inception_export.py)
使用发布的 Inception model training checkpoint
( http://download.tensorflow.org/models/image/imagenet/inception-v3-2016-03-01.tar.gz)
来出口 inception 模型。
我们使用训练有素的现成的动态检查点来恢复直接推理,并且直接输出它。
提交镜像到配置
注意我们从上述指令的容器中分离出来而不是终止它,因为我们想要为 Kubernetes 配置提交所有的修改到新的镜像 $USER/inception_serving 。
让我们在本地用创建的镜像测试一下服务流程。
-开启服务器
在容器中运行 gRPC 服务器
-查询服务器
( https://github.com/tensorflow/serving/blob/master/tensorflow_serving/example/inception_client.py)
客户端通过 gRPC 用一个命令行参数发送一个指定的镜像到服务器。然后查找 ImageNet 同义词集合和元数据文件,并且返回到人类可读的分类。
它运行起来了!服务器成功地分类了你的 cat 镜像!
在这一节里,我们使用 Part0 中创建的容器镜像来配置一个服务集群,用的是 Google Cloud Platform 中的 Kubernetes 。
- Cloud 项目登录
这里我们假设你已经创建并且已经登陆了名“ tensorflow-serving ” gcloud 项目。
-创建一个容器集群
首先,我们为服务配置创建一个 Google Container Engine 集群。
为 gcloud 容器命令设置默认集群,并且发送集群凭证到 kubectl 。
-上传 Docker 镜像
现在让我们来把我们的镜像 push 到[ Google Container Registry ]( https://cloud.google.com/container-registry/docs/),
这样我们就可以在 Google Cloud Platform 上面运行了。
首先,我们给*$USER/inception_serving*镜像贴上标签,用 Container Registry 格式以及我们的项目名称,
下面我们 push 镜像到 Registry ,
-创建 Kubernetes ReplicationController 和服务
配置包括不同的副本inception_inference 被一个 kubernetes Replication Controller 服务器控制。副本是由 Kubernetes 以及外部负载均衡起暴露在外部的。
我们使用那个 Kubernetes 公式inception_k8s.json的例子创建他们。
来看一下副本控制器和 pods :
来看一下服务的状态:
任何东西上传或者运行都需要时间。服务的外部 IP 地址就在 LoadBalancer 旁边被列出来。
-查询模型
我们现在可以从我们的本地主机外部地址查询服务。
你已经在 Kubernetes 里成功部署了 inception 服务。