基於節點池管理共用GPU能夠為您提供更加靈活的GPU共用調度和顯存隔離策略。本文通過在專有版GPU叢集中建立兩個含標籤的節點池樣本,介紹如何基於節點池管理共用GPU的調度能力和顯存隔離能力。
適用情境
本文所描述的組件,僅支援專有版GPU叢集,不支援託管版GPU叢集。
若您想在ACK Pro版叢集安裝共用GPU組件,請參考安裝共用GPU調度組件。
前提條件
您已完成以下操作:
規劃節點池。
節點池名稱可自訂,本文以cgpu和cgpu-no-isolation為例進行闡述。
節點池名稱
共用調度
顯存隔離
標籤
cgpu
是
是
cgpu=true
cgpu.disable.isolation=false
cgpu-no-isolation
是
否
cgpu=true
cgpu.disable.isolation=true
背景資訊
在阿里雲Container ServiceKubernetes版ACK(Container Service for Kubernetes)上使用GPU共用調度時,您可能會遇到以下情境:
訓練任務A在代碼中已經配置該任務可使用的GPU顯存大小,此時叢集只需要提供GPU共用調度能力即可,不需要提供GPU顯存隔離能力。
訓練任務B在代碼中沒有配置該任務可使用的GPU顯存大小,此時叢集不僅需要提供GPU共用調度能力,而且還需要提供GPU顯存隔離能力。
那如何在一個叢集中同時支援這兩種情境呢?
基於節點池管理共用GPU的方法同時支援這兩種情境。您只需要建立兩個節點池:
第一個節點池的節點只提供共用調度能力,不提供顯存隔離能力,該節點池只適用於運行訓練任務A。
第二個節點池的節點同時提供共用調度能力和顯存隔離能力,該節點池只適用於運行訓練任務B。
注意事項
在使用節點池管理共用GPU的過程中,需要注意以下兩點:
用節點池管理共用GPU時,如果某個任務沒有寫nodeSelector,那麼該任務的Pod可能被調度到任意一個節點池,容易造成結果錯亂。
重要強烈建議給任務指定nodeSelector。
如果某個節點的特定標籤發生變化(例如:cgpu.disable.isolation=false變為cgpu.disable.isolation=true),需要重啟該節點的gpushare-device-plugin,顯存隔離的配置才會生效。
重啟策略是將舊的gpushare-device-plugin Pod刪除後,ACK會自動建立一個新的Pod,具體操作如下:
執行以下命令,查詢叢集的gpushare-device-plugin Pod。
kubectl get po -n kube-system -l name=gpushare-device-plugin-ds -o wide預期輸出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES gpushare-device-plugin-ds-6r8gs 1/1 Running 0 18h 192.168.7.157 cn-shanghai.192.168.7.157 <none> <none> gpushare-device-plugin-ds-pjrvn 1/1 Running 0 15h 192.168.7.158 cn-shanghai.192.168.7.158 <none> <none>以cn-shanghai.192.168.7.157節點為例,執行以下命令,刪除gpushare-device-plugin Pod。
kubectl delete po gpushare-device-plugin-ds-6r8gs -n kube-system
步驟一:建立節點池
在控制台左側導覽列,單擊叢集。
在叢集列表頁面,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
在叢集管理頁左側導覽列,選擇。
在建立節點池頁面,設定節點池的配置項。
有關配置項的詳細說明,請參見建立Kubernetes託管版叢集。部分配置說明如下:
數量:設定節點池初始節點數量。如不需要建立節點,可以填寫為0。
作業系統:選擇節點的作業系統,包括CentOS 7.x、Alibaba Cloud Linux 2.x。
節點標籤:您可以為叢集節點添加標籤。
ECS標籤:您可以為ECS執行個體添加標籤。
自訂資源群組:您可以指定節點池所擴容節點的資源群組資訊。
其中,在節點標籤地區為每個節點池打上特定的標籤。
節點池cgpu需要的特定標籤:cgpu=true、cgpu.disable.isolation=false
節點池cgpu-no-isolation需要的特定標籤:cgpu=true、cgpu.disable.isolation=true
以節點池cgpu-no-isolation為例:

