gpu-computing

DCGM Python 接口详解

·17 分钟阅读·6672 字

DCGM Python 接口详解 的详细笔记

📋 目录

DCGM Python 接口详解

核心概念 DCGM Python 接口封装了 DCGM 的监控、诊断、策略管理能力,通过 Python 即可获取 GPU 指标。

1. 结论:DCGM 官方完整提供 Python 绑定(pydcgm)

DCGM 原生配套 Python SDK,统称 pydcgm,底层封装 C 版 DCGM API,包含两套编程体系:

  1. 底层过程式 APIdcgm_agent / dcgm_structs / dcgm_fields,直接映射 C 函数;
  2. 面向对象高层封装 pydcgm:简化句柄、GPU分组、指标采集,适合业务开发;
  3. 简易封装工具 DcgmReader:官方预封装采集类,一行代码批量拉取全量指标(写监控脚本首选)。

1.1. 重要区分两个易混淆库

  1. pydcgm(DCGM 官方):依托 libdcgm.so,支持200+专业硬件指标、XID错误、ECC、MIG、NVLink、硬件诊断、进程统计,数据中心GPU监控标准
  2. pynvml / nvidia-ml-py(NVML):仅封装底层驱动基础接口,指标浅、无硬件故障诊断、无MIG分组能力,仅适合单机简易查看,不能替代DCGM。

2. Python 绑定安装与环境依赖

2.1. 前置条件

  • 宿主机安装完整 DCGM 软件包(datacenter-gpu-manager);
  • NVIDIA 数据中心驱动(A100/H100/A30,消费卡功能受限);
  • Python3.6+;
  • DCGM 内置 Python 绑定,不支持 pip 直接安装,需要引用宿主机绑定目录。

2.2. 绑定文件路径(DCGM 安装后自动生成)


/usr/local/dcgm/bindings/

├── pydcgm.py          # 面向对象高层封装

├── dcgm_agent.py      # 底层C接口映射

├── dcgm_structs.py    # 结构体、常量、字段ID定义

├── dcgm_fields.py     # 所有指标字段常量(显存、温度、XID等)

SDK 示例脚本路径:/usr/local/dcgm/sdk_samples/,包含采集、诊断、Prometheus导出样例。

2.3. Python 环境引入方式

脚本开头追加模块搜索路径:


import sys

# 引入DCGM绑定目录

sys.path.insert(0, "/usr/local/dcgm/bindings")

import pydcgm

import dcgm_agent

import dcgm_structs

from DcgmReader import DcgmReader

2.4. DCGM 两种运行模式(Python 代码都支持)

  1. Embedded 嵌入模式:Python 进程内部拉起内置 nv-hostengine,无需宿主机后台服务,单机脚本、容器dcgm-exporter使用;
  2. Standalone 独立模式:连接宿主机常驻 nv-hostengine,多进程共享采集缓存,生产集群标准。

3. 三大 Python 编程方案(从简单到底层)

4. 方案1:DcgmReader 极简采集(推荐快速写监控脚本)

官方封装工具,屏蔽句柄、分组、字段订阅细节,直接返回全GPU指标字典,dcgm-exporter底层也是基于该类实现。

4.1. 最简采集示例


import sys

sys.path.insert(0, "/usr/local/dcgm/bindings")

from DcgmReader import DcgmReader

import time

# 初始化采集器,自动Embedded模式连接DCGM

reader = DcgmReader()

while True:

    # 获取所有GPU指标字典 {gpu_id: {字段名: 指标对象}}

    gpu_metrics = reader.GetLatestGpuValuesAsFieldDict()

    for gpu_id, fields in gpu_metrics.items():

        print(f"==== GPU {gpu_id} ====")

        # 核心指标:显存、利用率、温度、XID错误

        if "DCGM_FI_DEV_GPU_UTIL" in fields:

            util = fields["DCGM_FI_DEV_GPU_UTIL"].value

            print(f"GPU利用率: {util}%")

        if "DCGM_FI_DEV_MEM_USED" in fields:

            mem_used = fields["DCGM_FI_DEV_MEM_USED"].value / 1024 / 1024

            print(f"已用显存: {mem_used:.2f} MB")

        if "DCGM_FI_DEV_GPU_TEMP" in fields:

            temp = fields["DCGM_FI_DEV_GPU_TEMP"].value

            print(f"GPU温度: {temp} ℃")

        if "DCGM_FI_DEV_XID_ERRORS" in fields:

            xid_err = fields["DCGM_FI_DEV_XID_ERRORS"].value

            print(f"XID硬件错误计数: {xid_err}")

    time.sleep(5)

