基于節點池管理共享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
背景信息
在阿里云容器服務Kubernetes版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。