ACS支援在GPU-HPN節點上通過GPU共用調度實現將多個Pod運行在同一個GPU裝置上。在GPU獨佔調度情境,Pod只會按整卡粒度申請資源。當某個Pod沒有必要使用整卡的資源時,會造成資源浪費。通過GPU共用調度,您可以為Pod申請更加細粒度的異構資源算力。同時,GPU共用調度支援為Pod配置靈活的requests和limits約束,可以滿足多種應用情境的資源隔離和共用需求。
功能介紹
本文內容僅適用於ACS叢集。
GPU共用調度提供了更細粒度的資源描述,支援單Pod按不足一卡的粒度申請資源(如0.5張卡的算力),不支援跨卡彙總申請(如同時申請兩張卡各0.5算力)。
GPU共用調度的Pod驅動版本由GPU共用模組維護,不支援Pod單獨指定。
該功能目前在烏蘭察布、上海金融雲公測中,如您在其他地區有需求請提交工單。
在使用GPU共用調度時,Pod並不會直接存取具體的GPU裝置,而是通過GPU共用模組與裝置進行互動。GPU共用模組又分為代理和資源管理兩個模組,代理模組預設整合在Pod內,會攔截GPU裝置相關的API,將其轉寄到後端資源模組;資源模組則負責將GPU指令運行在真實的GPU裝置上,並根據Pod的資源描述,對GPU資源的使用進行限制。
此外,GPU共用的資源模組還會佔用一定的CPU和記憶體資源,在功能開啟後會自動預留。更多資訊,請參見節點配置說明。
資源配置及QoS
GPU共用資源使用Kubernetes的requests/limits約束來描述資源,支援以百分比的形式分別配置算力和顯存。同時也支援limits大於requests的資源描述形式,因此可能會出現多個Pod同時爭搶GPU資源的情況。ACS定義了GPU共用資源的QoS(服務品質),當節點中有多個Pod同時使用GPU資源時,Pod會排隊並可能觸發搶佔。樣本如下:
...
resources:
requests: # 控制節點上可調度的Pod數量
alibabacloud.com/gpu-core.percentage: 10 # Pod需要使用的算力百分比。
alibabacloud.com/gpu-memory.percentage: 10 # Pod需要使用的顯存百分比。
limits: # 控制運行時可以使用的資源上限,具體效果請參見配置說明。
alibabacloud.com/gpu-core.percentage: 100 # 算力用量上限
alibabacloud.com/gpu-memory.percentage: 100 # 顯存用量上限,超用會有CUDA OOM報錯
...與作業系統的進程管理機制類似,GPU共用模組會將Pod劃分為三種類型,分別為“休眠”、“就緒”、“運行”,各狀態的轉換過程如圖所示。
Pod在啟動後首先會被標記為“休眠”狀態。
當Pod嘗試使用GPU資源時,會被標記為“就緒”狀態,GPU共用模組會按一定優先策略為Pod分配GPU資源。
當Pod分配到GPU後,會被標記為“運行”狀態。
若所有資源分派後,仍有Pod處於“就緒”狀態,則會觸發搶佔機制,以保障Pod之間的資源公平性。
Pod被搶佔時,佔用GPU資源的進程會被kill,重新回到“休眠”狀態。
排隊策略
處於“就緒”狀態的Pod會按FIFO(First In, First Out. 即先來先服務)策略排隊,GPU共用模組會為最先進入“就緒”狀態的Pod分配資源,若當前資源不足,則觸發搶佔策略。
搶佔策略
當資源無法滿足“就緒”狀態的Pod需求時,GPU共用模組會嘗試搶佔其他Pod。首先從正在啟動並執行Pod中按一定條件做篩選,對於合格Pod打分排序,依次搶佔直至排隊Pod的資源得到滿足。
若當前正在啟動並執行Pod均無法滿足篩選條件,“就緒”狀態中的Pod會持續排隊等待資源,具體如下。
策略類型 | 說明 |
篩選策略 | 當前正在運行Pod已經連續佔用了2個小時的GPU資源,可自訂配置。更多資訊,請參見QoS配置。 |
打分策略 | Pod連續佔用的GPU資源時間長度,連續佔用時間更長的Pod優先被搶佔。 |
資源共用模型
GPU共用調度基於共用模型,支援在一張GPU卡上同時運行多個Pod。目前ACS支援以下共用模型:
模型名稱 | 使用效果 | GPU共用資源配置 | 排隊策略 | 搶佔策略 | 適用情境 |
share-pool | 將節點所有的GPU看作一個共用池(share pool),只要任意物理卡上有空閑資源,pod就可以使用。 |
| FIFO | 允許自訂配置。 | Notebook研發情境,結合資源QoS中的request/limit配置,可以支援多人錯峰使用GPU資源,當資源不足時會觸發排隊、搶佔等QoS機制。具體資訊,請參見Notebook情境利用share-pool模式錯峰使用資源案例。 |
static | GPU切分情境,為Pod分配固定的GPU裝置,運行期間不會發生變化。裝置調度時優先將Pod集中在相同GPU,避免片段。 |
警告 若GPU算力或顯存配置request < limit,會導致pod間資源競爭,甚至因顯存OOM導致Pod被Kill。 | 不支援 | 不支援 | 小型AI應用,多個Pod共用GPU裝置提升資源使用率。受request==limit約束,Pod在運行期間可以隨時獲得GPU資源,不會出現排隊情況。 |
Notebook情境利用share-pool模式錯峰使用資源案例
Notebook研發模式中,應用通常並不會長期持續佔用資源,因此可以利用share-pool模式,讓Pod錯峰運行在不同的GPU卡上,當有資源需求時,Pod才會進入到就緒隊列等待資源。
以下展示了一個Notebook情境的使用案例:
Pod A、B的資源描述為requests=0.5,limits=0.5,Pod C、D的資源描述為requests=0.5卡,limits=1卡。按照request需求,這些Pod可以同時調度到一個總量為2張卡的GPU-HPN節點。
T1時段:
資源被Pod A和Pod C佔用,Pod B和Pod D在就緒隊列中等待調度。
GPU共用模組會嘗試為隊首的Pod D分配資源,但目前僅有GPU0隻有0.5張卡的空閑資源,雖然Pod D的reqeust為0.5,從容量上可以滿足需求,但考慮到Pod D的limit為1,Pod A和Pod D在同一張卡上運行會出現資源爭搶,GPU共用模組會讓Pod D排隊等待資源。
T2時段-階段一:
Pod C任務結束,進入休眠隊列。
GPU 1空閑之後將資源分派給了Pod D。
T2時段-階段二:
Pod B得到資源,Pod B的limit為0.5,可以和Pod A同時在GPU0上使用,不存在資源競爭。
GPU共用調度使用樣本
本樣本示範Pod使用GPU共用調度功能。操作流程中會選擇一個GPU-HPN節點開啟GPU共用調度功能(share-pool),並提交Pod使用GPU共用資源,隨後關閉節點的GPU共用調度功能。
步驟一:為GPU-HPN節點配置標籤
查看GPU-HPN節點。
重要開啟前需要確保節點上不存在聲明GPU獨佔資源的Pod,否則需要先將Pod刪除才能開啟。若Pod僅申請了CPU和記憶體資源則不需要刪除。
kubectl get node -l alibabacloud.com/node-type=reserved預期輸出:
NAME STATUS ROLES AGE VERSION cn-wulanchabu-c.cr-xxx Ready agent 59d v1.28.3-aliyun為節點
cn-wulanchabu-c.cr-xxx增加標籤alibabacloud.com/gpu-share-policy=share-pool,開啟GPU共用調度功能。$ kubectl label node cn-wulanchabu-c.cr-xxx alibabacloud.com/gpu-share-policy=share-pool
步驟二:查看對應節點的開啟狀態
等待節點功能開啟完成,查看節點開啟狀態。在capacity欄位中可以看到GPU共用資源,且conditions中的GPUSharePolicyValid提示為True,表示開啟成功。
$ kubectl get node cn-wulanchabu-c.cr-xxx -o yamlGPU共用策略生效後,節點狀態會更新為以下形式。預期輸出:
# 具體以實際情況為準
apiVersion: v1
kind: Node
spec:
# ...
status:
allocatable:
# GPU共用資源描述
alibabacloud.com/gpu-core.percentage: "1600"
alibabacloud.com/gpu-memory.percentage: "1600"
# 功能開啟後,預留CPU、記憶體和儲存資源給GPU共用模組使用
cpu: "144"
memory: 1640Gi
nvidia.com/gpu: "16"
ephemeral-storage: 4608Gi
capacity:
# GPU共用資源描述
alibabacloud.com/gpu-core.percentage: "1600"
alibabacloud.com/gpu-memory.percentage: "1600"
cpu: "176"
memory: 1800Gi
nvidia.com/gpu: "16"
ephemeral-storage: 6Ti
conditions:
# 提示GPU Share策略配置正確性
- lastHeartbeatTime: "2025-01-07T04:13:04Z"
lastTransitionTime: "2025-01-07T04:13:04Z"
message: gpu share policy is valid.
reason: Valied
status: "True"
type: GPUSharePolicyValid
# 提示當前節點生效的GPU Share策略
- lastHeartbeatTime: "2025-01-07T04:13:04Z"
lastTransitionTime: "2025-01-07T04:13:04Z"
message: gpu share policy is share-pool.
reason: share-pool
status: "True"
type: GPUSharePolicy關於GPU共用資源各配置項的說明,請參見節點配置說明。
步驟三:使用GPU共用資源規格部署Pod
建立gpu-share-demo.yaml,配置使用與節點相同的共用模型
share-pool。apiVersion: v1 kind: Pod metadata: labels: alibabacloud.com/compute-class: "gpu-hpn" # 指定Pod的GPU共用模型為share-pool,與節點配置一致 alibabacloud.com/gpu-share-policy: "share-pool" # static name: gpu-share-demo namespace: default spec: containers: - name: demo image: registry-cn-wulanchabu-vpc.ack.aliyuncs.com/acs/stress:v1.0.4 args: - '1000h' command: - sleep # 資源描述中填寫GPU共用資源gpu-core.percentage和gpu-memory.percentage # request和limit效果詳見配置說明 resources: limits: cpu: '5' memory: 50Gi alibabacloud.com/gpu-core.percentage: 100 alibabacloud.com/gpu-memory.percentage: 100 requests: cpu: '5' memory: 50Gi alibabacloud.com/gpu-core.percentage: 10 alibabacloud.com/gpu-memory.percentage: 10部署樣本Pod。
kubectl apply -f gpu-share-demo.yaml
步驟四:查看Pod的GPU共用資源使用方式
登入容器,查看Pod的GPU共用資源使用方式。
kubectl exec -it pod gpu-share-demo -- /bin/bash您可使用nvidia-smi等命令,查看容器GPU資源分派和使用方式,具體情況以實際輸出為準。
對於share-pool類型的Pod,當Pod未使用GPU資源時,BusID欄位會展示為Pending。
具體命令以實際卡型為準,例如nvidia-smi對應NVIDIA系列GPU裝置,其他卡型請提交工單諮詢。
(可選)步驟五:關閉節點GPU共用調度策略
關閉前若節點上存在聲明GPU共用資源的Pod,需要先將Pod刪除。若Pod僅申請了CPU和記憶體資源則不需要刪除。
刪除使用GPU共用功能的Pod。
$ kubectl delete pod gpu-share-demo關閉節點的GPU共用調度功能。
$ kubectl label node cn-wulanchabu-c.cr-xxx alibabacloud.com/gpu-share-policy=none再次查看節點策略配置狀態。
$ kubectl get node cn-wulanchabu-c.cr-xxx -o yaml預期輸出:
apiVersion: v1 kind: Node spec: # ... status: allocatable: # 功能關閉後,預留CPU和記憶體資源恢複原值 cpu: "176" memory: 1800Gi nvidia.com/gpu: "16" ephemeral-storage: 4608Gi capacity: cpu: "176" memory: 1800Gi nvidia.com/gpu: "16" ephemeral-storage: 6Ti conditions: # 提示GPU Share策略配置正確性 - lastHeartbeatTime: "2025-01-07T04:13:04Z" lastTransitionTime: "2025-01-07T04:13:04Z" message: gpu share policy config is valid. reason: Valid status: "True" type: GPUSharePolicyValid # 提示當前節點生效的GPU Share策略 - lastHeartbeatTime: "2025-01-07T04:13:04Z" lastTransitionTime: "2025-01-07T04:13:04Z" message: gpu share policy is none. reason: none status: "False" type: GPUSharePolicy
詳細配置說明
節點配置說明
開啟配置
開啟GPU共用調度在Node的Label標籤中配置,具體如下。
配置項 | 說明 | 取值說明 | 樣本 |
alibabacloud.com/gpu-share-policy | GPU資源共用策略。 |
| |
若節點上已經有獨佔GPU類型的Pod,請先將相關Pod刪除再開啟共用策略。
若節點上已經有GPU共用資源類型的Pod,不能修改或關閉GPU共用策略,需要先將相關Pod刪除才能繼續操作。
若節點上的Pod僅申請了CPU和記憶體資源則不需要刪除。
QoS配置
GPU-HPN節點支援在節點註解中配置GPU共用調度的QoS參數,格式如下。
apiVersion: v1
kind: Node
...
metadata:
annotations:
alibabacloud.com/gpu-share-qos-config: '{"preemptEnabled": true, "podMaxDurationMinutes": 120, "reservedEphemeralStorage": "1.5Ti"}'
...具體說明如下:
參數 | 類型 | 取值 | 說明 |
preemptEnabled | Boolean |
| 僅適用於share-pool模式,表示是否開啟搶佔。預設值為true,表示開啟搶佔。 |
podMaxDurationMinutes | Int | 大於0的整數,單位為分鐘。 | 僅適用於share-pool模式,Pod佔用GPU超過該時間,才可能會被搶佔。預設值為120,即2小時。 |
reservedEphemeralStorage | resource.Quantity | 大於等於0,單位為Kubernetes字串格式,如500Gi。 | 節點本地臨時儲存預留空間,預設值為1.5Ti。 |
查看節點共用資源
功能開啟後,節點allocatable和capacity中會增加對應的GPU共用資源名稱,同時allocatable中會扣除新增的基礎資源開銷,各資源名說明如下。
配置項 | 說明 | 計算方式 |
alibabacloud.com/gpu-core.percentage | GPU共用資源算力,百分比格式。 功能開啟後會增加該欄位,功能關閉後會刪除該欄位。 | 裝置數量*100,例如16卡的機器,對應值為1600。 |
alibabacloud.com/gpu-memory.percentage | GPU共用資源顯存,百分比格式。 功能開啟後會增加該欄位,功能關閉後會刪除該欄位。 | 裝置數量*100,例如16卡的機器,對應值為1600。 |
cpu | 開啟後 | 裝置數量*2,例如16卡的機器,對應預留資源為32核。 |
memory | 裝置數量*10GB,例如16卡的機器,對應預留資源為160GB。 | |
ephemeral-storage | 單節點1.5TB磁碟空間。 |
正確性提示
欄位 | 取值 | 說明 |
type | GPUSharePolicyValid | 表示當前GPU Share配置的正確性。 |
status | "True","False" |
|
reason | Valid,InvalidParameters,InvalidExistingPods,ResourceNotEnough |
|
message | - | 方便閱讀的提示資訊。 |
| UTC時間 |
|
當前生效的GPU共用策略
欄位 | 取值 | 說明 |
type | GPUSharePolicy | 表示當前GPU Share配置的正確性。 |
status | "True","False" |
|
reason | none,share-pool,static |
|
message | - | 方便閱讀的提示資訊。 |
| UTC時間 |
|
若功能開啟或關閉後,節點資源未按上述說明發生變化,說明配置修改失敗,可以在conditions中查看配置正確性提示資訊。
Pod配置說明
功能開啟後,在Pod中配置GPU共用資源標籤即可使用該功能。
apiVersion: v1
kind: Pod
metadata:
labels:
# 僅支援gpu-hpn計算類
alibabacloud.com/compute-class: "gpu-hpn"
# 指定Pod的GPU共用模型為share-pool,與節點配置一致
alibabacloud.com/gpu-share-policy: "share-pool"
name: gpu-share-demo
namespace: default
spec:
containers:
- name: demo
image: registry-cn-wulanchabu-vpc.ack.aliyuncs.com/acs/stress:v1.0.4
args:
- '1000h'
command:
- sleep
resources:
limits:
cpu: '5'
memory: 50Gi
alibabacloud.com/gpu-core.percentage: 100
alibabacloud.com/gpu-memory.percentage: 100
requests:
cpu: '5'
memory: 50Gi
alibabacloud.com/gpu-core.percentage: 10
alibabacloud.com/gpu-memory.percentage: 10配置項說明如下:
計算類
配置項 | 取值 | 說明 |
metadata.labels.alibabacloud.com/compute-class | gpu-hpn | 僅支援gpu-hpn計算類。 |
GPU共用策略
配置項 | 類型 | 取值 | 說明 |
metadata.labels.alibabacloud.com/gpu-share-policy | String |
| 指定Pod的GPU共用模型,模型匹配的Node才會參與調度。 |
資源需求
在容器資源request中配置GPU共用資源,描述算力和顯存需求和限制,可以控制節點上可調度的Pod數量。同時,節點上的Pod數量還會受其他資源維度限制,例如CPU、記憶體、Pod數量等。
需求類別 | 配置項 | 類型 | 取值 | 說明 |
requests | alibabacloud.com/gpu-core.percentage | Int | share-pool策略:[10, 100] staitc策略:[10, 100) | 算力百分比,表示申請的單卡算力比例需求,最少為10%的算力。 |
alibabacloud.com/gpu-memory.percentage | 顯存百分比,表示申請的單卡顯存比例需求,最少為10%的顯存。 | |||
limits | alibabacloud.com/gpu-core.percentage | 算力百分比,表示申請的單卡算力比例限制,最少為10%的算力。 | ||
alibabacloud.com/gpu-memory.percentage | 顯存百分比,表示申請的單卡顯存比例限制,最少為10%的顯存。 |
配置約束
除了以上當個配置項的約束,Pod在申請資源時還會受到以下約束。
requests和limits中必須同時填寫顯存和算力(alibabacloud.com/gpu-core.percentage和alibabacloud.com/gpu-memory.percentage)。Pod最多隻支援有一個容器使用GPU共用資源(通常為主容器),其他容器(如Sidecar容器)僅允許申請CPU、記憶體等非GPU資源。
不支援容器內既申請GPU獨佔卡資源(
nvidia.com/gpu等),又申請GPU共用資源(alibabacloud.com/gpu-core.percentage,alibabacloud.com/gpu-memory.percentage)。
FAQ
若節點無空閑GPU資源,就緒隊列中的Pod會如何表現?
當GPU共用Pod等待資源時,會定時列印提示資訊,範例如下。
You have been waiting for ${1} seconds. Approximate position: ${2}其中${1}參數表示已經等待的時間,${2}參數表示當前在“就緒隊列”中的順位。
GPU共用模式特有的Pod監控指標有哪些?
對於使用了GPU共用資源的Pod,可以通過以下指標查看Pod使用GPU共用資源的情況。
指標 | 描述 | 範例 |
DCGM_FI_POOLING_STATUS | 僅在share-pool模式下提供,表示GPU共用模式下的Pod狀態類型,包括“休眠”、“就緒”和“運行”,具體如下:
| |
DCGM_FI_POOLING_POSITION | 僅在share-pool模式下提供,表示當前Pod正在就緒隊列中等待資源,值含義為當前Pod在就緒隊列中的位置,從1開始計數。 僅在POOLING_STATUS=1的時候才會出現。 | |
Pod使用GPU共用調度時,GPU利用率資料指標有什麼區別?
Pod的GPU利用率指標與之前一致,但對於使用了GPU共用調度情境的Pod,指標的標籤及含義有以下區別。
ACS提供的Pod監控資料中,GPU算力利用率、顯存用量等指標為基於整卡的絕對值,與GPU獨佔情境一致。
在Pod內通過nvidia-smi等命令看到的顯存用量為絕對值,與GPU獨佔情境一致;但算力利用率為相對值,其分母為Pod的limit。
Pod GPU利用率指標中的編號標籤等裝置資訊對應節點上的真實編號,並不都是從0開始編號。
對於share-pool類型的共用模式,由於Pod會在所有GPU裝置內彈性使用不同的卡裝置,所以指標中的裝置號可能會發生變化。
叢集內僅開啟了一部分GPU共用調度,如何避免GPU獨佔Pod調度衝突
ACS叢集預設調度器會自動匹配Pod和Node類型,避免調度衝突。
若您使用了自訂調度器,由於節點容量中同時存在GPU裝置資源和GPU共用資源,可能會導致GPU獨佔Pod調度到GPU共用節點上,您可選擇以下兩種方案:
方案一:編寫調度器外掛程式,自動感知ACS Node的配置標籤和
condition協議,過濾類型不符合的Node。更多資訊,請參見K8s調度器架構介紹。方案二:利用K8s的label或taint機制,在開啟GPU共用調度的Node上增加label或taint,為GPU獨佔和共用Pod分別配置不同的親和性策略。
GPU共用Pod被搶佔時,有哪些提示資訊可以查看
對於share-pool類型的共用模式,當觸發搶佔時,Pod會有Event和Condition提示。Event為非結構化的資料格式,若您需要讀取結構化的資料內容,可以在對應Condition中的reason和status中擷取,具體如下。
# 表示當前Pod的GPU資源被搶佔,觸發搶佔的Pod名稱是<new-pod-name>。
Warning GPUSharePreempted 5m15s gpushare GPU is preempted by <new-pod-name>.
# 表示當前Pod搶佔了其他Pod的GPU資源,被搶佔的Pod名稱是<old-pod-name>。
Warning GPUSharePreempt 3m47s gpushare GPU is preempted from <old-pod-name>.- type: Interruption.GPUShareReclaim # 表示GPU共用Pod搶佔的事件類型
status: "True" # True表示發生了搶佔或者被搶佔的行為
reason: GPUSharePreempt # GPUSharePreempt表示搶佔了其他Pod,GPUSharePreempted表示被其他pod搶佔
message: GPU is preempted from <old-pod-name>. # 與event類似的提示資訊
lastTransitionTime: "2025-04-22T08:12:09Z" # 發生搶佔行為的時間
lastProbeTime: "2025-04-22T08:12:09Z"Notebook情境中如何在節點上運行更多的Pod
對於開啟GPU共用功能的Pod,ACS還支援為Pod的CPU、記憶體配置request小於limit的規格,便於充分利用節點資源。需要注意的是,當節點提交的Pod資源limit總量超過節點資源規格(node allocatable)時,Pod在使用CPU和記憶體資源時會互相競爭,您可以結合節點資源使用率資料分析CPU和記憶體的資源競爭情況,詳見ACS GPU-HPN節點層級監控指標。對於Pod來說,CPU資源競爭會體現在Pod的CPU Steal Time上,記憶體資源競爭時會觸發整機OOM導致部分Pod被Kill終止,建議您結合應用特性合理規劃Pod優先順序和資源規格,避免資源競爭導致Pod服務品質受到影響。