这篇文章已超过一年。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否仍然准确。

介绍 Kubeflow - 一个为 Kubernetes 构建的可组合、可移植、可伸缩的 ML 堆栈

Kubernetes 与机器学习

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

构建任何生产就绪的机器学习系统都涉及各种组件,通常混合了供应商提供的方案和自行开发的方案。即使是对于中等复杂的设置,连接和管理这些服务也会给采用机器学习带来巨大的复杂性障碍。基础设施工程师在测试单个模型之前,通常会花费大量时间手动调整部署和自行开发解决方案。

更糟糕的是,这些部署与部署它们的集群紧密耦合,导致这些堆栈无法移动,这意味着将模型从笔记本电脑迁移到高可伸缩的云集群实际上是不可能的,除非进行重大的重新架构。所有这些差异累积起来导致了浪费的精力,并在每次迁移时都制造了引入 Bug 的机会。

介绍 Kubeflow

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

  • JupyterHub,用于创建和管理交互式 Jupyter Notebook
  • 一个 TensorFlow Custom Resource (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 Notebook
  • 一个 TF CRD

假设您想提交一个训练作业。Kubeflow 提供了 ksonnet 原型,使定义组件变得容易。tf-job 原型可以轻松为您的代码创建作业,但对于此示例,我们将使用 tf-cnn 原型,该原型运行 TensorFlow 的 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 用户而言,使用多个环境(dev、test、prod)将成为常态。通过将环境作为一流概念,ksonnet 使 Kubeflow 用户能够轻松地在不同环境之间迁移工作负载。

特别是因为 Helm 正在将其下一版本平台与 ksonnet 集成,我们认为这对我们来说是完美的选择。有关 ksonnet 的更多信息可以在 ksonnet 文档中找到。

我们还要感谢 Heptio 团队,他们加快了对 Kubeflow 使用 ksonnet 至关重要的功能的开发。

接下来是什么?

我们正致力于建立一个社区合作,非常欢迎您的帮助!我们已经与许多团队合作过 - 才云科技 (CaiCloud)Red Hat & OpenShiftCanonicalWeaveworksContainer Solutions 等等。CoreOS 例如,已经看到了 Kubeflow 的前景:

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

如果您想立即在浏览器中试用 Kubeflow,我们与 Katacoda 合作,让它变得超级简单。您可以在这里试用!

我们才刚刚开始!我们非常希望您能提供帮助。您可能会问如何帮助?嗯…

注意

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