背景
在早期的GPU監控中我們會使用一些NVML工具來對GPU卡的基本信息進行采集,并持久化到監控系統的數據存儲層。因為我們知道,其實通過nvidia-smi這樣的命令也是可以獲取到GPU的基本信息的,但隨著整個AI市場的發展和成熟,對于GPU的監控也越來越需要一套標準化的工具體系,也就是本篇文章講的關于DCGM相關的監控解決方案。
簡介
DCGM(Data Center GPU Manager)即數據中心GPU管理器,是一套用于在集群環境中管理和監視Tesla?GPU的工具。
它包括主動健康監控,全面診斷,系統警報以及包括電源和時鐘管理在內的治理策略。
它可以由系統管理員獨立使用,并且可以輕松地集成到NVIDIA合作伙伴的集群管理,資源調度和監視產品中。
DCGM簡化了數據中心中的GPU管理,提高了資源可靠性和正常運行時間,自動化了管理任務,并有助于提高整體基礎架構效率。
DCGM采集GPU指標的實現都封裝在 libdcgm.so 庫中
指標含義
dcgm-exporter采集指標項以及含義:
dcgm_fan_speed_percent:GPU 風扇轉速占比(%)
dcgm_sm_clock:GPU sm 時鐘(MHz)
dcgm_memory_clock:GPU 內存時鐘(MHz)
dcgm_gpu_temp
:GPU 運行的溫度(℃)
dcgm_power_usage:GPU 的功率(w)
dcgm_pcie_tx_throughput:GPU PCIe TX傳輸的字節總數 (kb)
dcgm_pcie_rx_throughput:GPU PCIe RX接收的字節總數 (kb)
dcgm_pcie_replay_counter:GPU PCIe重試的總數
dcgm_gpu_utilization
:GPU 利用率(%)
dcgm_mem_copy_utilization
:GPU 內存利用率(%)
dcgm_enc_utilization:GPU 編碼器利用率 (%)
dcgm_dec_utilization:GPU 解碼器利用率 (%)
dcgm_xid_errors:GPU 上一個xid錯誤的值
dcgm_power_violation:GPU 功率限制導致的節流持續時間(us)
dcgm_thermal_violation:GPU 熱約束節流持續時間(us)
dcgm_sync_boost_violation:GPU 同步增強限制,限制持續時間(us)
dcgm_fb_free:GPU fb(幀緩存)的剩余(MiB)
dcgm_fb_used:GPU fb (幀緩存)的使用 (MiB)
其實到這,DCGM的工具集已經完整的將我們需要的 GPU 的metrics數據采集出來了,并且是符合prometheus的數據格式和標準的,此時,我們可以根據實際的情況編寫一個簡單的api程序,將采集到的數據以api的形式暴露出去,就可以讓整個prometheus server對各個 GPU 主機的metrics進行采集和監控。
啟動參數
參數名稱 | 別名 | 對應環境變量 | 說明 | 默認值 |
---|---|---|---|---|
collectors | f | DCGM_EXPORTER_COLLECTORS | 要采集的指標的配置文件路徑 | /etc/dcgm-exporter/default-counters.csv |
address | a | DCGM_EXPORTER_LISTEN | 服務地址 | :9400 |
collect-interval | c | DCGM_EXPORTER_INTERVAL | 指標采集間隔(單位:ms) | 30000 |
kubernetes | k | DCGM_EXPORTER_KUBERNETES | 支持kubernetes指標映射到pod | false |
kubernetes-gpu-id-type | DCGM_EXPORTER_KUBERNETES_GPU_ID_TYPE | GPU ID類型,用于映射kubernetes自由到pods。可選值為uid或device-name | uid | |
use-old-namespace | o | DCGM_EXPORTER_USE_OLD_NAMESPACE | Use old 1.x namespace | false |
remote-hostengine-info | r | DCGM_REMOTE_HOSTENGINE_INFO | 連接到遠程的 hostengine <HOST>:<PORT> | localhost:5555 |
devices | d | DCGM_EXPORTER_DEVICES_STR | 要監控的設備; f:監控所有的GPUs和GPU實例;g:只監控GPUs; i:只監控GPU實例,如果不支持MIG,則不能指定為該值 | f |
no-hostname | n | DCGM_EXPORTER_NO_HOSTNAME | 輸出時忽略hostname信息,為了兼容舊版本 | false |
fake-gpus | DCGM_EXPORTER_USE_FAKE_GPUS | 使用模擬GPU,僅用于測試 | false | |
configmap-data | m | DCGM_EXPORTER_CONFIGMAP_DATA | 要采集的指標的配置configMap <NAMESPACE>:<NAME> | none |
三種啟動模式
DCGM 可以通過三種模式來啟動:
Embedded
:在當前進程內啟動 hostengine。Standalone
:連接到指定地址的、已經在運行的 nv-hostengine,可以通過 -connect "IP:PORT/Socket" -socket "isSocket" 來指定目標地址。StartHostengine
:通過打開 Unix socket的方式來啟動并連接到 nv-hostengine,并在退出時終止 nv-hostengine。
DeviceOptions
type DeviceOptions struct {
Flex bool // 如果為true,則監聽所有不支持MIG的GPU信息,或支持MIG的GPU實例信息
GpuRange []int // 要監聽的GPU的索引列表,如果是-1,則表示監聽所有GPU
GpuInstanceRange []int // 要監聽的GPU實例的索引列表,如果是-1,則表示監聽所有GPU實例
}
啟動過程
把命令行參數轉成*dcgmexporter.Config
-
如果使用遠程hostengine,則采用 Standalone 啟動模式,否則以 Embedded 模式啟動。
-
初始化 DCGM
- 加載 libdcgm.so
-
判斷是否需要收集 DCP 相關指標
創建 ch channel用于傳遞指標數據
-
創建 *dcgmexporter.MetricsPipeline 實例
-
從--configmap-data 指定的 ConfigMap中解析要采集的指標信息
初始化 kubernetes.Interface
獲取目標ConfigMap,并解析“metrics”配置
如果從ConfigMap中解析失敗,則從 --collectors 指定的 csv 文件中解析要采集的指標信息
-
創建 *dcgmexporter.DCGMCollector 實例
-
初始化 *dcgmexporter.SystemInfo 實例
獲取 GPU 設備數量
獲取每個 GPU 的詳細信息,包括 GPU編號、DCGM可支持、UUID、功率(W)、PCI信息(BusID、BAR1、FBTotal、帶寬)、設備標志(品牌、模式、序列號、Vbios、驅動版本等)、P2PLink列表、CPU親和性
獲取GPU實例的層級結構
根據層級結構判斷GPU是否支持MIG,及關聯的 GPU 實例信息
設置 DeviceOptions
獲取hostname
-
SetupDcgmFieldsWatch,并返回對應的 cleanup 方法(用于資源回收)
-
通過 *dcgmexporter.SystemInfo 信息創建分組
根據 SystemInfo 和 DeviceOptions 獲取要監控的實體(包括GPU和GPU實例)
創建Group及其cleanup方法
將被監控實體加入分組
創建 FileGroup 及其cleanup方法
WatchFieldGroup
-
-
如果需要支持kubernetes指標映射到pod,創建 *dcgmexporter.PodMapper 實例
封裝成 *dcgmexporter.MetricsPipeline 實例
-
-
創建 *dcgmexporter.MetricsServer 實例,并將 ch channel 傳給 MetricsServer,賦值給 metricsChan 字段
- 啟動 HTTP 服務,用于處理 /health、/metrics 路徑請求
-
執行 MetricsPipeline.Run() 方法,并將 ch channel 傳給 Run() 方法,用于寫入指標數據
-
啟動定時器,定期執行 MetricsPipeline.run() 方法
-
執行 gpuCollector.GetMetrics() 方法,獲取指標數據
從 *dcgmexporter.SystemInfo 實例中獲取要監控的實體信息(包括GPU、GPU實例)
遍歷目標實體,獲取最新的指標數據,并轉化成 Prometheus 指標格式
返回指標數據
通過 PodMapper 將指標數據和 Pod 進行映射
對指標數據進行格式化
-
將結果寫入 ch channel
-
-
執行 MetricsServer.Run() 方法
啟動HTTP服務
從 metricsChan 接收指標數據
監聽系統中斷信號,如果監聽到中斷信號,則進行停止或重啟操作