Kubernetes#

根据您的用例,RAPIDS 可以通过多种方式与 Kubernetes 集成。

交互式 Notebook#

对于单用户交互式会话,您可以运行包含带有 RAPIDS 库和 Jupyter 的 conda 环境的 RAPIDS docker 镜像,用于交互式使用。

您可以将其作为 Pod 直接在 Kubernetes 上运行,并通过 Service 暴露 Jupyter。例如

# rapids-notebook.yaml
apiVersion: v1
kind: Service
metadata:
  name: rapids-notebook
  labels:
    app: rapids-notebook
spec:
  type: NodePort
  ports:
    - port: 8888
      name: http
      targetPort: 8888
      nodePort: 30002
  selector:
    app: rapids-notebook
---
apiVersion: v1
kind: Pod
metadata:
  name: rapids-notebook
  labels:
    app: rapids-notebook
spec:
  securityContext:
    fsGroup: 0
  containers:
    - name: rapids-notebook
      image: "nvcr.io/nvidia/rapidsai/notebooks:25.04-cuda12.8-py3.12"
      resources:
        limits:
          nvidia.com/gpu: 1
      ports:
        - containerPort: 8888
          name: notebook
可选:扩展 notebook 配置以支持启动多节点 Dask 集群

部署交互式单用户 notebook 可以为启动更多资源提供一个绝佳场所。例如,您可以安装 dask-kubernetes 并使用 dask-operator 从您的 notebook 创建多节点 Dask 集群。

要做到这一点,您需要在启动您的 notebook Pod 时创建一些额外的资源。

服务账户和角色

