在 機(jī)器學(xué)習(xí) 和 MLOps world , GPU 被廣泛用于加速模型訓(xùn)練和推理,但工作流的其他階段(如 ETL 管道或超參數(shù)優(yōu)化)如何?
在 RAPIDS 數(shù)據(jù)科學(xué)框架, ETL 工具的設(shè)計(jì)使使用 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ò)展到單個(gè)容器之外,使用 Dask 跨多個(gè)節(jié)點(diǎn)使用多個(gè) GPU 。
可選:使用 GPU 安裝 KubeFlow
本文假設(shè)您已經(jīng)對 Kubernetes 和 KubeFlow 有所了解。要探索如何在 KubeFlow 上使用 GPU 和 RAPIDS ,您需要一個(gè)具有 GPU 節(jié)點(diǎn)的 KubeFlow 集群。如果您已經(jīng)擁有集群或?qū)?KubeFlow 安裝說明不感興趣,請隨時(shí)跳過。
KubeFlow 是一種流行的機(jī)器學(xué)習(xí)和 MLOps 平臺(tái) Kubernetes 用于設(shè)計(jì)和運(yùn)行機(jī)器學(xué)習(xí)管道、訓(xùn)練模型和提供推理服務(wù)。
KubeFlow 還提供了一個(gè)筆記本服務(wù),您可以使用它在 Kubernetes 集群中啟動(dòng)一個(gè)交互式 Jupyter 服務(wù)器,以及一個(gè)管道服務(wù),該服務(wù)帶有一個(gè)用 Python 編寫的 DSL 庫,用于創(chuàng)建可重復(fù)的工作流。還可以訪問用于調(diào)整超參數(shù)和運(yùn)行模型推理服務(wù)器的工具。這基本上是構(gòu)建健壯的機(jī)器學(xué)習(xí)服務(wù)所需的所有工具。
對于此帖子,您使用 谷歌 Kubernetes 引擎 ( GKE )啟動(dòng)具有 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
通過這個(gè)命令,您已經(jīng)啟動(dòng)了一個(gè)名為rapids-gpu-kubeflow的 GKE 集群。您已經(jīng)指定它應(yīng)該使用a2-highgpu-2g類型的節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都有兩個(gè) A100 GPU 。
KubeFlow 還需要一個(gè)穩(wěn)定版本的 Kubernetes ,因此您指定了它以及啟動(dòng)集群的區(qū)域。
下一個(gè) 安裝 NVIDIA 驅(qū)動(dòng)程序 到每個(gè)節(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ū)動(dòng)程序。
$ 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ū)動(dòng)程序后,創(chuàng)建一個(gè)使用 GPU 計(jì)算的快速示例 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 計(jì)算。接下來,清理那個(gè)吊艙。
$ 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)自己。即使在這個(gè)命令完成之后,事情可能還沒有準(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 容器圖像 。
在啟動(dòng)集群之前,您必須創(chuàng)建一個(gè)配置配置文件,該配置文件對于以后開始使用 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)建一個(gè)文件,然后使用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)樗鼈儗⑾蚝蠹嫒荨陌惭b命令復(fù)制容器映像名稱:
rapidsai/rapidsai-core:22.06-cuda11.5-runtime-ubuntu20.04-py3.9
回到 KubeFlow ,選擇筆記本選項(xiàng)卡,然后選擇新筆記本。
在此頁面上,您必須設(shè)置幾個(gè)配置選項(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
向下滾動(dòng)到配置,查看配置 dask 儀表板選項(xiàng),滾動(dòng)到頁面底部,然后選擇發(fā)射。您應(yīng)該看到它在筆記本列表中啟動(dòng)。 RAPIDS 容器圖像中充滿了令人驚嘆的工具,因此這一步可能需要一些時(shí)間。
筆記本準(zhǔn)備就緒后,要啟動(dòng) 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 庫還支持將計(jì)算擴(kuò)展到多個(gè) GPU 節(jié)點(diǎn)上,以增加加速。為此,請使用 Dask ,一個(gè)用于分布式計(jì)算的開源 Python 庫。
要使用 Dask ,請創(chuàng)建一個(gè)調(diào)度程序和一些工作程序來執(zhí)行計(jì)算。這些工作人員還需要 GPU 和與筆記本會(huì)話相同的 Python 環(huán)境。 Dask 有一個(gè) Kubernetes 的操作符 您可以使用它來管理 KubeFlow 集群上的 Dask 集群,因此現(xiàn)在就安裝它。
安裝 Dask Kubernetes 運(yùn)算符
要安裝運(yùn)算符,您需要?jiǎng)?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)備啟動(dòng)新的 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
最后,確保筆記本會(huì)話可以創(chuàng)建和管理 Dask 自定義資源。為此,編輯應(yīng)用于筆記本播客的kubeflow-kubernetes-edit
群集角色。將新規(guī)則添加到此角色的規(guī)則部分,以允許kubernetes.dask.org
API 組中的所有內(nèi)容。
$ kubectl edit clusterrole kubeflow-kubernetes-edit … rules: … - apiGroups: - "kubernetes.dask.org" verbs: - "*" resources: - "*" …
創(chuàng)建 Dask 集群
現(xiàn)在,在 Kubernetes 中創(chuàng)建 DaskCluster 資源,以啟動(dòng)集群工作所需的所有 pod 和服務(wù)。你可以這樣做 通過 Kubernetes API 實(shí)現(xiàn) YAML 如果您喜歡,但對于本文,請使用筆記本會(huì)話中的 Python API 。
回到 Jupyter 會(huì)話,創(chuàng)建一個(gè)新筆記本并安裝啟動(dòng)集群所需的dask-kubernetes軟件包。
!pip install dask-kubernetes
接下來,使用 KubeCluster 類創(chuàng)建一個(gè) Dask 集群。確認(rèn)您將容器映像設(shè)置為與您為筆記本環(huán)境選擇的映像相匹配,并將 GPU 的編號設(shè)置為 1 。您還可以告訴 RAPIDS 容器在默認(rèn)情況下不要啟動(dòng) Jupyter ,而是運(yùn)行 Dask 命令。
這可能需要類似的時(shí)間來啟動(dòng)筆記本容器,因?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 顯示了一個(gè) Dask 集群,其中有兩個(gè)工作進(jìn)程,每個(gè)工作進(jìn)程都有一個(gè) A100 GPU ,與 Jupyter 會(huì)話相同。
您可以使用 Jupyter 中小部件中的縮放選項(xiàng)卡或通過調(diào)用cluster.scale(n)
來上下縮放該集群,以設(shè)置工作人員的數(shù)量,從而設(shè)置 GPU 的數(shù)量。
現(xiàn)在,將 Dask 客戶端連接到集群。從那時(shí)起,任何支持 Dask 的 RAPIDS 庫,如dask_cudf
,都會(huì)使用集群將計(jì)算分布到所有 GPU 。圖 4 顯示了創(chuàng)建Series
對象并使用 Dask 分發(fā)該對象的一個(gè)簡短示例。
訪問 Dask 儀表板
在本節(jié)的開頭,您添加了一個(gè)額外的配置文件,其中包含 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)計(jì)數(shù)據(jù)。
上達(dá)斯克選項(xiàng)卡,選擇搜索圖標(biāo)。這將通過筆記本中的客戶端將 JupyterLab 連接到儀表板。通過拖動(dòng)選項(xiàng)卡,選擇各種繪圖并在 JupyterLab 中排列它們。
如果您跟隨這篇文章,請通過刪除開始時(shí)創(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文章
8501瀏覽量
134538 -
python
+關(guān)注
關(guān)注
56文章
4827瀏覽量
86656
發(fā)布評論請先 登錄
美國ETL認(rèn)證簡介
基于數(shù)據(jù)質(zhì)量監(jiān)管的ETL設(shè)計(jì)
NVIDIA推出RAPIDS開源GPU加速平臺(tái)
Nvidia宣布推出了一套新的開源RAPIDS庫
NVIDIA RAPIDS加速器可將工作分配集群中各節(jié)點(diǎn)
具有RAPIDS cuML的GPU加速分層DBSCAN

如何使用RAPIDS和CuPy時(shí)加速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生成用于加速短期價(jià)格預(yù)測的限價(jià)訂單簿數(shù)據(jù)集

RAPIDS cuDF將pandas提速近150倍

評論