在 機(jī)器學(xué)習(xí) 和 MLOps world , GPU 被廣泛用于加速模型訓(xùn)練和推理,但工作流的其他階段(如 ETL 管道或超參數(shù)優(yōu)化)如何?
在 RAPIDS 數(shù)據(jù)科學(xué)框架, ETL 工具的設(shè)計使使用 Python 的數(shù)據(jù)科學(xué)家具有熟悉的外觀。您當(dāng)前使用的是 Pandas , NumPy , Scikit Learn ,或 PyData Stack 在您的 KubeFlow 工作流中?如果是這樣,您可以使用 RAPIDS 通過利用集群中可能已經(jīng)存在的 GPU 來加速工作流的這些部分。
在本文中,將演示如何將 RAPIDS 放入 KubeFlow 環(huán)境。首先在交互式筆記本環(huán)境中使用 RAPIDS ,然后擴(kuò)展到單個容器之外,使用 Dask 跨多個節(jié)點(diǎn)使用多個 GPU 。
可選:使用 GPU 安裝 KubeFlow
本文假設(shè)您已經(jīng)對 Kubernetes 和 KubeFlow 有所了解。要探索如何在 KubeFlow 上使用 GPU 和 RAPIDS ,您需要一個具有 GPU 節(jié)點(diǎn)的 KubeFlow 集群。如果您已經(jīng)擁有集群或?qū)?KubeFlow 安裝說明不感興趣,請隨時跳過。
KubeFlow 是一種流行的機(jī)器學(xué)習(xí)和 MLOps 平臺 Kubernetes 用于設(shè)計和運(yùn)行機(jī)器學(xué)習(xí)管道、訓(xùn)練模型和提供推理服務(wù)。
KubeFlow 還提供了一個筆記本服務(wù),您可以使用它在 Kubernetes 集群中啟動一個交互式 Jupyter 服務(wù)器,以及一個管道服務(wù),該服務(wù)帶有一個用 Python 編寫的 DSL 庫,用于創(chuàng)建可重復(fù)的工作流。還可以訪問用于調(diào)整超參數(shù)和運(yùn)行模型推理服務(wù)器的工具。這基本上是構(gòu)建健壯的機(jī)器學(xué)習(xí)服務(wù)所需的所有工具。
對于此帖子,您使用 谷歌 Kubernetes 引擎 ( GKE )啟動具有 GPU 節(jié)點(diǎn)的 Kubernetes 集群并將 KubeFlow 安裝到該集群上,但任何具有 GPU 的 KubeFlow 集群都可以。
使用 GPU 創(chuàng)建 Kubernetes 集群
首先,使用gcloud CLI 創(chuàng)建 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
通過這個命令,您已經(jīng)啟動了一個名為rapids-gpu-kubeflow的 GKE 集群。您已經(jīng)指定它應(yīng)該使用a2-highgpu-2g類型的節(jié)點(diǎn),每個節(jié)點(diǎn)都有兩個 A100 GPU 。
KubeFlow 還需要一個穩(wěn)定版本的 Kubernetes ,因此您指定了它以及啟動集群的區(qū)域。
下一個 安裝 NVIDIA 驅(qū)動程序 到每個節(jié)點(diǎn)上。
$ 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
驗(yàn)證是否已成功安裝 NVIDIA 驅(qū)動程序。
$ 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
安裝驅(qū)動程序后,創(chuàng)建一個使用 GPU 計算的快速示例 pod ,以確保一切按預(yù)期運(yùn)行。
$ 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 集群已經(jīng)正確設(shè)置了 GPU 計算。接下來,清理那個吊艙。
$ kubectl delete po cuda-vectoradd pod "cuda-vectoradd" deleted
安裝 KubeFlow
現(xiàn)在您有了 Kubernetes ,安裝 KubeFlow 。 KubeFlow 使用 kustomize ,所以一定要安裝它。
$ curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
然后,通過克隆 KubeFlow ,查看最新版本并應(yīng)用它們。
$ 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
在創(chuàng)建了所有資源之后, KubeFlow 仍然需要在集群上引導(dǎo)自己。即使在這個命令完成之后,事情可能還沒有準(zhǔn)備好。這可能需要 15 分鐘以上。
最后,您將在kubeflow命名空間中看到 KubeFlow 服務(wù)的完整列表。
$ 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狀態(tài)后,將 KubeFlow web 用戶界面向前移植,并在瀏覽器中訪問它。
導(dǎo)航到127.0.0.1:8080,并使用默認(rèn)憑據(jù)user@example.com和12341234登錄。然后,您應(yīng)該看到 KubeFlow 儀表板(圖 1 )。

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