單擊確認配置。
在節點池頁面,如果節點池狀態顯示初始化中,則說明節點池正在建立中。建立完成後,狀態顯示為已啟用。
如果您需要增加GPU節點,可對該節點進行擴容。具體操作,請參見建立節點池。
步驟二:提交任務
提交cgpu-test和cgpu-test-no-isolation兩個任務,在部署任務的YAML檔案中均需要指定nodeSelector。
cgpu-test:該任務的代碼中沒有設定可用的GPU顯存大小,需要藉助共用的顯存隔離能力才能正常運行。樣本YAML配置如下:
apiVersion: batch/v1 kind: Job metadata: name: cgpu-test spec: parallelism: 1 template: metadata: labels: app: cgpu-test spec: nodeSelector: cgpu.disable.isolation: "false" # 添加nodeSelector,選擇節點池cgpu。 containers: - name: cgpu-test image: registry.cn-hangzhou.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5 command: - python - tensorflow-sample-code/tfjob/docker/mnist/main.py - --max_steps=100000 - --data_dir=tensorflow-sample-code/data resources: limits: # 單位為GiB,該Pod總共申請了3 GiB顯存。 aliyun.com/gpu-mem: 3 workingDir: /root restartPolicy: Never說明nodeSelector:指定節點池為cgpu。
cgpu.disable.isolation=false:表示將任務調度到節點池cgpu的節點上運行。
aliyun.com/gpu-mem:設定GPU顯存大小。
cgpu-test-no-isolation:該任務的代碼中設定了每個GPU可用顯存大小,不需要藉助cgpu的顯存隔離能力。樣本YAML配置如下:
apiVersion: batch/v1 kind: Job metadata: name: cgpu-test-no-isolation spec: parallelism: 1 template: metadata: labels: app: cgpu-test-no-isolation spec: nodeSelector: cgpu.disable.isolation: "true" # 添加nodeSelector,選擇節點池cgpu-no-isolation。 containers: - name: cgpu-test-no-isolation image: registry.cn-hangzhou.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5 command: - python - tensorflow-sample-code/tfjob/docker/mnist/main.py - --max_steps=100000 - --data_dir=tensorflow-sample-code/data resources: limits: # 單位為GiB,該Pod總共申請了3 GiB顯存。 aliyun.com/gpu-mem: 3說明nodeSelector:指定節點池為cgpu-no-isolation。
cgpu.disable.isolation=true:表示將任務調度到節點池cgpu-no-isolation的節點上運行。
aliyun.com/gpu-mem:設定GPU顯存大小。
步驟三:查看執行結果
執行以下命令,查看任務狀態。
kubectl get po預期輸出:
NAME READY STATUS RESTARTS AGE cgpu-test-0 1/1 Running 0 5m55s cgpu-test-no-isolation-0 1/1 Running 0 6m42s在Pod cgpu-test-0(需要顯存隔離的任務)執行命令
nvidia-smi,查看容器可使用的顯存。kubectl exec cgpu-test-0 -- nvidia-smi預期輸出:
Mon Nov 2 11:33:10 2020 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.87.01 Driver Version: 418.87.01 CUDA Version: 10.1 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla V100-SXM2... On | 00000000:00:07.0 Off | 0 | | N/A 34C P0 54W / 300W | 3039MiB / 3226MiB | 1% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| +-----------------------------------------------------------------------------+容器可使用的顯存為3226 MiB(該GPU卡的總顯存為16 GiB),說明共用GPU的顯存隔離能力已生效。
在Pod cgpu-test-no-isolation-0(不需要顯存隔離的任務)執行
nvidia-smi,查看容器可使用的顯存。kubectl exec cgpu-test-no-isolation-0 -- nvidia-smi預期輸出:
Mon Nov 2 11:39:59 2020 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.87.01 Driver Version: 418.87.01 CUDA Version: 10.1 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla V100-SXM2... On | 00000000:00:07.0 Off | 0 | | N/A 37C P0 56W / 300W | 1929MiB / 16130MiB | 1% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| +-----------------------------------------------------------------------------+容器可發現的顯存為16130 MiB(該GPU卡的總顯存為16 GiB),說明共用GPU的顯存隔離能力已被關閉,此種情況下,容器中的應用程式需要通過以下環境變數擷取自己能夠使用的顯存大小。執行以下命令,擷取能夠使用的顯存大小。
kubectl exec cgpu-test-no-isolation-0 -- env | grep ALIYUN預期輸出:
ALIYUN_COM_GPU_MEM_CONTAINER=3 # 在某張卡上,該容器被允許使用的顯存大小,此處代表3 GiB。 ALIYUN_COM_GPU_MEM_DEV=15 # 這張卡的總顯存大小。 ...對比在Pod cgpu-test-no-isolation-0和cgpu-test-0中執行
nvidia-smi的結果。cgpu-test-no-isolation-0顯示整張GPU卡的顯存,而cgpu-test-0隻能顯示申請的GPU顯存大小,說明基於節點池可以有效管理共用GPU。