Kubeflow 入门——为 Kubernetes 打造的组件化、可移植、可扩展的机器学习堆栈
【编者的话】本文来自 Kubeflow 项目的产品经理 David Aronchick 和首席工程师 Jeremy Lewi,主要讲了他们新的开源项目——Kubeflow 的一些入门知识,Kubeflow 致力于使 Kubernetes 上的机器学习堆栈变得简单,快速及可扩展。
Kubernetes 已经迅速成长为部署复杂工作负载的混合解决方案。 虽然提供的只是无状态服务,但客户已经开始将复杂的工作负载转移到Kubernetes 平台上,并充分利用了 Kubernetes 提供的丰富API、可靠性以及良好的性能。其中增长最快的用途之一是使用 Kubernetes 作为机器学习的部署平台。
构建一套生产环境下的机器学习系统需要涉及各种组件,通常需要使用混合供应商并结合自研的解决方案。使用相对复杂的配置来连接和管理这些服务,给学习机器学习带来了巨大障碍。基础设施工程师通常会花费大量时间手动部署,然后才能测试一个模型。
更糟糕的是,上述部署与他们部署的集群紧密相关,这些堆栈是不可移植的,这意味着在没有进行重大重新架构的情况下,将模型从笔记本电脑迁移到高度可扩展的云端集群实际上是不可能的。所有这些差异都会浪费极大的精力,并且每次转换都可能会引入 bug。
Kubeflow 入门
为了解决这些问题,我们决定创建 Kubeflow 项目,一个新的开源 Github repo,致力于在 Kubernetes 上让 ML(Machine Learning)堆栈变得简单,快速、可扩展。
这个仓库包含:
- JupyterHub,用于创建和管理交互性的 Jupyter notebook
- Tensorflow Custom Resource (CRD),无论是 GPU 和CPU的选择还是调整集群大小,一条命令就能搞定。
- 一个 TF 服务容器
因为此解决方案基于 Kubernetes, 所以任何运行 Kubernetes 的地方都可以使用此方案。只需启动一个集群,便可使用。
使用 Kubeflow
假设你正在使用两个不同的 Kubernetes 集群:一个本地的
minikube
集群和一个使用 GPU 的
GKE
集群,而且有两 kubectl 上下文,分别命名为 minikube 和 gke。
首先需要初始化
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
打开地址
ttp://127.0.0.1:8100
访问 JupyterHub。使用下面的命令,就可以通过 kubectl 修改环境变量:
# To access minikube kubectl config use-context minikube # To access GKE kubectl config use-context gke
执行
应用
时, 就会在 k8s上启动:
- 启动和管理 Jupyter notebook 的 JupyterHub
-
一个
TF CRD
假设你想提交一个训练任务,Kubeflow 提供了 ksonnet 原型,可以轻松定义组件。tf-job 原型可以很容易地为你的代码创建一个任务,但是对于训练任务,我们将使用运行了 TensorFlow CNN 基准的 tf-cnn 原型。
提交训练任务前,首先从模型中生成一个新的任务
ks generate tf-cnn cnn --name=cnn
tf-cnn 模型默认使用一个 worker,没有使用 GPU,很适合 minikube 集群,直接提交即可。
ks apply minikube -c cnn
对于 GKE,我们要转为使用另外一个模型,以便充分利用其多节点及 GPU 的优势,首先,列出所有可用参数:
# To see a list of parameters ks prototype list tf-job
调整参数:
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 中的参数并未改变(编者注: 使用了
-- env
来指定想要修改参数的集群)。
训练之后,就可以将模型迁移到用到的服务上。
Kubeflow 还包括一个服务包。在另外一个单独的例子中,我们训练了一个标准的 Inception 模型,并将训练好的模型存储在名为
gs:// kubeflow-models
的 bucket 中,路径为
/ inception
。
可以通过下面的命令,部署一个训练好的模型
ks generate tf-serving inception --name=inception ---namespace=default --model_path=gs://kubeflow-models/inception ks apply gke -c inception
这也同时突出了 Kubeflow 另外一个功能 — 部署时接受输入。这条命令创建了一个基于 GKE 集群的
tf-serving
服务,面向应用程序可用。
有关部署和监控 TensorFlow 训练任务和 TensorFlow 模型的更多信息,请参阅
用户指南
。
Kubeflow + ksonnet
我们想引出的是 ksonnet 的使用。我们认为多环境(dev,test,prod)开发将会是大多数 Kubeflow 用户的常态。通过将环境作为一等概念,ksonnet 使 Kubeflow 用户可以在不同环境之间轻易地迁移工作负载。
我们觉得 Ksonnet 是一个不错的选择,特别是现在 Helm 正在把 Ksonnet 整合到其下一个版本的平台中。有关 ksonnet 的更多信息可以在
ksonnet文档
中找到。
我们也要感谢 Heptio 团队加快支持了 Kubeflow 用到的一些 ksonnet 关键功能。
接下来呢?
我们正在努力建立一个社区,并期待大家的贡献!我们已经和许多团队合作比如
CaiCloud
、
Red Hat&OpenShift
、
Canonical
、
Weavework
、
Container Solutions
等等。CoreOS 对 Kubeflow 寄予了厚望:
“Kubeflow 在简易化 Kubernetes 上配置和生产化机器学习工作负载上取得了重大进步,我们认为这会极大程度上让更多企业接受该平台。我们期待与 Kubeflow 团队合作,提供 Kubeflow 与企业级 Kubernetes 平台 — Tectonic 的紧密集成。“ — Reza Shafii,CoreOS 产品副总裁
如果你现在想在浏览器中尝试 Kubeflow,我们已经与
Katacoda
合作, 点击
这里
轻松尝试!
我们才刚刚起步!我们很乐意为您提供帮助,可以通过以下方式关注我们:
-
加入
slack 频道
-
加入
kubeflow-discuss 电子邮件列表
-
订阅
Kubeflow Twitter 帐户
- 下载并运行 kubeflow,并提交 bug!