在 機器學習 和 MLOps world , GPU 被廣泛用于加速模型訓練和推理,但工作流的其他階段(如 ETL 管道或超參數優化)如何?
在 RAPIDS 數據科學框架, ETL 工具的設計使使用 Python 的數據科學家具有熟悉的外觀。您當前使用的是 Pandas , NumPy?, Scikit Learn ,或 PyData Stack 在您的 KubeFlow 工作流中?如果是這樣,您可以使用 RAPIDS 通過利用集群中可能已經存在的 GPU 來加速工作流的這些部分。

在本文中,我將演示如何將 RAPIDS 放入 KubeFlow 環境。首先在交互式筆記本環境中使用 RAPIDS ,然后擴展到單個容器之外,使用 Dask 跨多個節點使用多個 GPU 。
可選:使用 GPU 安裝 KubeFlow
本文假設您已經對 Kubernetes 和 KubeFlow 有所了解。要探索如何在 KubeFlow 上使用 GPU 和 RAPIDS ,您需要一個具有 GPU 節點的 KubeFlow 集群。如果您已經擁有集群或對 KubeFlow 安裝說明不感興趣,請隨時跳過。
KubeFlow 是一種流行的機器學習和 MLOps 平臺 Kubernetes 用于設計和運行機器學習管道、訓練模型和提供推理服務。
KubeFlow 還提供了一個筆記本服務,您可以使用它在 Kubernetes 集群中啟動一個交互式 Jupyter 服務器,以及一個管道服務,該服務帶有一個用 Python 編寫的 DSL 庫,用于創建可重復的工作流。還可以訪問用于調整超參數和運行模型推理服務器的工具。這基本上是構建健壯的機器學習服務所需的所有工具。
對于此帖子,您使用 谷歌 Kubernetes 引擎 ( GKE )啟動具有 GPU 節點的 Kubernetes 集群并將 KubeFlow 安裝到該集群上,但任何具有 GPU 的 KubeFlow 集群都可以。
使用 GPU 創建 Kubernetes 集群
首先,使用gcloud
CLI 創建 Kubernetes 集群。
$ gcloud container clusters create rapids-gpu-kubeflow \ --accelerator type=nvidia-tesla-a100,count=2 --machine-type a2-highgpu-2g \ --zone us-central1-c --release-channel stable Note: Machines with GPUs have certain limitations which may affect your workflow. Learn more at https://cloud.google.com/kubernetes-engine/docs/how-to/gpus Creating cluster rapids-gpu-kubeflow in us-central1-c... Cluster is being health-checked (master is healthy)... Created kubeconfig entry generated for rapids-gpu-kubeflow. NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS rapids-gpu-kubeflow us-central1-c 1.21.12-gke.1500 34.132.107.217 a2-highgpu-2g 1.21.12-gke.1500 3 RUNNING
通過這個命令,您已經啟動了一個名為rapids-gpu-kubeflow
的 GKE 集群。您已經指定它應該使用a2-highgpu-2g
類型的節點,每個節點都有兩個 A100 GPU 。
KubeFlow 還需要一個穩定版本的 Kubernetes ,因此您指定了它以及啟動集群的區域。
下一個 安裝 NVIDIA 驅動程序 到每個節點上。
$ kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded-latest.yaml daemonset.apps/nvidia-driver-installer created
驗證是否已成功安裝 NVIDIA 驅動程序。
$ kubectl get po -A --watch | grep nvidiakube-system nvidia-driver-installer-6zwcn 1/1 Running 0 8m47s kube-system nvidia-driver-installer-8zmmn 1/1 Running 0 8m47s kube-system nvidia-driver-installer-mjkb8 1/1 Running 0 8m47s kube-system nvidia-gpu-device-plugin-5ffkm 1/1 Running 0 13m kube-system nvidia-gpu-device-plugin-d599s 1/1 Running 0 13m kube-system nvidia-gpu-device-plugin-jrgjh 1/1 Running 0 13m
安裝驅動程序后,創建一個使用 GPU 計算的快速示例 pod ,以確保一切按預期運行。
$ cat << EOF | kubectl create -f - apiVersion: v1 kind: Pod metadata: name: cuda-vectoradd spec: restartPolicy: OnFailure containers: - name: cuda-vectoradd image: "nvidia/samples:vectoradd-cuda11.2.1" resources: limits: nvidia.com/gpu: 1 EOF pod/cuda-vectoradd created $ kubectl logs pod/cuda-vectoradd [Vector addition of 50000 elements] Copy input data from the host memory to the CUDA device CUDA kernel launch with 196 blocks of 256 threads Copy output data from the CUDA device to the host memory Test PASSED Done
如果您在輸出中看到Test PASSED
,您可以確信您的 Kubernetes 集群已經正確設置了 GPU 計算。接下來,清理那個吊艙。
$ kubectl delete po cuda-vectoradd pod "cuda-vectoradd" deleted
安裝 KubeFlow
現在您有了 Kubernetes ,安裝 KubeFlow 。 KubeFlow 使用 kustomize?,所以一定要安裝它。
$ curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
然后,通過克隆 KubeFlow?,查看最新版本并應用它們。
$ git clone https://github.com/kubeflow/manifests $ cd manifests $ git checkout v1.5.1 # Or whatever the latest release is $ while ! kustomize build example | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 10; done
在創建了所有資源之后, KubeFlow 仍然需要在集群上引導自己。即使在這個命令完成之后,事情可能還沒有準備好。這可能需要 15 分鐘以上。
最后,您將在kubeflow
命名空間中看到 KubeFlow 服務的完整列表。
$ kubectl get po -n kubeflow NAME READY STATUS RESTARTS AGE admission-webhook-deployment-667bd68d94-4n62z 1/1 Running 0 10m cache-deployer-deployment-79fdf9c5c9-7cpn7 1/1 Running 2 10m cache-server-6566dc7dbf-7ndm5 1/1 Running 0 10m centraldashboard-8fc7d8cc-q62cd 1/1 Running 0 10m jupyter-web-app-deployment-84c459d4cd-krxq4 1/1 Running 0 10m katib-controller-68c47fbf8b-bjvst 1/1 Running 0 10m katib-db-manager-6c948b6b76-xtrwz 1/1 Running 2 10m katib-mysql-7894994f88-6ndtp 1/1 Running 0 10m katib-ui-64bb96d5bf-v598l 1/1 Running 0 10m kfserving-controller-manager-0 2/2 Running 0 9m54s kfserving-models-web-app-5d6cd6b5dd-hp2ch 1/1 Running 0 10m kubeflow-pipelines-profile-controller-69596b78cc-zrvhc 1/1 Running 0 10m metacontroller-0 1/1 Running 0 9m53s metadata-envoy-deployment-5b4856dd5-r7xnn 1/1 Running 0 10mmetadata-grpc-deployment-6b5685488-9rd9q 1/1 Running 6 10m metadata-writer-548bd879bb-7fr7x 1/1 Running 1 10m minio-5b65df66c9-dq2rr 1/1 Running 0 10m ml-pipeline-847f9d7f78-pl7z5 1/1 Running 0 10m ml-pipeline-persistenceagent-d6bdc77bd-wd4p8 1/1 Running 2 10m ml-pipeline-scheduledworkflow-5db54d75c5-6c5vv 1/1 Running 0 10m ml-pipeline-ui-5bd8d6dc84-sg9t8 1/1 Running 0 9m59s ml-pipeline-viewer-crd-68fb5f4d58-wjhvv 1/1 Running 0 9m59s ml-pipeline-visualizationserver-8476b5c645-96ptw 1/1 Running 0 9m59s mpi-operator-5c55d6cb8f-vwr8p 1/1 Running 0 9m58s mysql-f7b9b7dd4-pv767 1/1 Running 0 9m58s notebook-controller-deployment-6b75d45f48-rpl5b 1/1 Running 0 9m57s profiles-deployment-58d7c94845-gbm8m 2/2 Running 0 9m57s tensorboard-controller-controller-manager-775777c4c5-b6c2k 2/2 Running 2 9m56s tensorboards-web-app-deployment-6ff79b7f44-g5cr8 1/1 Running 0 9m56s training-operator-7d98f9dd88-hq6v4 1/1 Running 0 9m55s volumes-web-app-deployment-8589d664cc-krfxs 1/1 Running 0 9m55s workflow-controller-5cbbb49bd8-b7qmd 1/1 Running 1 9m55s
在所有 Pod 都處于Running
狀態后,將 KubeFlow web 用戶界面向前移植,并在瀏覽器中訪問它。
導航到127.0.0.1:8080
,并使用默認憑據user@example.com
和12341234
登錄。然后,您應該看到 KubeFlow 儀表板(圖 1 )。

