Kubeflow#

您可以在一个 pod 中使用 RAPIDS 和 Kubeflow Notebooks,也可以使用 dask-operator 扩展到 Kubernetes 集群中许多节点上的许多 pod。

注意

这些说明基于在 Kubernetes v1.21 上运行的 Kubeflow v1.5.1 进行测试。访问 安装 Kubeflow 以获取有关在您的 Kubernetes 集群上安装 Kubeflow 的说明。

Kubeflow Notebooks#

RAPIDS docker 镜像可以直接在 Kubeflow Notebooks 中使用,无需额外配置。要查找最新镜像,请访问 RAPIDS 安装页面(如下所示),并选择要使用的 RAPIDS 版本。通常我们希望选择最新版本的容器镜像。安装最新 RAPIDS 版本时,请确认已选择 Docker 镜像。

请确保容器镜像中的 CUDA 版本与您的 Kubernetes 节点上安装的版本匹配。例如,GKE Stable 上安装的默认 CUDA 版本是 11.4,因此我们希望选择该版本。从 11.5 开始,它们将向后兼容,因此版本匹配不再重要。从安装命令中复制容器镜像名称(即 nvcr.io/nvidia/rapidsai/base:25.04-cuda12.8-py3.12)。

注意

您可以通过创建一个 pod 并运行 nvidia-smi检查您的 CUDA 版本。例如

$ kubectl run nvidia-smi --restart=Never --rm -i --tty --image nvidia/cuda:11.0.3-base-ubuntu20.04 -- nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 495.46       Driver Version: 495.46       CUDA Version: 11.5     |
|-------------------------------+----------------------+----------------------+
...

现在在 Kubeflow 中,访问左侧的 Notebooks 选项卡,然后点击“New Notebook”(新建 Notebook)。

Screenshot of the Kubeflow Notebooks page with the “New Notebook” button highlighted

在此页面上,我们必须设置一些配置选项。首先,给它一个名称,例如 rapids。我们需要勾选“use custom image”(使用自定义镜像)框,并粘贴从 RAPIDS 版本选择器中获取的容器镜像。然后,我们将 CPU 和 RAM 设置得稍微高一些(即 2 个 CPU 和 8GB 内存),并将 NVIDIA GPU 的数量设置为 1。

Screenshot of the Kubeflow Notebooks page

名为 rapids 的新 Kubeflow notebook 表单,选择了自定义 RAPIDS 容器镜像、2 个 CPU 内核、8GB RAM 和 1 个 NVIDIA GPU#

然后,您可以滚动到页面底部并点击 launch(启动)。您应该在列表中看到它正在启动。RAPIDS 容器镜像包含许多出色的工具,因此此步骤可能需要一些时间。

Screenshot of the Kubeflow Notebooks page showing the rapids notebook starting up

Notebook 准备就绪后,点击 Connect(连接)启动 Jupyter。#

您可以通过在 Jupyter 中打开一个终端并运行以下命令来验证一切是否正常工作

$ nvidia-smi
Screenshot of a terminal open in Juputer Lab with the output of the nvidia-smi command listing one A100 GPU

列表中显示有一个 A100 GPU,可在您的 Notebook 中使用。#

RAPIDS 容器还附带了一些示例 notebook,您可以在 /rapids/notebooks 中找到它们。您可以从您的主目录创建指向它们的符号链接,以便使用左侧的文件浏览器轻松导航 ln -s /rapids/notebooks /home/jovyan/notebooks

现在您可以浏览这些示例 notebook,并探索 RAPIDS 提供的所有库。例如,使用 Pandas 的 ETL 开发者应该查看 cuDF notebook,了解加速数据帧的示例。

Screenshot of Jupyter Lab with the “10 minutes to cuDF and dask-cuDF” notebook open

扩展到多个 GPU#

许多 RAPIDS 库还允许您将计算扩展到分布在多个节点上的多个 GPU 上,以实现额外的加速。为此,我们利用了 Dask,一个用于分布式计算的开源 Python 库。

要使用 Dask,我们需要创建一个调度器和一些用于执行计算的工作器。这些工作器还需要 GPU 以及与您的 notebook 会话相同的 Python 环境。Dask 有一个用于 Kubernetes 的 operator,您可以使用它来管理 Kubeflow 集群上的 Dask 集群。

安装 Dask Kubernetes operator#

要安装 operator,我们需要创建任何自定义资源和 operator 本身,请参阅文档以查找最新的安装说明。在终端中运行以下命令。

$ helm install --repo https://helm.dask.org --create-namespace -n dask-operator --generate-name dask-kubernetes-operator
NAME: dask-kubernetes-operator-1666875935
NAMESPACE: dask-operator
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Operator has been installed successfully.

通过列出我们的 Dask 集群来验证我们的资源是否已成功应用。此时不应看到任何资源,但命令应成功执行。

$ kubectl get daskclusters
No resources found in default namespace.

您还可以检查 operator pod 是否正在运行并已准备好启动新的 Dask 集群。

$ kubectl get pods -A -l app.kubernetes.io/name=dask-kubernetes-operator
NAMESPACE       NAME                                        READY   STATUS    RESTARTS   AGE
dask-operator   dask-kubernetes-operator-775b8bbbd5-zdrf7   1/1     Running   0          74s

最后,确保您的 notebook 会话可以创建和管理 Dask 自定义资源。为此,您需要编辑应用于 notebook pod 的 kubeflow-kubernetes-edit 集群角色。为该角色的规则部分添加一条新规则,以允许 kubernetes.dask.org API 组中的所有操作。

$ kubectl edit clusterrole kubeflow-kubernetes-edit

rules:

- apiGroups:
  - "kubernetes.dask.org"
  verbs:
  - "*"
  resources:
  - "*"

创建 Dask 集群#

现在您可以在 Kubernetes 中创建 DaskCluster 资源,这将启动集群运行所需的所有 pod和服务。这可以通过 Kubernetes API 以 YAML 格式完成,也可以使用本节中所示的从 notebook 会话中使用的 Python API 来完成。

在 Jupyter 会话中,创建一个新的 notebook 并安装 dask-kubernetes 包,您将需要它来启动 Dask 集群。

!pip install dask-kubernetes

接下来,使用 KubeCluster 类创建一个 Dask 集群。将容器镜像设置为与您的 notebook 环境所使用的镜像一致,并将 GPU 数量设置为 1。同时告诉 RAPIDS 容器默认不启动 Jupyter,而是运行我们的 Dask 命令。

这可能需要与启动 notebook 容器相似的时间,因为它也必须拉取 RAPIDS docker 镜像。

from dask_kubernetes.experimental import KubeCluster

cluster = KubeCluster(
    name="rapids-dask",
    image="nvcr.io/nvidia/rapidsai/base:25.04-cuda12.8-py3.12",
    worker_command="dask-cuda-worker",
    n_workers=2,
    resources={"limits": {"nvidia.com/gpu": "1"}},
)
Screenshot of the Dask cluster widget in Jupyter Lab showing two workers with A100 GPUs

这将创建一个包含两个 worker 的 Dask 集群,每个 worker 都有一个 A100 GPU,与您的 Jupyter 会话相同#

您可以使用 Jupyter 小部件中的 scaling 选项卡向上或向下扩展此集群,或者通过调用 cluster.scale(n) 设置工作器的数量(以及因此 GPU 的数量)。

现在您可以将 Dask 客户端连接到我们的集群,从那时起,任何支持 dask 的 RAPIDS 库(例如 dask_cudf)都将使用我们的集群将计算分布到我们所有的 GPU 上。

Screenshot of some cudf code in Jupyter Lab that leverages Dask

这是一个创建 Series 对象并使用 Dask 分布的简单示例#

从 notebooks 访问 Dask dashboard#

在 notebook 中交互式工作并利用 Dask 集群时,查看 Dask dashboard 会非常有价值。dashboard 在 Dask 集群的调度器 Pod 上可用,因此我们需要设置一些额外配置,使其可以从我们的 notebook Pod 访问。

为此,我们可以应用以下清单。

# configure-dask-dashboard.yaml
apiVersion: "kubeflow.org/v1alpha1"
kind: PodDefault
metadata:
  name: configure-dask-dashboard
spec:
  selector:
    matchLabels:
      configure-dask-dashboard: "true"
  desc: "configure dask dashboard"
  env:
    - name: DASK_DISTRIBUTED__DASHBOARD__LINK
      value: "{NB_PREFIX}/proxy/{host}:{port}/status"
  volumeMounts:
    - name: jupyter-server-proxy-config
      mountPath: /root/.jupyter/jupyter_server_config.py
      subPath: jupyter_server_config.py
  volumes:
    - name: jupyter-server-proxy-config
      configMap:
        name: jupyter-server-proxy-config
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: jupyter-server-proxy-config
data:
  jupyter_server_config.py: |
    c.ServerProxy.host_allowlist = lambda app, host: True

创建一个包含上述内容的文件,然后使用 kubectl 将其应用到您的用户命名空间。

对于默认用户 user@example.com,它看起来像这样。

$ kubectl apply -n kubeflow-user-example-com -f configure-dask-dashboard.yaml

此配置文件执行两项操作。首先,它配置在您的 Notebook 容器中运行的 jupyter-server-proxy,以允许代理到所有主机。这样做是安全的,因为我们依赖 Kubernetes(特别是 Istio)来实施网络访问控制。它还设置 Dask 中的 distributed.dashboard-link 配置选项,以便 KubeClusterClient 对象的 widget 和 .dashboard_link 属性显示使用 Jupyter server proxy 的 URL。

创建此配置选项后,您可以在启动新的 notebook 实例时选择它。

Screenshot of the Kubeflow new notebook form with the “configure dask dashboard” configuration option selected

勾选“configure dask dashboard”(配置 dask dashboard)选项#

然后,您可以按照 notebook 中 widget 提供的链接在新标签页中打开 Dask Dashboard。

Screenshot of the Dask dashboard

您还可以使用 Dask Jupyter Lab 扩展程序直接在 Jupyter Lab 中查看有关 Dask 集群的各种图表和统计信息。打开左侧菜单上的 Dask 选项卡,然后点击小搜索图标,这将通过 notebook 中的客户端将 Jupyter lab 连接到 dashboard。然后您可以点击想要查看的各种图表,并通过拖动选项卡在 Jupyter Lab 中随意排列它们。

Screenshot of Jupyter Lab with the Dask Lab extension open on the left and various Dask plots arranged on the screen

相关示例#

使用 Kubernetes 和 XGBoost GPU 算法扩展超参数优化

library/xgboost library/optuna library/dask tools/dask-kubernetes library/scikit-learn workflow/hpo platforms/kubeflow platforms/kubernetes

使用 Kubernetes 和 XGBoost GPU 算法扩展超参数优化

在 Kubernetes 上使用多 GPU 工作负载扩展超参数优化

library/xgboost library/optuna library/dask library/dask-kubernetes library/scikit-learn workflow/hpo dataset/nyc-taxi data-storage/gcs data-format/csv platforms/kubeflow platforms/kubernetes

在 Kubernetes 上使用多 GPU 工作负载扩展超参数优化