GPU監控基於NVIDIA DCGM實現對叢集GPU節點的監控。本文將介紹如何查看基於三種不同的GPU申請方式所展現出的監控結果。
前提條件
背景資訊
GPU監控支援對叢集GPU節點進行全方位監控,提供叢集維度、節點維度和應用Pod維度GPU監控大盤。可參見監控面板說明瞭解更多詳細資料。
在叢集維度GPU監控大盤,您可以查看叢集或節點池維度相關資訊,例如叢集層面的利用率、顯存使用、XID錯誤偵測等。
在節點維度GPU監控大盤,您可以查看節點維度相關資訊,例如節點中GPU詳情、利用率、顯存使用等。
在應用Pod維度GPU監控大盤,您可以查看Pod維度相關資訊。例如Pod申請的GPU資源、利用率等。
本文以如下流程為例,介紹三種不同的GPU申請方式所展現出的不同監控結果。
注意事項
當前GPU監控指標的採集間隔為15秒,這可能導致Grafana監控儀錶盤展示的資料存在一定延遲。因此可能會出現在監控顯示節點無可用顯存,但實際Pod還能調度到該節點上。出現該現象可能是在兩次監控採集之間(15 秒內)有Pod完成任務並釋放GPU資源,調度器感知後,將處於Pending的Pod調度到這個節點上。
監控大盤只支援監控通過在Pod中配置
resources.limits的方式申請的GPU資源。更多資訊,請參見為Pod和容器管理資源。節點使用GPU資源時存在以下情況,可能會導致監控大盤的資料不準確:
直接在節點上運行GPU應用。
通過
docker run命令直接啟動容器運行GPU應用。在Pod的
env中直接添加環境變數NVIDIA_VISIBLE_DEVICES=all或NVIDIA_VISIBLE_DEVICES=<GPU ID>等,通過環境變數NVIDIA_VISIBLE_DEVICES直接為Pod申請GPU資源,並且運行了GPU程式。在Pod的
securityContext中配置privileged: true,並且運行了GPU程式。在Pod中未設定環境變數
NVIDIA_VISIBLE_DEVICES,但Pod所使用的鏡像在製作時,預設配置環境變數NVIDIA_VISIBLE_DEVICES=all,並且運行了GPU程式。
GPU卡已指派的顯存和已使用的顯存不一定相同。例如某一張GPU卡共有16 GiB顯存,為某個Pod分配了5 GiB顯存,但Pod的啟動命令為
sleep 1000,即Pod處於Running但需要經過1000秒後才會使用GPU,因此存在GPU卡已指派的顯存為5 GiB,但已使用的顯存為0 GiB的情況。
步驟一:建立節點池
Pod按整張卡方式或顯存維度申請GPU資源(包括申請GPU算力資源),GPU監控大盤均可以展示其相關指標。
本樣本將在叢集中建立三個節點池,展示不同GPU資源申請模式下的Pod調度與資源佔用情況。關於建立節點池的具體步驟,請參見建立節點池。節點池部分資訊如下:
配置項 | 說明 | 樣本值 |
節點池名稱 | 節點池一的名稱。 | exclusive |
節點池二的名稱。 | share-mem | |
節點池三的名稱。 | share-mem-core | |
執行個體規格 | 節點的執行個體規格,本文以運行Tensorflow Benchmark專案為例,需申請10 GiB顯存,節點規格需大於10GiB。 | ecs.gn7i-c16g1.4xlarge |
期望節點數 | 節點池應該維持的總節點數量。 | 1 |
節點標籤 | 節點池一添加的標籤。表示按整張卡的維度申請GPU資源。 | 無 |
節點池二添加的標籤。表示按GPU顯存維度申請GPU資源。 | ack.node.gpu.schedule=cgpu | |
節點池三添加的標籤。表示按GPU顯存維度申請GPU資源且支援算力申請。 | ack.node.gpu.schedule=core_mem |
步驟二:部署GPU應用
節點池建立完成後,為了驗證節點GPU相關指標是否正常,需要在節點上運行一些GPU測試工作。可參見GPU節點卡型及調度標籤說明瞭解各任務所需匹配標籤及調度關係。三個任務的部分資訊如下:
任務名稱 | 任務啟動並執行節點池 | 申請的GPU資源 |
tensorflow-benchmark-exclusive | exclusive | nvidia.com/gpu: 1 表示申請1張GPU卡。 |
tensorflow-benchmark-share-mem | share-mem | aliyun.com/gpu-mem: 10 表示申請10 GiB顯存。 |
tensorflow-benchmark-share-mem-core | share-mem-core |
表示申請10 GiB顯存和1張GPU卡的30%算力。 |
建立Job檔案。
使用以下YAML內容,建立tensorflow-benchmark-exclusive.yaml檔案。
apiVersion: batch/v1 kind: Job metadata: name: tensorflow-benchmark-exclusive spec: parallelism: 1 template: metadata: labels: app: tensorflow-benchmark-exclusive spec: containers: - name: tensorflow-benchmark image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3 command: - bash - run.sh - --num_batches=5000000 - --batch_size=8 resources: limits: nvidia.com/gpu: 1 #申請1張GPU卡。 workingDir: /root restartPolicy: Never使用以下YAML內容,建立tensorflow-benchmark-share-mem.yaml檔案。
apiVersion: batch/v1 kind: Job metadata: name: tensorflow-benchmark-share-mem spec: parallelism: 1 template: metadata: labels: app: tensorflow-benchmark-share-mem spec: containers: - name: tensorflow-benchmark image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3 command: - bash - run.sh - --num_batches=5000000 - --batch_size=8 resources: limits: aliyun.com/gpu-mem: 10 #申請10 GiB顯存。 workingDir: /root restartPolicy: Never使用以下YAML內容,建立tensorflow-benchmark-share-mem-core.yaml檔案。
apiVersion: batch/v1 kind: Job metadata: name: tensorflow-benchmark-share-mem-core spec: parallelism: 1 template: metadata: labels: app: tensorflow-benchmark-share-mem-core spec: containers: - name: tensorflow-benchmark image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3 command: - bash - run.sh - --num_batches=5000000 - --batch_size=8 resources: limits: aliyun.com/gpu-mem: 10 #申請10 GiB顯存。 aliyun.com/gpu-core.percentage: 30 #申請1張卡的30%算力。 workingDir: /root restartPolicy: Never
執行以下命令,部署Job任務。
kubectl apply -f tensorflow-benchmark-exclusive.yaml kubectl apply -f tensorflow-benchmark-share-mem.yaml kubectl apply -f tensorflow-benchmark-share-mem-core.yaml執行以下命令,查看Pod的運行狀態。
kubectl get pod預期輸出:
NAME READY STATUS RESTARTS AGE tensorflow-benchmark-exclusive-7dff2 1/1 Running 0 3m13s tensorflow-benchmark-share-mem-core-k24gz 1/1 Running 0 4m22s tensorflow-benchmark-share-mem-shmpj 1/1 Running 0 3m46s由預期輸出得到,Pod均處於
Running狀態,表示Job任務部署成功。
步驟三:查看GPU監控大盤
查看叢集GPU監控-叢集維度
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在Prometheus監控大盤列表頁面,單擊GPU監控頁簽,然後單擊叢集GPU監控-叢集維度頁簽。叢集維度監控大盤的資訊如下,更多資訊,請參見叢集維度監控大盤。