在 KubeFlow 筆記本電腦中使用 RAPIDS
要在 KubeFlow 集群上開始 RAPIDS ,請使用 官方 RAPIDS 容器圖像 .
在啟動集群之前,您必須創建一個配置配置文件,該配置文件對于以后開始使用 Dask 非常重要。為此,請應用以下清單:
# configure-dask-dashboard.yaml apiVersion: "kubeflow.org/v1alpha1" kind: PodDefault metadata: name: configure-dask-dashboardspec: 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
現在 選擇 RAPIDS 版本 使用。通常,您希望為最新版本選擇容器映像。 GKE Stable 上安裝的默認 CUDA 版本是 11.4 ,因此選擇該版本。從版本 11.5 和更高版本開始,這并不重要,因為它們將向后兼容。從安裝命令復制容器映像名稱:
rapidsai/rapidsai-core:22.06-cuda11.5-runtime-ubuntu20.04-py3.9
回到 KubeFlow ,選擇筆記本選項卡,然后選擇新筆記本.
在此頁面上,您必須設置幾個配置選項:
- 姓名:急流
- 命名空間:kubeflow 用戶示例 com
- 自定義圖像:選中此復選框。
- 自定義圖像:
rapidsai/rapidsai-core:22.06-cuda11.4-runtime-ubuntu20.04-py3.9
- 請求 CPU :2
- Gi 中請求的內存:8
- GPU 的編號:1
- GPU 供應商: NVIDIA
向下滾動到配置,查看配置 dask 儀表板選項,滾動到頁面底部,然后選擇發射。您應該看到它在筆記本列表中啟動。 RAPIDS 容器圖像中充滿了令人驚嘆的工具,因此這一步可能需要一些時間。
筆記本準備就緒后,要啟動 Jupyter ,請選擇連接通過打開終端窗口并運行nvidia-smi
(圖 2 ),驗證一切正常。

