ACK叢集Pro版支援為應用申請GPU顯存和算力,能夠協助您更精細化的使用GPU的顯存和算力資源。本文介紹如何通過共用GPU調度實現算力分配。
前提條件
已建立ACK叢集Pro版,且叢集版本為v1.20及以上。具體步驟,請參見建立ACK託管叢集。對於不同ACK版本的叢集,調度器版本需滿足以下要求。關於調度器各版本支援的功能,請參見kube-scheduler。
ACK叢集版本
調度器版本
1.28
v1.28.1-aliyun-5.6-998282b9及以上
1.26
v1.26.3-aliyun-4.1-a520c096及以上
1.24
v1.24.3-ack-2.0及以上
1.22
v1.22.15-ack-2.0及以上
1.20
v1.20.4-ack-8.0及以上
已安裝共用GPU組件,且Chart版本為1.2.0以上。關於安裝共用GPU組件的具體操作,請參見安裝共用GPU調度組件。
cGPU版本為1.0.5及以上。關於cGPU的升級操作,請參見升級節點cGPU版本。
使用限制
共用GPU調度目前支援僅申請顯存和同時申請顯存和算力兩種任務,這兩種任務不能同時存在於一個節點上,即一個節點只運行僅申請顯存的任務,或者只運行同時申請顯存和算力的任務。
為任務申請算力時,有如下限制:
每一張GPU提供的算力按100計量,代表這張卡的100%算力,例如申請20代表使用GPU卡的20%算力。
申請的算力值應為5的倍數,最小為5。如果不為5的倍數,任務將提交失敗。
目前只有以下地區支援GPU顯存算力分配功能。如果您需要使用該功能,請確保叢集所在地區在此範圍內。
地區
地區ID
華北2(北京)
cn-beijing
華東2(上海)
cn-shanghai
華東1(杭州)
cn-hangzhou
華北3(張家口)
cn-zhangjiakou
華南1(深圳)
cn-shenzhen
西南1(成都)
cn-chengdu
華南2(河源)
cn-heyuan
中國香港
cn-hongkong
印尼(雅加達)
ap-southeast-5
新加坡
ap-southeast-1
泰國(曼穀)
ap-southeast-7
美國(維吉尼亞)
us-east-1
美國(矽谷)
us-west-1
日本(東京)
ap-northeast-1
華東2 金融雲
cn-shanghai-finance-1
共用GPU調度支援算力分配的調度器於2022年03月01日上線,在此之後建立的叢集將使用新版本調度器,但是在此之前已有叢集的調度器不會自動升級到新版本,需要您手動進行操作。若您的叢集建立時間早於2022年03月01日,請按照如下操作進行處理:
提交工單申請新版共用GPU調度內測。
卸載舊版共用GPU組件。
如果已安裝舊版共用GPU組件(僅支援顯存共用,Chart版本≤1.2.0),請按照以下步驟進行處理。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在Helm頁面,單擊ack-ai-installer右側操作列下方的刪除,然後在彈出的刪除應用對話方塊,單擊確定。
安裝新版共用GPU組件。具體操作,請參見安裝共用GPU調度組件。
步驟一:建立支援算力分配的節點池
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在節點池頁面右側,單擊建立節點池。
部分參數配置說明如下,關於配置項的詳細說明,請參見節點池配置。
配置項
說明
節點池名稱
設定節點池名稱。本文配置為gpu-core。
期望節點數
設定節點池初始節點數量。若您不需要建立節點,請填寫為0。
ECS標籤
為ECS執行個體添加標籤。
節點標籤
為叢集節點添加標籤。本文配置如下,關於節點標籤的更多資訊,請參見ACK調度GPU使用的節點標籤說明。
開啟節點GPU顯存和算力隔離能力:單擊,輸入第一個節點標籤的鍵為ack.node.gpu.schedule,值為core_mem。
在節點上使用Binpack演算法為Pod選擇GPU卡:單擊,輸入第二個節點標籤的鍵為ack.node.gpu.placement,值為binpack。
重要如果您需要將叢集中已存在的GPU節點切換為算力隔離模式,請先將該節點從叢集中移除,然後重新加入支援算力隔離的節點池。不支援直接使用
kubectl label nodes <NODE_NAME> ack.node.gpu.schedule=core_mem
命令將該GPU節點切換為算力隔離模式。
步驟二:查看節點池是否開啟算力分配功能
執行以下命令,查看節點池的節點是否開啟算力分配功能。
kubectl get nodes <NODE_NAME> -o yaml
預期輸出:
#省略其他欄位。
status:
#省略其他欄位。
allocatable:
#節點共有400%的算力,4張GPU卡,每張卡提供100%算力。
aliyun.com/gpu-core.percentage: "400"
aliyun.com/gpu-count: "4"
#節點共有60 GiB顯存,4張GPU卡,每張卡提供15 GiB顯存。
aliyun.com/gpu-mem: "60"
capacity:
aliyun.com/gpu-core.percentage: "400"
aliyun.com/gpu-count: "4"
aliyun.com/gpu-mem: "60"
預期輸出表明,存在aliyun.com/gpu-core.percentage
欄位,即算力分配功能已開啟。
步驟三:使用算力分配功能
未使用算力分配功能前,一張GPU卡的總顯存為15 GiB,Pod可以100%使用該GPU卡的算力。本文以同時申請顯存和算力任務為例,申請2 GiB顯存、一張GPU卡的30%算力,介紹如何使用GPU顯存算力分配功能。
使用以下YAML內容,建立申請GPU顯存和算力的任務。
apiVersion: batch/v1 kind: Job metadata: name: cuda-sample spec: parallelism: 1 template: metadata: labels: app: cuda-sample spec: containers: - name: cuda-sample image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3 command: - bash - run.sh - --num_batches=500000000 - --batch_size=8 resources: limits: # 單位為GiB,該Pod總共申請了2 GiB顯存。 aliyun.com/gpu-mem: 2 #申請一張GPU卡的30%算力。 aliyun.com/gpu-core.percentage: 30 workingDir: /root restartPolicy: Never
執行以下命令,部署cuda-sample.yaml檔案提交cuda-sample任務。
kubectl apply -f /tmp/cuda-sample.yaml
說明任務所使用的鏡像較大,拉取鏡像需要一定的時間,請耐心等待。
執行以下命令,查看cuda-sample任務的運行狀態。
kubectl get po -l app=cuda-sample
預期輸出:
NAME READY STATUS RESTARTS AGE cuda-sample-m**** 1/1 Running 0 15s
預期輸出表明,
STATUS
為Running
,即任務部署成功。執行以下命令,查看顯存和算力的使用方式。
kubectl exec -ti cuda-sample-m**** -- nvidia-smi
預期輸出:
Thu Dec 16 02:53:22 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 450.102.04 Driver Version: 450.102.04 CUDA Version: 11.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla V100-SXM2... On | 00000000:00:08.0 Off | 0 | | N/A 33C P0 56W / 300W | 337MiB / 2154MiB | 30% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| +-----------------------------------------------------------------------------+
預期輸出表明:
顯存:未開啟算力分配功能前,Pod能夠使用的總顯存為該GPU卡的總顯存,本文為15 GiB(在節點上執行
nvidia-smi
命令即可查詢GPU卡的總顯存)。開啟算力分配功能後,Pod當前已使用337 MiB,能夠使用的總顯存為2154 MiB(約為2 GiB),說明顯存隔離生效。算力:未開啟算力分配功能前,Pod啟動並執行任務能夠100%使用GPU卡(您可以將申請的算力設定為100進行驗證)。開啟算力分配功能後,Pod已使用GPU卡的30%算力,說明算力隔離生效。
說明如果有n個任務,假設每個任務申請30%算力(n≤3,最多部署3個),n個任務運行在同一張GPU卡上,此時在每個Pod中執行
nvidia-smi
命令,可以看到算力為n*30%。nvidia-smi
命令的查詢結果目前僅顯示以卡為單位的算力利用率,而不顯示以任務為單位的算力利用率。使用以下命令,查看Pod日誌。
kubectl logs cuda-sample-m**** -f
預取輸出:
[CUDA Bandwidth Test] - Starting... Running on... Device 0: Tesla V100-SXM2-16GB Quick Mode time: 2021-12-16/02:50:59,count: 0,memSize: 32000000,succeed to copy data from host to gpu time: 2021-12-16/02:51:01,count: 1,memSize: 32000000,succeed to copy data from host to gpu time: 2021-12-16/02:51:02,count: 2,memSize: 32000000,succeed to copy data from host to gpu time: 2021-12-16/02:51:03,count: 3,memSize: 32000000,succeed to copy data from host to gpu
由預期輸出得到,使用算力分配功能後,Pod日誌重新整理較慢,此時算力被限制在該GPU卡的30%左右。
可選:執行以下命令,刪除cuda-sample任務。
驗證完畢後,您可以對任務進行刪除操作。
kubectl delete job cuda-sample