序號
Panel名稱
說明
①
Total GPU Nodes
共有3個GPU節點。
②
Allocated GPUs
GPU總數為3,已指派GPU數為1.9。
說明如果是按整張卡維度申請GPU,一張卡分配的比例為1;如果是共用GPU調度,分配比例為某張卡已指派的顯存與這張卡總顯存的比例。
③
Allocated GPU Memory
已指派63.0%的顯存。
④
Used GPU Memory
已使用35.5%的顯存。
⑤
Average GPU Utilization
所有卡的平均利用率為74%。
⑥
GPU Memory Copy Utilization
所有卡的平均記憶體複製利用率為43.7%。
⑦
GPU Node Details
叢集中GPU節點的資訊,包括節點名稱、GPU卡索引號、GPU利用率、記憶體控制器利用率等。
查看叢集GPU監控-節點維度
在Prometheus監控大盤列表頁面,單擊GPU監控頁簽,然後單擊叢集GPU監控-節點維度頁簽,選擇GPUNode為目標節點,本文以cn-hangzhou.10.166.154.xxx為例。節點維度監控大盤的資訊如下:




Panel組 | 序號 | Panel名稱 | 說明 |
Overview | ① | GPU Mode | GPU模式為共用模式,按顯存和算力維度申請GPU資源。 |
② | NVIDIA Driver Version | 安裝的GPU驅動版本為535.161.07。 | |
③ | Allocated GPUs | 總GPU個數為1,已指派GPU個數為0.45。 | |
④ | GPU Utilization | GPU的平均利用率為26%。 | |
⑤ | Allocated GPU Memory | 已指派的GPU顯存值佔總顯存值的45.5%。 | |
⑥ | Used GPU Memory | 當前使用的GPU顯存值佔總顯存值的36.4%。 | |
⑦ | Allocated Computing Power | 0號GPU卡已指派30%算力。 說明 只有在節點開啟算力分配的情況下,節點已指派的算力比例(Allocated Computing Power)才有資料顯示,因此本文樣本的三個節點,只有包含 | |
Utilization | ⑧ | GPU Utilization | 0號GPU卡利用率最小值為0%,最大值為33%,平均值為12%。 |
⑨ | Memory Copy Utilization | 0號GPU卡記憶體複製利用率最小值為0%,最大值為22%,平均值為8%。 | |
Memory&BAR1 | ⑩ | GPU Memory Details | GPU記憶體資訊,包括GPU卡的UUID、索引號、卡型號等。 |
⑪ | BAR1 Used | 已使用BAR1為4 MB。 | |
⑫ | Memory Used | GPU卡已使用的顯存大小為8.17 GB。 | |
⑬ | BAR1 Total | 總BAR1為32.8 GB。 | |
GPU Process | ⑭ | GPU Process Details | GPU線程詳細資料,包括Process所屬的Pod命名空間、Process所屬的Pod名稱等。 |
也可在下方查看更多進階指標,詳情請參見叢集GPU監控-節點維度。

查看叢集GPU監控-應用Pod維度
在Prometheus監控大盤列表頁面,單擊GPU監控頁簽,然後單擊叢集GPU監控-應用Pod維度頁簽。Pod維度監控大盤的資訊如下:
序號 | Panel名稱 | 說明 |
① | GPU Pod Details | 叢集申請GPU資源的Pod資訊,包括Pod所在的命名空間、Pod名稱、節點名稱、已使用的顯存等。 說明
|
也可在下方查看更多進階指標,詳情請參見叢集GPU監控-應用Pod維度。
