預設情況,Pod分配GPU資源的順序為先分配完節點上的一張GPU卡,再分配其他GPU卡,避免出現GPU資源片段。但是在有的情境中,您希望讓Pod調度到節點上時,盡量分散到各個GPU卡上,避免因為某張GPU卡壞掉影響的業務過多。本文介紹如何配置共用GPU調度節點選卡策略。
前提條件
策略介紹
在共用GPU調度中,如果節點存在多張GPU卡,從節點中挑選GPU卡分配給Pod時,有兩種策略可以考慮:
Binpack:預設策略,調度系統先分配完節點的一張GPU卡後,再分配節點上另一張GPU卡,避免節點出現GPU資源片段。
Spread:調度系統會盡量將Pod分散到這個節點的各個GPU上,避免一張GPU卡壞掉後,影響的業務過多。
以下樣本表示,某個節點有2張GPU卡,每張卡有15 GiB顯存,Pod1申請2 GiB顯存,Pod2申請3 GiB顯存。
步驟一:建立節點池
預設情況下,節點的選卡策略是Binpack。如果要使用Spread策略,請按照如下操作設定。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在節點池頁面,單擊右上方的建立節點池。
在建立節點池頁面,設定建立節點池的配置項,然後單擊確認配置。下表僅介紹主要配置項,其餘配置項請參見建立節點池。
配置項
說明
執行個體規格
架構選擇GPU雲端服務器,選擇多個GPU執行個體規格。
由於只有在節點有多張GPU卡的情況下,節點選卡策略才能看出效果,建議選擇帶有多張GPU卡機型。
期望節點數
設定節點池初始節點數量。如無需建立節點,可以填寫為0。
節點標籤
單擊,添加兩條記錄:
鍵為
ack.node.gpu.schedule
,值為cgpu
。表示開啟GPU共用調度能力,同時開啟GPU顯存隔離能力。鍵為
ack.node.gpu.placement
,值為spread
。表示開啟節點Spread選卡策略。
步驟二:提交任務
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
單擊頁面右上方的使用YAML建立資源,將如下代碼拷貝至模板地區,然後按照注釋編輯YAML內容。編輯完成後,單擊頁面下方的建立。
YAML檔案說明如下:
該YAML定義了一個使用tensorflow mnist範例的Job。Job有3個Pod,每個Pod申請4 GiB顯存。
Pod申請4 GiB顯存通過在Pod resources.limits定義
aliyun.com/gpu-mem: 4
實現。為了在一個節點上看到效果,YAML為Pod添加了一個NodeSelector
kubernetes.io/hostname: <NODE_NAME>
,用於將Pod調度到指定節點上。
步驟三:驗證節點選卡策略是否為Spread
使用共用GPU調度GPU資源查詢工具,查詢節點GPU資源分派情況:
kubectl inspect cgpu
NAME IPADDRESS GPU0(Allocated/Total) GPU1(Allocated/Total) GPU2(Allocated/Total) GPU3(Allocated/Total) GPU Memory(GiB)
cn-shanghai.192.0.2.109 192.0.2.109 4/15 4/15 0/15 4/15 12/60
--------------------------------------------------------------------------------------
Allocated/Total GPU Memory In Cluster:
12/60 (20%)
輸出結果表明,3個Pod分別調度到節點的不同GPU卡上,Spread策略生效。