圖 2 NVIDIA smi命令是檢查 GPU 是否已設(shè)置的好方法
成功您的 A100 GPU 正在被傳遞到筆記本容器中。
您選擇的 RAPIDS 容器還附帶了一些示例筆記本,您可以在 /rapidsai/notebooks 。從主目錄快速創(chuàng)建到這些文件的符號鏈接,以便您可以使用左側(cè)的文件資源管理器進(jìn)行導(dǎo)航:
ln -s /rapids/notebooks /home/jovyan/notebooks.
導(dǎo)航到這些示例筆記本,探索 RAPIDS 提供的所有庫。例如,使用 pandas 的 ETL 開發(fā)人員應(yīng)查看 cuDF 筆記本以獲取加速數(shù)據(jù)幀的示例。
擴(kuò)展您的 RAPIDS 工作流
許多 RAPIDS 庫還支持將計算擴(kuò)展到多個 GPU 節(jié)點(diǎn)上,以增加加速。為此,請使用 Dask ,一個用于分布式計算的開源 Python 庫。
要使用 Dask ,請創(chuàng)建一個調(diào)度程序和一些工作程序來執(zhí)行計算。這些工作人員還需要 GPU 和與筆記本會話相同的 Python 環(huán)境。 Dask 有一個 Kubernetes 的操作符 您可以使用它來管理 KubeFlow 集群上的 Dask 集群,因此現(xiàn)在就安裝它。
安裝 Dask Kubernetes 運(yùn)算符
要安裝運(yùn)算符,您需要創(chuàng)建運(yùn)算符本身及其關(guān)聯(lián)的自定義資源。
在用于創(chuàng)建 KubeFlow 集群的終端窗口中,運(yùn)行以下命令:
$ 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 集群,驗(yàn)證資源是否已成功應(yīng)用。您不應(yīng)該期望看到任何命令,但命令應(yīng)該成功。
$ kubectl get daskclusters No resources found in default namespace.
您還可以檢查 operator pod 是否正在運(yùn)行并準(zhǔn)備啟動新的 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
最后,確保筆記本會話可以創(chuàng)建和管理 Dask 自定義資源。為此,編輯應(yīng)用于筆記本播客的kubeflow-kubernetes-edit群集角色。將新規(guī)則添加到此角色的規(guī)則部分,以允許kubernetes.dask.orgAPI 組中的所有內(nèi)容。
$ kubectl edit clusterrole kubeflow-kubernetes-edit … rules: … - apiGroups: - "kubernetes.dask.org" verbs: - "*" resources: - "*" …
創(chuàng)建 Dask 集群
現(xiàn)在,在 Kubernetes 中創(chuàng)建 DaskCluster 資源,以啟動集群工作所需的所有 pod 和服務(wù)。你可以這樣做 通過 Kubernetes API 實(shí)現(xiàn) YAML 如果您喜歡,但對于本文,請使用筆記本會話中的 Python API 。
回到 Jupyter 會話,創(chuàng)建一個新筆記本并安裝啟動集群所需的dask-kubernetes軟件包。
!pip install dask-kubernetes
接下來,使用 KubeCluster 類創(chuàng)建一個 Dask 集群。確認(rèn)您將容器映像設(shè)置為與您為筆記本環(huán)境選擇的映像相匹配,并將 GPU 的編號設(shè)置為 1 。您還可以告訴 RAPIDS 容器在默認(rèn)情況下不要啟動 Jupyter ,而是運(yùn)行 Dask 命令。
這可能需要類似的時間來啟動筆記本容器,因?yàn)樗€需要拉取 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 集群,其中有兩個工作進(jìn)程,每個工作進(jìn)程都有一個 A100 GPU ,與 Jupyter 會話相同。