为了能够从您的 notebook 内部与 Kubernetes API 交互并创建 Dask 资源,您需要创建一个带有附加角色的服务账户。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: rapids-dask
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: rapids-dask
rules:
  - apiGroups: [""]
    resources: ["pods", "services"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["pods/log"]
    verbs: ["get", "list"]
  - apiGroups: [kubernetes.dask.org]
    resources: ["*"]
    verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: rapids-dask
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: rapids-dask
subjects:
  - kind: ServiceAccount
    name: rapids-dask

然后,您需要通过引用此服务账户来增强上面的 Pod 规范。

apiVersion: v1
kind: Pod
metadata:
  name: rapids-notebook
  labels:
    app: rapids-notebook
spec:
  serviceAccountName: rapids-dask
  ...

代理 Dask Dashboard 和其他服务

RAPIDS 容器预装了 jupyter-server-proxy 插件,您可以使用它通过 Jupyter URL 访问在您的 notebook 中运行的其他服务。然而,默认情况下,这仅限于代理在您的 Jupyter Pod 中运行的服务。为了访问 Kubernetes 集群中已启动的其他资源(如 Dask 集群),我们需要配置 Jupyter 以允许这样做。

首先,我们创建一个包含配置文件的 ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: jupyter-server-proxy-config
data:
  jupyter_server_config.py: |
    c.ServerProxy.host_allowlist = lambda app, host: True

然后,我们进一步修改我们的 Pod 规范,将此 config map 挂载到正确的位置。

apiVersion: v1
kind: Pod
...
spec:
  containers
    - name: rapids-notebook
      ...
      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

我们可能还需要配置 Dask,让它知道通过代理 URL 到哪里查找 Dashboard。我们可以在我们的 Pod 中通过环境变量设置此项。

apiVersion: v1
kind: Pod
...
spec:
  containers
    - name: rapids-notebook
      ...
      env:
        - name: DASK_DISTRIBUTED__DASHBOARD__LINK
          value: "/proxy/{host}:{port}/status"

整合所有配置

这里有一个扩展的 rapids-notebook.yaml 规范,将所有这些整合在一起。

# rapids-notebook.yaml (extended)
apiVersion: v1
kind: ServiceAccount
metadata:
  name: rapids-dask
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: rapids-dask
rules:
  - apiGroups: [""]
    resources: ["pods", "services"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["pods/log"]
    verbs: ["get", "list"]
  - apiGroups: [kubernetes.dask.org]
    resources: ["*"]
    verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: rapids-dask
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: rapids-dask
subjects:
  - kind: ServiceAccount
    name: rapids-dask
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: jupyter-server-proxy-config
data:
  jupyter_server_config.py: |
    c.ServerProxy.host_allowlist = lambda app, host: True
---
apiVersion: v1
kind: Service
metadata:
  name: rapids-notebook
  labels:
    app: rapids-notebook
spec:
  type: ClusterIP
  ports:
    - port: 8888
      name: http
      targetPort: notebook
  selector:
    app: rapids-notebook
---
apiVersion: v1
kind: Pod
metadata:
  name: rapids-notebook
  labels:
    app: rapids-notebook
spec:
  serviceAccountName: rapids-dask
  securityContext:
    fsGroup: 0
  containers:
    - name: rapids-notebook
      image: nvcr.io/nvidia/rapidsai/notebooks:25.04-cuda12.8-py3.12
      resources:
        limits:
          nvidia.com/gpu: 1
      ports:
        - containerPort: 8888
          name: notebook
      env:
        - name: DASK_DISTRIBUTED__DASHBOARD__LINK
          value: "/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
$ kubectl apply -f rapids-notebook.yaml

通过 NodePort 服务,这使得 Jupyter 可以在您的 Kubernetes 节点的 30002 端口上访问。或者,如果您配置了 LoadBalancer 服务类型,或者使用 ClusterIP 并使用 kubectl 在本地进行端口转发,也可以通过这种方式访问它。

$ kubectl port-forward service/rapids-notebook 8888

然后您可以在浏览器中打开 8888 端口以访问 Jupyter 并使用 RAPIDS。

Screenshot of the RAPIDS container running Jupyter showing the nvidia-smi command with a GPU listed

Dask Operator#

Dask 提供了一个 Operator,使用户能够将 Dask 集群作为原生 Kubernetes 资源创建。这对于动态、灵活地创建、伸缩和删除 Dask 集群非常有用。通常,这与交互式会话结合使用,例如上面的 交互式 notebook 示例,或来自其他服务(如 KubeFlow Notebooks)。通过在 Kubernetes 上动态启动配置为使用 RAPIDS 的 Dask 集群,用户可以将其 notebook 会话扩展到分布在多个节点上的许多 GPU。

Dask Operator 页面上了解更多信息。

Helm Chart#

个人用户也可以安装 Dask Helm Chart,它提供了一个运行 Jupyter 的 Pod 以及一个由运行 Dask 调度器和工作组件的 Pod 组成的 Dask 集群。您可以定制此 Helm Chart 以将 RAPIDS 容器镜像作为 notebook 服务器和 Dask 集群组件运行,以便所有部分都能受益于 GPU 加速。

Dask Helm Chart 页面上了解更多信息。

Dask Gateway#

一些组织可能希望将 Dask 集群配置作为一个中心服务提供,让用户不必关注底层的平台(如 Kubernetes)。这对于降低用户权限、限制用户可消耗的资源以及以集中方式暴露服务非常有用。为此,您可以部署 Dask Gateway,它提供了一个用户可以通过编程方式与之交互的服务器,然后该服务器在 Kubernetes 上启动 Dask 集群并将连接代理回给用户。

用户可以配置他们希望 Dask 集群的样子,因此可以利用 GPU 和 RAPIDS 来构建加速集群。

KubeFlow#

如果您正在使用 KubeFlow,您可以通过在 notebook 和 pipeline 中使用 RAPIDS 容器镜像,以及使用 Dask Operator 启动 GPU 加速的 Dask 集群,从而立即集成 RAPIDS。

KubeFlow 页面上了解更多信息。

相关示例#

Kubernetes 多租户自动伸缩深度探讨

cloud/gcp/gke tools/dask-operator library/cuspatial library/dask library/cudf data-format/parquet data-storage/gcs platforms/kubernetes

Kubernetes 多租户自动伸缩深度探讨

使用 NVIDIA GPU 在 Google Kubernetes Engine 上执行时间序列预测

cloud/gcp/gke tools/dask-operator workflow/hpo workflow/xgboost library/dask library/dask-cuda library/xgboost library/optuna data-storage/gcs platforms/kubernetes

使用 NVIDIA GPU 在 Google Kubernetes Engine 上执行时间序列预测

使用 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 工作负载扩展超参数优化