使用 MiniKF 和 Kale 从笔记本到 Kubeflow 流水线

1. 简介

Kubeflow 是一种面向 Kubernetes 的机器学习工具包。该项目旨在让您可以在 Kubernetes 上以可移植、可扩缩的方式轻松部署机器学习 (ML) 工作流。其目标是提供一种简单直接的方法,将机器学习领域的同类最佳开源系统部署到各种基础架构中。

Kubeflow 部署是什么样的?

Kubeflow 部署是指:

  • 可移植 - 可在任何 Kubernetes 集群上运行,无论该集群位于 Google Cloud Platform (GCP)、本地还是跨提供商。
  • 可伸缩 - 可以利用波动的资源,并且仅受分配给 Kubernetes 集群的资源数量的限制。
  • 可组合 - 通过服务工作器增强,可在离线或低质量网络上运行。

它是一种将松散耦合的微服务组织为单个单元并将其部署到各种位置(无论是笔记本电脑还是云端)的方式。

此 Codelab 将引导您使用 MiniKF 创建自己的 Kubeflow 部署,并在 Jupyter 笔记本中运行 Kubeflow Pipelines 工作流。

构建内容

在此 Codelab 中,您将使用 Kubeflow Pipelines 构建复杂的数据科学流水线,而无需使用任何 CLI 命令或 SDK。您无需具备任何 Kubernetes 或 Docker 知识。完成上述步骤后,您的基础设施将包含:

  • 自动安装以下各项的 MiniKF (Mini Kubeflow) 虚拟机:
  • Kubernetes(使用 Minikube)
  • Kubeflow
  • Kale,一种将通用 Jupyter 笔记本转换为 Kubeflow Pipelines 工作流的工具 ( GitHub)
  • 用于数据版本控制和可重现性的 Arrikto Rok

学习内容

  • 如何使用 MiniKF 安装 Kubeflow
  • 如何在不使用任何 CLI 命令或 SDK 的情况下将 Jupyter 笔记本转换为 Kubeflow 流水线
  • 如何通过点击按钮从笔记本内部运行 Kubeflow Pipelines
  • 如何在笔记本和每个流水线步骤中自动对数据进行版本控制

所需条件

本 Codelab 是一篇高级 Codelab,重点介绍 Kubeflow。如需了解更多背景信息和平台简介,请参阅 Kubeflow 简介文档。对于不相关的概念,我们仅会略作介绍;对于不相关的代码,我们会予以提供,以便您复制和粘贴。

2. 设置环境

设置您的 GCP 项目 ID 和集群名称

如需查找项目 ID,请访问 GCP Console 的“首页”面板,该面板位于左上角的汉堡菜单中。如果屏幕为空,请在提示中点击“是”以创建信息中心。

打开 GCP Console

3fdc4329995406a0.png

如果尚未选择项目,请点击选择项目

e8952c0b96067dea.png

然后选择您的项目。您应该只拥有一个:

fe25c1925487142.png

3. 安装 MiniKF

创建计算实例

在 GCP Marketplace 中,搜索“MiniKF”。

选择 Arrikto 的 MiniKF 虚拟机。

d6b423c1911ea85a.png

点击在 Compute Engine 上启动按钮,然后选择您的项目。

b5eeba43053db4bd.png

配置和部署窗口中,为 MiniKF 实例选择一个名称,然后保留默认选项。然后,点击部署按钮。

dc401e2bb5a884d9.png

等待 MiniKF 计算实例启动。

5228086caadc44c6.png

登录 MiniKF

当 MiniKF 虚拟机启动后,点击 SSH 按钮进行连接和登录。按照屏幕上的说明运行命令 minikf,该命令将启动 Minikube、Kubeflow 和 Rok 的部署。这需要几分钟才能完成。

774e83c3e96cf7b3.png

登录 Kubeflow

安装完成后,并且所有 pod 都已准备就绪,请访问 MiniKF 信息中心。使用 MiniKF 用户名和密码登录 Kubeflow。

251b0bcdbf6d3c71.png

9d49d899bb0b5bd1.png

Chrome 用户会看到以下界面:

6258e0f09e46a6c2.png

Firefox 用户会看到以下界面:

8cff90ce2f0670bd.png

Safari 用户会看到以下界面:

1c6fd768d71c0a92.png

登录 Rok

登录 Kubeflow 后,点击汉堡图标打开左侧菜单。前往 Snapshot Store,然后使用 MiniKF 用户名和密码登录 Rok。

a683198ac4ba900d.png

80aad6ba5d298a7e.png

恭喜!您已成功在 GCP 上部署 MiniKF!您现在可以创建笔记本、编写机器学习代码并运行 Kubeflow Pipelines。使用 Rok 进行数据版本控制和重现。

4. 从笔记本内部运行流水线

在本部分中,您将运行 Titanic 示例,这是一项 Kaggle 竞赛,旨在预测哪些乘客在泰坦尼克号沉船事故中幸存下来。

创建笔记本服务器

在 Kubeflow 中央信息中心内,找到笔记本服务器链接。

4115cac8d8474d73.png

点击新服务器

f9303c0a182e47f5.png

为您的笔记本服务器指定名称。

a2343f30bc9522ab.png

请确保您已选择此图片:

gcr.io/arrikto-public/tensorflow-1.14.0-notebook-cpu:kubecon-workshop

添加一个大小为 5 GB 的新空数据卷,并将其命名为 data

8544d9b05826b316.png

点击启动以创建笔记本服务器。

28c024bcc55cc70a.png