您可以使用 Jupyter 中小部件中的縮放選項(xiàng)卡或通過調(diào)用cluster.scale(n)來上下縮放該集群,以設(shè)置工作人員的數(shù)量,從而設(shè)置 GPU 的數(shù)量。
現(xiàn)在,將 Dask 客戶端連接到集群。從那時起,任何支持 Dask 的 RAPIDS 庫,如dask_cudf,都會使用集群將計算分布到所有 GPU 。圖 4 顯示了創(chuàng)建Series對象并使用 Dask 分發(fā)該對象的一個簡短示例。

訪問 Dask 儀表板
在本節(jié)的開頭,您添加了一個額外的配置文件,其中包含 Dask 儀表板的一些選項(xiàng)。這些選項(xiàng)對于讓您能夠從 Jupyter 環(huán)境訪問 Kubernetes 集群上調(diào)度器 pod 中運(yùn)行的儀表板是必要的。
您可能已經(jīng)注意到集群和客戶端小部件都有到儀表板的鏈接。選擇這些鏈接以在新選項(xiàng)卡中打開儀表板(圖 5 )。
您也可以使用 Dask JupyterLab 擴(kuò)展 在 JupyterLab 中查看您的 Dask 集群的各種圖表和統(tǒng)計數(shù)據(jù)。
上達(dá)斯克選項(xiàng)卡,選擇搜索圖標(biāo)。這將通過筆記本中的客戶端將 JupyterLab 連接到儀表板。通過拖動選項(xiàng)卡,選擇各種繪圖并在 JupyterLab 中排列它們。

如果您跟隨這篇文章,請通過刪除開始時創(chuàng)建的 GKE 集群來清理所有創(chuàng)建的資源。
$ gcloud container clusters delete rapids-gpu-kubeflow --zone us-central1-c
結(jié)語
RAPIDS 與 KubeFlow 無縫集成,使您能夠在工作流的 ETL 階段以及培訓(xùn)和推理期間使用 GPU 資源。
關(guān)于作者
Jacob Tomlinson 是 NVIDIA 的高級 Python 軟件工程師,專注于分布式系統(tǒng)的部署工具。他的工作包括維護(hù)開源項(xiàng)目,包括 RAPIDS 和 Dask 。
審核編輯:郭婷
-
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8546瀏覽量
136523 -
python
+關(guān)注
關(guān)注
57文章
4867瀏覽量
89804
發(fā)布評論請先 登錄
美國ETL認(rèn)證簡介
基于數(shù)據(jù)質(zhì)量監(jiān)管的ETL設(shè)計
NVIDIA推出RAPIDS開源GPU加速平臺
Nvidia宣布推出了一套新的開源RAPIDS庫
NVIDIA RAPIDS加速器可將工作分配集群中各節(jié)點(diǎn)
具有RAPIDS cuML的GPU加速分層DBSCAN
如何使用RAPIDS和CuPy時加速Gauss 秩變換
NVIDIA RAPIDS加速器v21.08的功能應(yīng)用
利用Apache Spark和RAPIDS Apache加速Spark實(shí)踐
通過RAPIDS加速單細(xì)胞DNA和RNA基因組分析
Sapphire Rapids加速器::AMX、DLB、DSA、IAA和AMX
RAPIDS cuDF將pandas提速近150倍
使用RAPIDS加速KubeFlow上的ETL

評論