使用 Kubeflow Pipelines 2.0 和 MinIO 设置开发机器

Setting up a Development Machine with Kubeflow Pipelines 2.0 and MinIO

工程师喜欢在本地进行实践和学习。无论研究的是什么工具:高端存储解决方案、工作流编排引擎,还是分布式计算的最新成果,都是如此。学习新技术的最佳方法是找到一种方法,将所有内容都塞到一台机器上,以便您可以亲自动手操作。

Kubeflow Pipelines是Kubeflow完整发行版中的核心组件。您可以安装Kubeflow的完整发行版,也可以安装仅包含Kubeflow Pipelines的独立安装版本。在这篇文章中,我将演示如何使用Kubeflow Pipelines(KFP)的独立安装版本和MinIO的独立安装版本来设置开发机器。KFP和MinIO结合使用效果更佳。使用KFP,您可以构建和运行用于获取数据和训练模型的流水线。在您为数据构建流水线并训练模型时,您将需要一个存储解决方案。这就是MinIO可以提供帮助的地方。

MinIO是存储机器学习数据和模型的绝佳方式。使用MinIO,您可以保存训练集、验证集、测试集和模型,而无需担心规模或性能问题。此外,总有一天人工智能会被监管;当这一天到来时,您将需要MinIO的企业级功能(对象锁定版本控制加密法律保留)来确保您数据在静态状态下的安全,并确保您不会意外删除监管机构可能要求的内容。我们本可以尝试使用KFP的MinIO实例——但是,对于机器学习数据流水线来说,这不是最佳设计。您需要一个完全受您控制的存储解决方案。下图是我们的Kubeflow和MinIO部署图,说明了每个MinIO实例的目的。

我们将安装的内容

下面列出了需要安装的所有内容。此列表包括核心组件(MinIO和KFP),以及依赖项和SDK。我希望这篇文章可以作为一份食谱,可以严格按照步骤配置KFP流水线开发机器。如果这些说明中的任何一项不起作用,请告知我们。

  1. Docker Desktop
  2. Kubernetes
  3. kubectl(Kubernetes命令行工具)
  4. Kubeflow流水线资源
  5. KFP SDK
  6. MinIO
  7. MinIO访问密钥和密钥
  8. MinIO SDK

Docker Desktop

您可以在Docker的网站上找到适合您操作系统的安装程序,网址为此处。如果您在Mac上安装Docker Desktop,则需要知道您的Mac使用的芯片——Apple或Intel。您可以通过点击Mac左上角的Apple图标,然后点击“关于本机”菜单选项来确定这一点。

Kubernetes

Kubeflow运行在Kubernetes上——因此,您将需要一个正在运行的Kubernetes集群。此外,您必须熟悉Kubernetes命令行工具才能安装和管理Kubeflow。获取Kubernetes及其命令行工具最快的方法是启用Docker Desktop附带的Kubernetes功能。为此,启动Docker Desktop应用程序,然后在右上角点击“设置”图标。

这将带您进入Docker Desktop的设置页面,如下所示。

点击左侧的Kubernetes选项卡,您应该会看到Kubernetes设置页面。

点击“启用Kubernetes”复选框以在您的机器上启动一个Kubernetes集群。点击此复选框后,Docker Desktop需要几分钟才能准备好一个集群,因此您可以去喝杯咖啡。

如果您在任何时候希望删除已在Kubernetes集群中安装的所有部署,请点击“重置Kubernetes集群”按钮。这将删除所有资源并为您提供一个全新的集群。当您尝试使用预发布软件时,您会经常这样做。

kubectl

启用Kubernetes还会为您安装Kubernetes命令行工具(`kubectl`)。在终端窗口中键入以下命令以确保`kubectl`正常工作。

kubectl version --short

您应该会看到类似于以下所示的输出。

客户端版本:v1.25.9
Kustomize版本:v4.5.7
服务器版本:v1.25.9

安装Kubernetes并使`kubectl`命令行工具正常工作后,您可以安装Kubeflow Pipelines。

Kubeflow Pipelines

设置Kubeflow Pipelines包括四个简单的步骤。首先,我们需要指定要安装的KFP版本。我们将在下面设置环境变量,后续的`kubectl` apply命令将使用该变量。这些说明适用于Kubeflow Pipelines 2.0.0。您可以此处查看最新版本。

export PIPELINE_VERSION=2.0.0

