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)。

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

名为 rapids 的新 Kubeflow notebook 表单,选择了自定义 RAPIDS 容器镜像、2 个 CPU 内核、8GB RAM 和 1 个 NVIDIA GPU#
然后,您可以滚动到页面底部并点击 launch(启动)。您应该在列表中看到它正在启动。RAPIDS 容器镜像包含许多出色的工具,因此此步骤可能需要一些时间。

Notebook 准备就绪后,点击 Connect(连接)启动 Jupyter。#
您可以通过在 Jupyter 中打开一个终端并运行以下命令来验证一切是否正常工作
$ nvidia-smi

列表中显示有一个 A100 GPU,可在您的 Notebook 中使用。#
RAPIDS 容器还附带了一些示例 notebook,您可以在 /rapids/notebooks
中找到它们。您可以从您的主目录创建指向它们的符号链接,以便使用左侧的文件浏览器轻松导航 ln -s /rapids/notebooks /home/jovyan/notebooks
。
现在您可以浏览这些示例 notebook,并探索 RAPIDS 提供的所有库。例如,使用 Pandas 的 ETL 开发者应该查看 cuDF notebook,了解加速数据帧的示例。

扩展到多个 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"}}, )

这将创建一个包含两个 worker 的 Dask 集群,每个 worker 都有一个 A100 GPU,与您的 Jupyter 会话相同#
您可以使用 Jupyter 小部件中的 scaling 选项卡向上或向下扩展此集群,或者通过调用 cluster.scale(n)
设置工作器的数量(以及因此 GPU 的数量)。
现在您可以将 Dask 客户端连接到我们的集群,从那时起,任何支持 dask 的 RAPIDS 库(例如 dask_cudf
)都将使用我们的集群将计算分布到我们所有的 GPU 上。

这是一个创建 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
配置选项,以便 KubeCluster
和 Client
对象的 widget 和 .dashboard_link
属性显示使用 Jupyter server proxy 的 URL。
创建此配置选项后,您可以在启动新的 notebook 实例时选择它。

勾选“configure dask dashboard”(配置 dask dashboard)选项#
然后,您可以按照 notebook 中 widget 提供的链接在新标签页中打开 Dask Dashboard。

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