dcgm-exporter源碼分析

背景

在早期的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實例
}

啟動過程

  1. 把命令行參數轉成*dcgmexporter.Config

  2. 如果使用遠程hostengine,則采用 Standalone 啟動模式,否則以 Embedded 模式啟動。

    1. 初始化 DCGM

      1. 加載 libdcgm.so
  3. 判斷是否需要收集 DCP 相關指標

  4. 創建 ch channel用于傳遞指標數據

  5. 創建 *dcgmexporter.MetricsPipeline 實例

    1. 從--configmap-data 指定的 ConfigMap中解析要采集的指標信息

      1. 初始化 kubernetes.Interface

      2. 獲取目標ConfigMap,并解析“metrics”配置

    2. 如果從ConfigMap中解析失敗,則從 --collectors 指定的 csv 文件中解析要采集的指標信息

    3. 創建 *dcgmexporter.DCGMCollector 實例

      1. 初始化 *dcgmexporter.SystemInfo 實例

        1. 獲取 GPU 設備數量

        2. 獲取每個 GPU 的詳細信息,包括 GPU編號、DCGM可支持、UUID、功率(W)、PCI信息(BusID、BAR1、FBTotal、帶寬)、設備標志(品牌、模式、序列號、Vbios、驅動版本等)、P2PLink列表、CPU親和性

        3. 獲取GPU實例的層級結構

        4. 根據層級結構判斷GPU是否支持MIG,及關聯的 GPU 實例信息

        5. 設置 DeviceOptions

      2. 獲取hostname

      3. SetupDcgmFieldsWatch,并返回對應的 cleanup 方法(用于資源回收)

        1. 通過 *dcgmexporter.SystemInfo 信息創建分組

          1. 根據 SystemInfo 和 DeviceOptions 獲取要監控的實體(包括GPU和GPU實例)

          2. 創建Group及其cleanup方法

          3. 將被監控實體加入分組

        2. 創建 FileGroup 及其cleanup方法

        3. WatchFieldGroup

    4. 如果需要支持kubernetes指標映射到pod,創建 *dcgmexporter.PodMapper 實例

    5. 封裝成 *dcgmexporter.MetricsPipeline 實例

  6. 創建 *dcgmexporter.MetricsServer 實例,并將 ch channel 傳給 MetricsServer,賦值給 metricsChan 字段

    1. 啟動 HTTP 服務,用于處理 /health、/metrics 路徑請求
  7. 執行 MetricsPipeline.Run() 方法,并將 ch channel 傳給 Run() 方法,用于寫入指標數據

    1. 啟動定時器,定期執行 MetricsPipeline.run() 方法

      1. 執行 gpuCollector.GetMetrics() 方法,獲取指標數據

        1. 從 *dcgmexporter.SystemInfo 實例中獲取要監控的實體信息(包括GPU、GPU實例)

        2. 遍歷目標實體,獲取最新的指標數據,并轉化成 Prometheus 指標格式

        3. 返回指標數據

      2. 通過 PodMapper 將指標數據和 Pod 進行映射

      3. 對指標數據進行格式化

    2. 將結果寫入 ch channel

  8. 執行 MetricsServer.Run() 方法

    1. 啟動HTTP服務

    2. 從 metricsChan 接收指標數據

  9. 監聽系統中斷信號,如果監聽到中斷信號,則進行停止或重啟操作

參考文檔

基于DCGM和Prometheus的GPU監控方案

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容