KFP更喜欢将集群范围的资源与命名空间范围的资源分开安装。根据环境的不同,集群范围的资源可能需要管理员角色。命名空间范围的资源可以由管理命名空间的各个团队部署。以下命令安装集群范围的资源。

kubectl apply -k "github.com/kubeflow/pipelines/manifests/kustomize/cluster-scoped-resources?ref=$PIPELINE_VERSION"

您应该会看到指示创建各种资源的输出。此处为了简洁起见省略了输出,但您应该扫描它并确保没有发生错误。


下一个命令是一个等待命令,它将检查先前命令的状态。

kubectl wait --for condition=established --timeout=60s crd/applications.app.k8s.io

继续运行等待命令,直到您收到指示成功的消息,如下所示。

customresourcedefinition.apiextensions.k8s.io/applications.app.k8s.io 条件已满足

命名空间范围的资源的apply命令如下所示。它还会在创建集群中的资源时显示输出。确保没有错误。

kubectl apply -k "github.com/kubeflow/pipelines/manifests/kustomize/env/platform-agnostic?ref=$PIPELINE_VERSION"

通过运行以下命令检查我们两个`kubectl` apply命令创建的所有pod。

kubectl get pods --all-namespaces

命名空间     名称                                                 就绪   状态               重启次数         年龄

kube-system   coredns-565d847f94-df8xr                           1/1     Running            0                 24h
kube-system   coredns-565d847f94-zrvmm                           1/1     Running            0                 24h
kube-system   etcd-docker-desktop                                1/1     Running            1                 24h
kube-system   kube-apiserver-docker-desktop                      1/1     Running            1                 24h
kube-system   kube-controller-manager-docker-desktop             1/1     Running            1                 24h
kube-system   kube-proxy-c6bmz                                   1/1     Running            0                 24h
kube-system   kube-scheduler-docker-desktop                      1/1     Running            1                 24h
kube-system   storage-provisioner                                1/1     Running            0                 24h
kube-system   vpnkit-controller                                  1/1     Running            36 (12m ago)      24h
kubeflow      cache-deployer-deployment-8667bd7cc4-pq5nx         1/1     Running            0                 24h
kubeflow      cache-server-69558cdf5b-mjbd9                      1/1     Running            0                 24h
kubeflow      controller-manager-86bf69dc54-j6qzw                0/1     Running            1                 24h
kubeflow      metadata-envoy-deployment-596cbdf475-z224k         1/1     Running            0                 24h
kubeflow      metadata-grpc-deployment-784b8b5fb4-5bhcl          1/1     Running            1 (23h ago)       24h
kubeflow      metadata-writer-84474967b6-67c2k                   1/1     Running            0                 24h
kubeflow      minio-65dff76b66-n9l54                             1/1     Running            0                 24h
kubeflow      ml-pipeline-7d8868b6b5-jqt2s                       1/1     Running            0                 24h
kubeflow      ml-pipeline-persistenceagent-55f55fc7bc-5j2sd      1/1     Running            0                 24h
kubeflow      ml-pipeline-scheduledworkflow-7469b7c4b7-4ccdl     1/1     Running            0                 24h
kubeflow      ml-pipeline-ui-74cc4f9f89-zpb22                    1/1     Running            0                 24h
kubeflow      ml-pipeline-viewer-crd-57fc94f5fd-b94nn            1/1     Running            0                 24h
kubeflow      ml-pipeline-visualizationserver-7587fb49f8-tl6ht   1/1     Running            0                 24h
kubeflow      mysql-c999c6c8-vvb7j                               1/1     Running            0                 24h
kubeflow      proxy-agent-5c9b879c-7tg7z                         0/1     Running            3                 24h
kubeflow      workflow-controller-6c85bc4f95-f9czz               1/1     Running            0                 24h

如果您在安装 KFP 后立即检查 Pod,您会注意到许多 Pod 仍在启动。请等待所有 Pod 都运行后再继续下一部分。一旦您开始创建 Pipeline,在 Pipeline 运行期间运行此 `get pods` 命令。您将看到 KFP 如何根据 Pipeline 中的任务创建 Pod。

启动 KFP UI

要在本地机器上使用 KFP UI,我们必须将本地机器上的一个未使用的端口转发到 KFP 的 UI 服务的 80 端口。这可以通过使用 kubectl 的 port-forward 命令来完成。此命令不会返回。您需要保持它运行,直到您完成使用 KFP UI。

