本文已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不正确。

推出 Kubeflow - 一个为 Kubernetes 构建的可组合、可移植、可扩展的 ML 堆栈

Kubernetes 和机器学习

Kubernetes 迅速成为在任何地方部署复杂工作负载的混合解决方案。虽然它最初只用于无状态服务,但客户已经开始将复杂的工作负载迁移到该平台,利用 Kubernetes 提供的丰富的 API、可靠性和性能。其中一个增长最快的用例是将 Kubernetes 用作机器学习的首选部署平台。

构建任何生产就绪的机器学习系统都涉及各种组件,通常混合使用供应商和手工解决方案。即使对于适度复杂的设置,连接和管理这些服务也会在采用机器学习方面引入巨大的复杂性障碍。基础设施工程师通常会花费大量时间手动调整部署和手工解决方案,然后才能测试单个模型。

更糟糕的是,这些部署与它们所部署到的集群紧密相连,以至于这些堆栈是不可移动的,这意味着在不进行重大架构重新设计的情况下,将模型从笔记本电脑移动到高度可扩展的云集群实际上是不可能的。所有这些差异都会导致精力的浪费,并为每次转换引入错误创造机会。

推出 Kubeflow

为了解决这些问题,我们宣布创建 Kubeflow 项目,这是一个新的开源 GitHub 存储库,致力于使在 Kubernetes 上使用 ML 堆栈变得简单、快速和可扩展。该存储库包含

  • JupyterHub 用于创建和管理交互式 Jupyter 笔记本
  • 一个 TensorFlow 自定义资源 (CRD),可以配置为使用 CPU 或 GPU,并通过单个设置调整为集群的大小
  • 一个 TF Serving 容器。由于此解决方案依赖于 Kubernetes,因此它可以在 Kubernetes 运行的任何地方运行。只需启动一个集群即可!

使用 Kubeflow

假设您正在使用两个不同的 Kubernetes 集群:一个本地 minikube 集群;和一个带有 GPU 的 GKE 集群;并且您定义了两个名为 minikube 和 gke 的 kubectl 上下文

首先,我们需要初始化我们的 ksonnet 应用程序并安装 Kubeflow 软件包。(要使用 ksonnet,您必须首先将其安装在您的操作系统上 - 执行此操作的说明在这里

     ks init my-kubeflow  
     cd my-kubeflow  
     ks registry add kubeflow \  
     github.com/google/kubeflow/tree/master/kubeflow  
     ks pkg install kubeflow/core  
     ks pkg install kubeflow/tf-serving  
     ks pkg install kubeflow/tf-job  
     ks generate core kubeflow-core --name=kubeflow-core

我们现在可以定义与我们的两个集群相对应的环境

     kubectl config use-context minikube  
     ks env add minikube  

     kubectl config use-context gke  
     ks env add gke  

我们完成了!现在只需在您的集群上创建环境。首先,在 minikube 上

     ks apply minikube -c kubeflow-core  

为了更快地进行训练,在我们的多节点 GKE 集群上创建它

     ks apply gke -c kubeflow-core  

通过轻松地在任何地方部署相同的丰富 ML 堆栈,这些环境之间的漂移和重写被保持在最低限度。

要访问任一部署,您可以执行以下命令

     kubectl port-forward tf-hub-0 8100:8000  

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

     # To access minikube  
     kubectl config use-context minikube  

     # To access GKE  
     kubectl config use-context gke  

当您执行 apply 时,您正在 K8s 上启动

  • JupyterHub 用于在 K8s 上启动和管理 Jupyter 笔记本
  • 一个 TF CRD

假设您要提交训练作业。Kubeflow 提供 ksonnet 原型,可以轻松定义 组件。tf-job 原型可以轻松地为您的代码创建作业,但在此示例中,我们将使用运行 TensorFlow 的 CNN 基准测试的 tf-cnn 原型。

要提交训练作业,您首先从原型生成一个新作业

     ks generate tf-cnn cnn --name=cnn  

默认情况下,tf-cnn 原型使用 1 个 worker 且没有 GPU,这非常适合我们的 minikube 集群,因此我们可以直接提交它。

     ks apply minikube -c cnn

在 GKE 上,我们将需要调整原型以利用多个节点和 GPU。首先,让我们列出所有可用的参数

     # To see a list of parameters  
     ks prototype list tf-job  

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

     ks param set --env=gke cnn num\_gpus 1  
     ks param set --env=gke cnn num\_workers 1  

     ks apply gke -c cnn  

请注意,我们如何设置这些参数,以便它们仅在您部署到 GKE 时使用。您的 minikube 参数保持不变!

训练后,您将 导出模型到服务位置。

Kubeflow 还包括一个服务软件包。

要部署训练好的模型以进行服务,请执行以下操作

     ks generate tf-serving inception --name=inception  
     ---namespace=default --model\_path=gs://$bucket_name/$model_loc
     ks apply gke -c inception  

这突出了 Kubeflow 中的另一个选项 - 基于您的部署传递输入的能力。此命令在 GKE 集群上创建 tf-serving 服务,并使其可供您的应用程序使用。

有关部署和监控 TensorFlow 训练作业和 TensorFlow 模型的更多信息,请参阅用户指南

Kubeflow + ksonnet

我们想要强调的一个选择是使用 ksonnet 项目。我们认为,对于大多数 Kubeflow 用户来说,使用多个环境(开发、测试、生产)将成为常态。通过将环境作为一等概念,ksonnet 使 Kubeflow 用户可以轻松地在不同的环境之间移动他们的工作负载。

特别是在 Helm 将 ksonnet 与其平台的下一个版本集成之后,我们觉得它是我们的完美选择。有关 ksonnet 的更多信息,请参阅 ksonnet 文档

我们还要感谢 Heptio 团队加速了对 Kubeflow 使用 ksonnet 至关重要的功能。

下一步是什么?

我们目前正在构建社区,并且我们很乐意为您提供帮助!我们已经与许多团队合作 - CaiCloudRed Hat & OpenShiftCanonicalWeaveworksContainer Solutions 和其他许多团队。例如,CoreOS 已经看到了 Kubeflow 的前景

“Kubeflow 项目是一个必要的进步,它使在 Kubernetes 上设置和生产机器学习工作负载变得更加容易,我们预计它将大大扩大更多企业采用该平台的机会。我们期待与项目成员合作,将 Kubeflow 与企业 Kubernetes 平台 Tectonic 紧密集成。” -- CoreOS 产品副总裁 Reza Shafii

如果您想立即在浏览器中试用 Kubeflow,我们已经与 Katacoda 合作,使其变得非常容易。您可以在这里试用!

我们才刚刚开始!我们很乐意为您提供帮助。您可能会问?好吧…

  • 请加入 slack 频道
  • 请加入 kubeflow-discuss 电子邮件列表
  • 请订阅 Kubeflow twitter 帐户
  • 请下载并运行 Kubeflow,并提交错误报告!感谢您一直以来的支持,我们对此感到无比兴奋!

注意

  • 本文已于 2023 年 6 月修订,以更新训练模型的存储桶位置。