4.2. 自定义采集字段(只监控需要指标,减少开销)


# 只订阅利用率、显存、温度三个指标

field_ids = [

    dcgm_structs.DCGM_FI_DEV_GPU_UTIL,

    dcgm_structs.DCGM_FI_DEV_MEM_USED,

    dcgm_structs.DCGM_FI_DEV_GPU_TEMP

]

reader = DcgmReader(fieldIds=field_ids)

5. 方案2:pydcgm 面向对象标准写法(生产自定义采集服务)

分层对象:DcgmHandle(连接句柄)→ DcgmSystem(整机GPU管理)→ DcgmGroup(GPU分组),适合多卡、MIG、批量诊断场景。


import sys

sys.path.insert(0, "/usr/local/dcgm/bindings")

import pydcgm

import dcgm_agent

import dcgm_structs

# 1. 初始化DCGM库

dcgm_agent.dcgmInit()

# 2. 启动嵌入模式

handle_raw = dcgm_agent.dcgmStartEmbedded(dcgm_structs.DCGM_OPERATION_MODE_AUTO)

# 3. 封装面向对象句柄

dcgm_handle = pydcgm.DcgmHandle(handle=handle_raw)

system = dcgm_handle.GetSystem()

# 获取所有GPU设备

gpu_list = system.GetAllGpus()

for gpu in gpu_list:

    gpu_id = gpu.GetGpuId()

    uuid = gpu.GetUuid()

    print(f"GPU{gpu_id} UUID: {uuid}")

    # 读取单卡实时指标

    util = gpu.GetFieldValue(dcgm_structs.DCGM_FI_DEV_GPU_UTIL)

    temp = gpu.GetFieldValue(dcgm_structs.DCGM_FI_DEV_GPU_TEMP)

    print(f"利用率{util.value}% 温度{temp.value}℃")

# 批量硬件诊断(Level1快速自检)

default_group = system.GetDefaultGroup()

diag_result = default_group.RunDiagnostic(dcgm_structs.DCGM_DIAG_LVL_SHORT)

print("硬件诊断结果:", diag_result.GetResult())

# 释放资源

dcgm_agent.dcgmStopEmbedded(handle_raw)

dcgm_agent.dcgmShutdown()

6. 方案3:底层过程式 dcgm_agent 原生C映射接口

无封装,完全对应C API,适合深度定制调度、MIG管理、NVLink拓扑查询,控制粒度最细。

核心流程:初始化 → 创建GPU组 → 创建指标字段组 → 订阅指标 → 循环拉取数据


import sys

sys.path.insert(0, "/usr/local/dcgm/bindings")

import dcgm_agent

import dcgm_structs

# 初始化

dcgm_agent.dcgmInit()

handle = dcgm_agent.dcgmStartEmbedded(dcgm_structs.DCGM_OPERATION_MODE_AUTO)

# 1. 创建GPU分组(包含所有显卡)

group_id = dcgm_agent.dcgmGroupCreate(handle, dcgm_structs.DCGM_GROUP_DEFAULT, 0)

# 2. 创建需要监控的指标字段组

field_ids = [dcgm_structs.DCGM_FI_DEV_GPU_UTIL, dcgm_structs.DCGM_FI_DEV_MEM_USED]

field_group_id = dcgm_agent.dcgmFieldGroupCreate(handle, field_ids, "gpu_basic")

# 3. 开启指标持续采集(后台缓存)

dcgm_agent.dcgmWatchFields(handle, group_id, field_group_id, 1000000, 0, 0)

# 4. 循环读取最新指标

import time

while True:

    values, num = dcgm_agent.dcgmGetLatestValues(handle, group_id, field_group_id)

    for val in values:

        print(f"GPU{val.gpuId} field{val.fieldId} value={val.value}")

    time.sleep(3)

# 释放

dcgm_agent.dcgmUnwatchFields(handle, group_id, field_group_id)

dcgm_agent.dcgmFieldGroupDestroy(handle, field_group_id)

dcgm_agent.dcgmGroupDestroy(handle, group_id)

dcgm_agent.dcgmStopEmbedded(handle)

dcgm_agent.dcgmShutdown()

7. Python API 核心能力(远超 pynvml)

7.1. 全量硬件指标采集(200+字段)

显存、SM利用率、Tensor Core占用、温度、功耗、ECC纠错、XID硬件错误、NVLink带宽、PCIe流量、MIG虚拟卡独立指标。

7.2. MIG 虚拟卡完整管理

枚举MIG实例、单独采集每个分片指标、批量创建/删除MIG配置。

7.3. 硬件分级诊断API

代码调用三级硬件自检,提前识别显卡故障:


# 短自检、完整压力自检、深度全量扫描

gpu_group.RunDiagnostic(dcgm_structs.DCGM_DIAG_LVL_SHORT)

gpu_group.RunDiagnostic(dcgm_structs.DCGM_DIAG_LVL_MED)

gpu_group.RunDiagnostic(dcgm_structs.DCGM_DIAG_LVL_LONG)

7.4. 进程资源统计

按PID查询GPU显存、SM占用,用于集群算力成本统计:


process_info = gpu.GetProcessStats()

for proc in process_info:

    print(f"PID:{proc.pid} 显存占用{proc.usedMemory}")

7.5. 功耗/时钟策略管控

代码动态设置显卡功耗上限、锁定最低/最高频率,防止过热降频。

获取多卡互联关系,用于调度器GPU拓扑亲和打分逻辑开发。

7.7. 故障事件持续监听

实时捕获XID、DBE/ECC硬件报错,实现自动化故障隔离告警。

8. DCGM Python vs pynvml 关键区别(面试高频)

| | | |

|---|---|---|

|能力|DCGM pydcgm|pynvml (NVML)|

|指标数量|200+ 专业硬件指标|30+ 基础简易指标|

|硬件故障检测|XID/ECC/NVLink CRC错误|无硬件错误统计|

|MIG分片支持|完整独立采集每个虚拟实例|只能看整卡总和|

|后台缓存机制|nv-hostengine常驻缓存,低开销|每次调用直接查询驱动,轮询开销大|

|硬件诊断|三级压力自检API|无内置诊断|

|分布式训练NVLink指标|支持带宽、错误统计|无|

|集群适配|支持多客户端共享采集、远程连接hostengine|单机单次查询,无集群能力|

|生产场景|AI训练/推理集群监控、故障预警|本地临时查看、简易脚本|

9. 容器(dcgm-exporter)中使用 Python DCGM

dcgm-exporter 本身就是基于 Go DCGM 绑定;如果想自定义 Python 采集容器:

  1. 镜像预装完整 DCGM;
  2. 挂载宿主机 /run/nvidia-persistenced/dev/nvidia*
  3. 启动添加 SYS_ADMIN 权限;
  4. 脚本引入 /usr/local/dcgm/bindings 路径;
  5. 环境变量 DCGM_EXPORTER_KUBERNETES=true 读取Pod-GPU映射关系,给指标打业务标签。

10. 常见踩坑

  1. 找不到 pydcgm 模块未添加 /usr/local/dcgm/bindings 到 sys.path;DCGM 未完整安装。
  2. 权限不足,无法读取GPU指标脚本使用root运行,容器添加 capabilities: ["SYS_ADMIN"]
  3. 消费级3090/4090部分API失效
    DCGM完整功能仅支持数据中心A/H系列卡,消费卡仅基础利用率指标可用,无ECC、MIG、XID完整统计。
  4. 指标value类型不统一温度/利用率是int,显存字节是long,浮点功耗需读取 doubleVal 字段属性。
  5. Embedded模式多进程冲突
    多Python进程同时启动Embedded会抢占锁,生产统一使用宿主机独立nv-hostengine。

11. 面试高频问答

  1. **DCGM 有Python接口吗?叫什么?和pynvml区别?**有,官方绑定 pydcgm,包含底层dcgm_agent与高层DcgmReader;pydcgm依托nv-hostengine后台缓存、支持硬件故障诊断/MIG/NVLink;pynvml只是底层驱动简易接口,指标少、无集群运维能力。
  2. DCGM Python 采集GPU指标两种运行模式?
    Embedded嵌入:进程内部启动hostengine,单机脚本/容器;Standalone独立:连接宿主机常驻nv-hostengine,集群多客户端共享采集。
  3. DcgmReader 作用是什么?
    官方高层封装,屏蔽句柄、分组、字段订阅复杂逻辑,一行代码批量拉取所有GPU指标,dcgm-exporter、collectd插件底层均基于该封装开发。
  4. 能不能用pydcgm做自定义GPU故障告警?
    可以,API可实时获取XID、ECC错误计数、温度阈值,循环采集后对接钉钉/企业微信告警,替代原生dcgm-exporter。
  5. MIG分片场景Python如何采集每个虚拟实例指标?
    pydcgm自动枚举所有MIG实例,每个实例拥有独立GPU ID,可单独读取显存、利用率、错误指标,区分不同Pod负载。

关联文档

Yanche Blog

记录云原生、Linux、数据库等技术领域的学习心得,以及日常生活的思考与感悟。

© 2026 Yanche Blog. All rights reserved.

Powered by Astro