kubectl port-forward svc/ml-pipeline-ui -n kubeflow 8080:80

导航到 localhost:8080。您应该会看到 Kubeflow Pipelines 主页。

花一些时间探索所有选项卡。如果您是 Kubeflow 的新手,那么请熟悉 Pipelines、Runs 和 Experiments。这三个概念的详细描述超出了本文的范围,但以下是简短说明

  • Pipelines 是您在代码中创建的描述。Pipelines 类似于面向对象编程中的类。
  • Run 是 Pipeline 的一个实例,就像对象是类的实例一样。
  • Experiments 是一种标记相关 Runs 的方法,以便您可以在 KFP UI 中将它们分组在一起。例如,您可能有多个 Pipeline 运行,因为您正在解决其中的问题。使用相同的 Experiment 名称标记这些 Runs 将使它们在 Experiments 选项卡中分组在一起。

安装 MinIO

我喜欢使用 Docker Compose 来安装 MinIO,因为配置在 YAML 文件中,并且命令很简单。以下是 Docker Compose YAML。将此文件命名为 `docker-compose.yml`。

version: '3'
services:
minio:
  image: quay.io/minio/minio
  volumes:
    - ./data:/data
  ports:
    - 9000:9000
    - 9001:9001
  environment:
    MINIO_ROOT_USER: 'minio_user'
    MINIO_ROOT_PASSWORD: 'minio_password'
    MINIO_ADDRESS: ':9000'
    MINIO_STORAGE_USE_HTTPS: False
    MINIO_CONSOLE_ADDRESS: ':9001'
  command: minio server /data

在与 `docker-compose.yml` 文件相同的目录中运行以下命令。

docker-compose up -d

这将在 Kubernetes 集群外部的 Docker 容器中安装 MinIO。如果您不想使用 Docker Compose 安装 MinIO,那么这篇 文档 将向您展示如何使用 Docker 命令行安装 MinIO。

MinIO访问密钥和密钥

要使用 MinIO SDK,您将需要一个新的访问密钥和密钥。您可以在 MinIO UI 中获取这些密钥。在浏览器中,转到 localhost:9001。如果您在 docker-compose 文件中为 MinIO 控制台地址指定了不同的端口,请使用该端口。

登录后,导航到“访问密钥”选项卡,然后点击“创建访问密钥”按钮。

这将带您到“创建访问密钥”页面。

您的访问密钥和密钥只有在您点击“创建”按钮后才会保存。因此,在完成此操作之前,请不要离开此页面。不用担心从此屏幕复制密钥。点击“创建”按钮后,您将可以选择将密钥下载到您的文件系统(在 JSON 文件中)。

您现在可以开始使用 MinIO SDK 了。在接下来的两节中,我们将安装 KFP SDK 和 MinIO SDK。

安装 KFP Python 包

KFP Python 包是一个简单的 `pip` install。我建议在 Python 虚拟环境中安装它——尤其是在您测试 KFP 的预发布版本时。您可以在 PyPi 上查看 KFP 包 的最新版本,或者您可以安装如下所示的最新预发布版本。

pip install kfp

一旦 KFP 2.0 正式发布,请删除 `--pre` 开关。

通过列出 KFP 库来仔细检查安装。

pip list | grep kfp

您应该会看到以下三个库。

kfp                      2.0.1
kfp-pipeline-spec        0.2.2
kfp-server-api           2.0.0

安装 MinIO Python 包

如果您在虚拟环境中安装了 KFP Python 包,请在同一环境中安装 MinIO。

pip install minio

双重检查安装。

pip list | grep minio

这将确认 Minio 库已安装并显示您正在使用的版本。

minio                    7.1.15

总结

这篇文章提供了一个易于遵循的配方,用于创建带有 Kubeflow Pipelines 2.0 和 MinIO 的开发机器。目标是为您节省研究 Kubeflow 依赖项、安装命令和新版本 SDK 设置的时间和精力。 

我们尽一切努力确保此配方准确无误。如果您遇到问题,请通过发送邮件至 hello@min.io 或加入我们 Slack 频道 的讨论告知我们。

您已准备好开始使用 Kubeflow 和 MinIO 编写代码和构建管道。请查看 使用 MinIO 和 Kubeflow v2.0 构建 ML 数据管道,我们将在其中使用 Kubeflow 和 MinIO 构建数据管道。