成功您的 A100 GPU 正在被傳遞到筆記本容器中。
您選擇的 RAPIDS 容器還附帶了一些示例筆記本,您可以在 /rapidsai/notebooks?.從主目錄快速創建到這些文件的符號鏈接,以便您可以使用左側的文件資源管理器進行導航:
ln -s /rapids/notebooks /home/jovyan/notebooks.
導航到這些示例筆記本,探索 RAPIDS 提供的所有庫。例如,使用 pandas 的 ETL 開發人員應查看 cuDF 筆記本以獲取加速數據幀的示例。
擴展您的 RAPIDS 工作流
許多 RAPIDS 庫還支持將計算擴展到多個 GPU 節點上,以增加加速。為此,請使用 Dask ,一個用于分布式計算的開源 Python 庫。
要使用 Dask ,請創建一個調度程序和一些工作程序來執行計算。這些工作人員還需要 GPU 和與筆記本會話相同的 Python 環境。 Dask 有一個 Kubernetes 的操作符 您可以使用它來管理 KubeFlow 集群上的 Dask 集群,因此現在就安裝它。
安裝 Dask Kubernetes 運算符
要安裝運算符,您需要創建運算符本身及其關聯的自定義資源。有關詳細信息,請參閱 安裝 在 Dask 文檔中。
在用于創建 KubeFlow 集群的終端窗口中,運行以下命令:
$ kubectl apply -f https://raw.githubusercontent.com/dask/dask-kubernetes/main/dask_kubernetes/operator/deployment/manifests/daskcluster.yaml $ kubectl apply -f https://raw.githubusercontent.com/dask/dask-kubernetes/main/dask_kubernetes/operator/deployment/manifests/daskworkergroup.yaml $ kubectl apply -f https://raw.githubusercontent.com/dask/dask-kubernetes/main/dask_kubernetes/operator/deployment/manifests/daskjob.yaml $ kubectl apply -f https://raw.githubusercontent.com/dask/dask-kubernetes/main/dask_kubernetes/operator/deployment/manifests/operator.yaml
通過列出 Dask 集群,驗證資源是否已成功應用。您不應該期望看到任何命令,但命令應該成功。
$ kubectl get daskclusters No resources found in default namespace.
您還可以檢查 operator pod 是否正在運行并準備啟動新的 Dask 集群。
$ kubectl get pods -A -l application=dask-kubernetes-operator NAMESPACE NAME READY STATUS RESTARTS AGE dask-operator dask-kubernetes-operator-775b8bbbd5-zdrf7 1/1 Running 0 74s
最后,確保筆記本會話可以創建和管理 Dask 自定義資源。為此,編輯應用于筆記本播客的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 如果您喜歡,但對于本文,請使用筆記本會話中的 Python API 。
回到 Jupyter 會話,創建一個新筆記本并安裝啟動集群所需的dask-kubernetes
軟件包。
!pip install dask-kubernetes
接下來,使用 KubeCluster 類創建一個 Dask 集群。確認您將容器映像設置為與您為筆記本環境選擇的映像相匹配,并將 GPU 的編號設置為 1 。您還可以告訴 RAPIDS 容器在默認情況下不要啟動 Jupyter ,而是運行 Dask 命令。
這可能需要類似的時間來啟動筆記本容器,因為它還需要拉取 RAPIDS Docker 映像。
from dask_kubernetes.experimental import KubeCluster cluster = KubeCluster(name="rapids-dask", image="rapidsai/rapidsai-core:22.06-cuda11.4-runtime-ubuntu20.04-py3.9", worker_command="dask-cuda-worker", n_workers=2, resources={"limits": {"nvidia.com/gpu": "1"}}, env={"DISABLE_JUPYTER": "true"})
圖 3 顯示了一個 Dask 集群,其中有兩個工作進程,每個工作進程都有一個 A100 GPU ,與 Jupyter 會話相同。
您可以使用 Jupyter 中小部件中的縮放選項卡或通過調用cluster.scale(n)
來上下縮放該集群,以設置工作人員的數量,從而設置 GPU 的數量。
現在,將 Dask 客戶端連接到集群。從那時起,任何支持 Dask 的 RAPIDS 庫,如dask_cudf
,都會使用集群將計算分布到所有 GPU 。圖 4 顯示了創建Series
對象并使用 Dask 分發該對象的一個簡短示例。
訪問 Dask 儀表板
在本節的開頭,您添加了一個額外的配置文件,其中包含 Dask 儀表板的一些選項。這些選項對于讓您能夠從 Jupyter 環境訪問 Kubernetes 集群上調度器 pod 中運行的儀表板是必要的。
您可能已經注意到集群和客戶端小部件都有到儀表板的鏈接。選擇這些鏈接以在新選項卡中打開儀表板(圖 5 )。
您也可以使用 Dask JupyterLab 擴展 在 JupyterLab 中查看您的 Dask 集群的各種圖表和統計數據。
上達斯克選項卡,選擇搜索圖標。這將通過筆記本中的客戶端將 JupyterLab 連接到儀表板。通過拖動選項卡,選擇各種繪圖并在 JupyterLab 中排列它們。

如果您跟隨這篇文章,請通過刪除開始時創建的 GKE 集群來清理所有創建的資源。
$ gcloud container clusters delete rapids-gpu-kubeflow --zone us-central1-c
結語
RAPIDS 與 KubeFlow 無縫集成,使您能夠在工作流的 ETL 階段以及培訓和推理期間使用 GPU 資源。
您可以直接將 RAPIDS 環境放到 KubeFlow 筆記本服務中進行單節點工作,也可以從 KubeflowPipelines 中使用 Kubernetes 的 Dask 運算符將該工作負載擴展到多個節點和 GPU 。
有關使用 RAPIDS 的更多信息,請參閱以下參考資料:
- RAPIDS (中等)
- /rapidsai/notebooks github?
- RAPIDS 文檔
?
?