Kubernetes + ML =?
技术
作者:David Aronchick & Jeremy Lewi
译者:夏天
2018-04-18 02:33

K8S 与机器学习  

目前,Kubernetes 已迅速成为可以在任何地方部署复杂 workload 的混合解决方案。尽管它始于无状态服务,但客户已经开始将复杂的 workload 转移到 Kubernetes 上,以便能享受 Kubernetes 提供的丰富 API 和可靠性。这其中增长最快的用例之一,就是使用 Kubernetes 作为机器学习的部署平台使用。

构建任何一个适用于生产环境的机器学习系统都需要各种组件,常常也会需要供应商和手动解决方案的搭配。连接和管理这些服务已然不易,再加上复杂的环境设置,更是为机器学习的具体应用带来了巨大的障碍。基础设施工程师通常会在测试单个模型之前,花费大量时间调整部署和手动解决方案。
更糟的是,这些部署与他们部署的集群紧密相关,以至于这套技术栈不便迁移。如果没有重构,将模型从笔记本电脑移动到高可扩展的云集群上几乎是不可能的。以上这些问题造成了人力和物力的大量浪费,并为每次迁移提供了引入 bug 的机会。

Kubeflow 项目

为了解决这些问题,我们宣布创建 Kubeflow 项目。这是一个新的开源项目,致力于让使用者可以简化、快速并可扩展地在 Kubernetes 上使用机器学习技术栈。这个项目包括:

  • JupyterHub 创建和管理交互式 Jupyter Notebooks;
  • Tensorflow 自定义资源(CRD),提供一键配置集群规模    ,可以更方便地使用 CPU 和 GPU ;
  • TF Serving容器 。由于该项目基于 Kubernetes 构建,所以它可以运行在任何 Kubernetes 集群中。赶快启动一个集群并开始使用吧!

如何使用 Kubeflow 

假设你在使用两个不同的 K8S 集群……假设你正在使用两个不同的 Kubernetes 集群:一个本地 minikube 集群和一个带有 GPU 的 GKE 集群 ; 并且你有两个名为 “minikube” 和 “gke” 的 kubectl contexts 。

首先,我们要初始化 ksonnet 应用程序并安装 Kubeflow 软件包。(要使用 ksonnet,你必须先将其安装在你的操作系统上)

现在我们可以根据这两个集群来定义环境。

然后我们就完成了!现在只需在集群上创建环境。首先,在 minikube 上:

然后在我们的多节点 GKE 集群上创建它,以加快训练速度:

通过尽可能小的保持环境间的切换和修改,这套机器学习技术栈的部署变得非常简单。如果想要访问服务,可以执行以下命令:

然后打开 http://127.0.0.1:8100 访问 JupyterHub。要更改 kubectl 使用的环境,请选择使用以下命令:

当你执行应用程序时,你将在 Kubernetes 上启动:

  • JupyterHub,可以用来启动和管理 Kubernetes 上的 Jupyter notebooks;
  • 一个 TensorFlow CRD。

假设你想提交一个训练作业……

假设你想提交一个训练作业。Kubeflow 提供了 ksonnet 模板,可以轻松定义组件。 tf-job 模板可以很容易地为你的代码创建一个训练作业,但在这个例子中,我们将使用 tf-cnn 模板 (它将运行 TensorFlow 的 CNN benchmark 上)。

要提交一个训练作业,首先你需要使用一个模板生成一个新作业:

在默认情况下,tf-cnn  仅仅使用 1 个 不带 GPU 的 worker ,这对于我们的 minikube 集群来说是完美的,所以我们可以只提交它就够了。

在 GKE 上,我们需要调整模版以利用多个节点和 GPU。首先,列出所有可用参数:

现在调整参数以利用 GPU 并访问多个节点。

注意我们是如何设置这些参数的,以便它们仅在部署到 GKE 时使用。你的 minikube 参数将保持不变!训练结束后,你可以将模型导出到模型服务的路径。Kubeflow 还包括一个服务包。在一个单独的例子中,我们训练了一个标准的 Inception 模型,并将训练好的模型存储到我们创建的名为 gs://kubeflow-models’ with the path ‘/inception。

为服务部署一个训练的模型,可执行以下命令:

值得一提的是,Kubeflow 支持直接将以上配置传入模型服务中。这个命令将在 GKE 集群上创建一个 tf-serving 服务,并让它在你的应用程序上可用。

Kubeflow + ksonnet

我们建议的一个选择是使用 ksonnet 项目。我们认为使用多种环境(开发,测试,产品)是大多数 Kubeflow 用户的常态。为了解决环境的问题,Kubeflow 使用 ksonnet 来帮助用户方便地在不同环境间切换 workloads。

Helm 将在下一版本中整合 ksonnet,这更加深了对于坚持道路自信。关于 ksonnet 的更多信息可以在 ksonnet 文档中找到。我们还要感谢 Heptio 团队为 Kubeflow 开发的 ksonnet 用例。

下一步

我们正在为建立一个 Kubeflow 社区而努力,我们希望得到您的帮助!我们已经与许多团队合作: 像 CaiCloud,Red Hat 和 OpenShift,Canonical,Weaveworks,Container Solutions 等等。

CoreOS 公司已经看到 Kubeflow 的前景。“Kubeflow 项目是一项必要的进步,它让在 Kubernetes 上设置和运行生产级的机器学习 workloads 这件事变得更加容易,我们预计,它将大大提升企业使用机器学习平台的可能性。我们期待与其他项目成员合作,让 Kubeflow 与企业 Kubernetes 平台 Tectonic 的深度集成。” Reza Shafii,CoreOS 产品副总裁说。

原文链接:https://kubernetes.io/blog/2017/12/introducing-kubeflow-composable

654 comCount 0