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

介绍 Kubeflow - 一个为 Kubernetes 构建的可组合、可移植、可扩展的机器学习堆栈

Kubernetes 与机器学习

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

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

更糟糕的是,这些部署与它们所部署的集群紧密耦合,导致这些堆栈无法移动,这意味着在没有进行重大重新架构的情况下,将模型从笔记本电脑移动到高度可扩展的云集群实际上是不可能的。所有这些差异加起来会浪费精力,并在每次转换时都可能引入错误。

Kubeflow 简介

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

  • JupyterHub 用于创建和管理交互式 Jupyter Notebook
  • 一个可配置为使用 CPU 或 GPU 的 Tensorflow 自定义资源 (CRD),只需一个设置即可根据集群大小进行调整
  • 一个 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 用户来说,使用多个环境(开发、测试、生产)将成为常态。通过使环境成为一流的概念,ksonnet 让 Kubeflow 用户可以轻松地在不同环境之间移动其工作负载。

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

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

接下来会发生什么?

我们正在努力建设社区,我们非常希望得到您的帮助!我们已经与许多团队合作——数梦云红帽和 OpenShiftCanonicalWeaveworksContainer Solutions 以及许多其他公司。CoreOS 例如,已经看到了 Kubeflow 的前景。

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

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

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

说明

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