• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 3 月 19 日下午 2 點,鎖定 NVIDIA AI 網絡中文專場。立即注冊觀看
    數據科學

    使用 RAPIDS 加速 KubeFlow 上的 ETL

    機器學習 和 MLOps world , GPU 被廣泛用于加速模型訓練和推理,但工作流的其他階段(如 ETL 管道或超參數優化)如何?

    RAPIDS 數據科學框架, ETL 工具的設計使使用 Python 的數據科學家具有熟悉的外觀。您當前使用的是 Pandas , NumPy?, Scikit Learn ,或 PyData Stack 在您的 KubeFlow 工作流中?如果是這樣,您可以使用 RAPIDS 通過利用集群中可能已經存在的 GPU 來加速工作流的這些部分。

    Banner ad for downloading a getting started kit for RAPIDS.

    在本文中,我將演示如何將 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.com12341234登錄。然后,您應該看到 KubeFlow 儀表板(圖 1 )。

    Screenshot of the KubeFlow dashboard
    圖 1.KubeFlow 儀表板

    在 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 ),驗證一切正常。

    Screenshot of a terminal window open in Jupyter Lab with the output of the nvidia-smi command listing one A100 GPU.
    圖 2 NVIDIA smi命令是檢查 GPU 是否已設置的好方法

    成功您的 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 會話相同。

    Screenshot of the Dask cluster widget in JupyterLab showing two workers with A100 GPUs.
    圖 3.Dask 有許多有用的小部件,您可以在筆記本中查看這些小部件以顯示集群的狀態

    您可以使用 Jupyter 中小部件中的縮放選項卡或通過調用cluster.scale(n)來上下縮放該集群,以設置工作人員的數量,從而設置 GPU 的數量。

    現在,將 Dask 客戶端連接到集群。從那時起,任何支持 Dask 的 RAPIDS 庫,如dask_cudf,都會使用集群將計算分布到所有 GPU 。圖 4 顯示了創建Series對象并使用 Dask 分發該對象的一個簡短示例。

    Screenshot of cuDF code in JupyterLab that uses Dask.
    圖 4.創建一個 cuDF 數據幀,用 Dask 將其分發,然后執行計算并獲得結果

    訪問 Dask 儀表板

    在本節的開頭,您添加了一個額外的配置文件,其中包含 Dask 儀表板的一些選項。這些選項對于讓您能夠從 Jupyter 環境訪問 Kubernetes 集群上調度器 pod 中運行的儀表板是必要的。

    您可能已經注意到集群和客戶端小部件都有到儀表板的鏈接。選擇這些鏈接以在新選項卡中打開儀表板(圖 5 )。

    Screenshot of the Dask dashboard showing the from_cudf call has run on two GPUs.
    圖 5.帶有from_ cuDF 呼叫

    您也可以使用 Dask JupyterLab 擴展 在 JupyterLab 中查看您的 Dask 集群的各種圖表和統計數據。

    達斯克選項卡,選擇搜索圖標。這將通過筆記本中的客戶端將 JupyterLab 連接到儀表板。通過拖動選項卡,選擇各種繪圖并在 JupyterLab 中排列它們。

    Screenshot of JupyterLab with the Dask Lab extension open on the left and various Dask plots arranged on the screen
    圖 6.Dask 儀表板有許多有用的圖表,包括一些專用的 GPU 指標,如內存使用和利用率

    如果您跟隨這篇文章,請通過刪除開始時創建的 GKE 集群來清理所有創建的資源。

    $ gcloud container clusters delete rapids-gpu-kubeflow --zone us-central1-c

    結語

    RAPIDS 與 KubeFlow 無縫集成,使您能夠在工作流的 ETL 階段以及培訓和推理期間使用 GPU 資源。

    您可以直接將 RAPIDS 環境放到 KubeFlow 筆記本服務中進行單節點工作,也可以從 KubeflowPipelines 中使用 Kubernetes 的 Dask 運算符將該工作負載擴展到多個節點和 GPU 。

    有關使用 RAPIDS 的更多信息,請參閱以下參考資料:

    ?

    ?

    0

    標簽

    人人超碰97caoporen国产