当笔记本服务器可用时,点击连接以连接到该服务器。

2f06041475f45d3.png

下载数据和笔记本

系统随即会打开一个新标签页,其中显示 JupyterLab 着陆页。在 JupyterLab 中创建新终端。

2482011174f7bc75.png

在终端窗口中,运行以下命令以进入 data 文件夹,并下载您将在本实验的剩余部分中使用的笔记本和数据。

cd data/
git clone -b kubecon-workshop https://github.com/kubeflow-kale/examples

此代码库包含一系列精选示例,其中包含数据和带注释的笔记本。在边栏中找到文件夹 data/examples/titanic-ml-dataset/ 并打开笔记本 titanic_dataset_ml.ipynb

c85baf68b36c63b2.png

探索 Titanic 挑战赛的机器学习代码

逐步运行笔记本。请注意,该代码因缺少库而失败。

bf2451fd7407e334.png

返回到终端并安装缺少的库。

pip3 install --user seaborn

d90593b21425dd12.png

点击刷新图标,重启笔记本内核。

a21f5f563b36ce4d.png

再次运行该单元格,确保已安装正确的库,并查看运行结果是否成功。

将笔记本转换为 Kubeflow 流水线

点击左侧窗格中的 Kubeflow 图标,启用 Kale。

3f4f9c93b187b105.png

探索单元格级依赖项。了解多个单元格如何成为单个流水线步骤的一部分,以及流水线步骤如何依赖于之前的步骤。

15cca32444c1f12e.png

点击编译并运行按钮。

bde5cef34f00e258.png

查看快照的进度。

9408f46abb2493f5.png

查看流水线运行的进度。

9edbde68032f5e4b.png

点击该链接前往 Kubeflow Pipelines 界面并查看运行情况。

a81646a22584e1b9.png

等待该流水线完成。

44bee7dc0d24ec21.png

d377b6d574a4970.png

恭喜!您刚刚从笔记本中运行了一个端到端 Kubeflow 流水线!

5. 使用卷快照实现可重现性

检查结果

查看倒数第二个流水线步骤 Results 的日志。请注意,所有预测因素的得分均为 100%。经验丰富的数据科学家会立即发现此情况可疑。这很好地表明,我们的模型无法泛化,而是与训练数据集过拟合。这很可能是由于模型所使用的数据存在问题。

2a594032c2dd6ff6.png

重现之前的状态

幸运的是,Rok 会负责数据版本控制,并重现您点击 Compile and Run 按钮时的整个环境。这样,您就拥有了数据和代码的时间机器。因此,我们先恢复流水线在训练其中一个模型之前的状态,看看会发生什么情况。查看 randomforest 步骤,然后点击 Artifacts

4f25ca4560711b23.png

按照 Markdown 中的步骤操作,即点击相应链接,在 Rok 界面中查看快照。

e533bc781da9355a.png

复制 Rok 网址。

d155d19731b5cedd.png

前往 Notebook 服务器链接。

aafeab01f3ef0863.png

点击新服务器

f2265a64e8f9d094.png

粘贴您之前复制的 ROK 网址,然后点击自动填充按钮。

9ba4d4128a3bdeea.png

为笔记本指定名称。

7685c3bf35fc74b2.png

请确保您已选择此图片:

gcr.io/arrikto-public/tensorflow-1.14.0-notebook-cpu:kubecon-workshop

点击启动以创建笔记本服务器。

28c024bcc55cc70a.png

当笔记本服务器可用时,点击连接以连接到该服务器。

34955a64ae316de1.png

请注意,笔记本会在您生成的流水线步骤的确切单元格中打开。

a1f7c81f349e0364.png

在后台,Kale 通过导入所有库并加载上一步中的变量,恢复了笔记本的状态。

调试先前状态

向此单元格添加一个 print 命令:

print(acc_random_forest)

Shift + Return 运行活动单元,以重新训练随机森林并打印得分。为 100。

e2a8a3b5465fcb5d.png

现在,我们来看看训练数据中是否存在异常情况。如需探索并解决此问题,请选择上一个单元格,然后点击加号图标 (+),在随机森林 Markdown 上方添加一个单元格。

d1077f32dff9620f.png

添加以下文本并执行相应单元格,以打印训练集。

train_df

2854798ff01aed4e.png

糟糕!包含训练标签的列(“Survived”)被错误地包含为输入特征!模型已学会专注于“Survived”特征,而忽略其余特征,从而污染输入。此列与模型的目标完全一致,但在预测期间不存在,因此需要从训练数据集中移除,以便模型从其他特征中学习。

添加 bug 修复

如需移除此列,请修改相应单元格以添加以下命令:

train_df.drop('Survived', axis=1, inplace=True)
train_df

9e76c16a862b566.png

启用 Kale,并确保移除 Survived 标签的单元格属于 featureengineering 流水线步骤(它应具有相同的轮廓颜色)。

点击 Compile and Run 按钮,再次运行流水线。

点击该链接前往 Kubeflow Pipelines 界面并查看运行情况。

等待结果步骤完成,然后查看日志以查看最终结果。现在,您可以获得切合实际的预测得分了!

8c6a9676b49e5be8.png

6. 清理

销毁 MiniKF 虚拟机

在 GCP Console 中前往 Deployment Manager,然后删除 minikf-1 部署。

7. 恭喜

恭喜,您已成功使用 Kubeflow (MiniKF)、Kale 和 Rok 运行了端到端数据科学工作流!

后续操作

加入 Kubeflow 社区:

深入阅读