首页/AI/大模型部署与运维速查/NVML 与 pynvml:脚本化采集 GPU 指标
推理环境与 GPU50 条

NVML 与 pynvml:脚本化采集 GPU 指标

nvidia-smi 底层是 NVML 库;Python 侧常用 nvidia-ml-py(导入名 pynvml)读取显存、温度、功耗与进程信息,适合自建轻量监控与巡检脚本。

NVML 与 pynvml

nvidia-smi 底层调用的就是 NVML 库;Python 侧常用 nvidia-ml-py 包(导入名 pynvml)读取显存、利用率、温度、功耗与进程信息。相比解析 nvidia-smi 的文本输出,直接调 NVML 拿到的字段更稳定,也更适合做秒级时序采集与自建轻量看板。

基本信息

安装名nvidia-ml-py
导入名pynvml
可采集显存、利用率、温度、功耗、进程
容器要求需把 GPU 设备挂进容器
建议频率秒级

典型使用场景

  • 自建轻量 GPU 看板,不想引入完整监控栈
  • 巡检脚本里判定显存水位与温度是否越线
  • 批量机器收集型号、驱动与显存容量做资产台账
  • 压测期间在同一进程内记录显存曲线,方便与操作时间对齐
  • 把采集结果与资产信息对齐:换卡或换驱动后能自动发现,不必靠人工更新
  • 容器编排里按可见设备数量遍历,天然避免跨 Pod 串卡

最小采集脚本

最小采集脚本
from pynvml import (nvmlInit, nvmlDeviceGetCount,
                    nvmlDeviceGetHandleByIndex, nvmlDeviceGetMemoryInfo)

nvmlInit()                                # 初始化 NVML
for i in range(nvmlDeviceGetCount()):     # 遍历机器上所有卡
    h = nvmlDeviceGetHandleByIndex(i)
    m = nvmlDeviceGetMemoryInfo(h)
    print(i, m.used // 2**20, 'MiB /', m.total // 2**20, 'MiB')

常用字段读法

字段含义典型用途
used已用显存水位告警与容量校验
total显存总量资产台账与选型核对
temperature温度散热与降频排查
power功耗功耗墙与能耗统计
采集频率保持秒级即可,高频调用 NVML 本身有开销,而且曲线噪声大反而看不出趋势;批量机器建议本地采集后汇总,而不是远程逐台拉取。
只要看一次就用 nvidia-smi --query-gpu 配 --format=csv;要长期采集曲线或做二次计算时,直接调 NVML 更省事、字段更稳。
部署形态常见两种:一是随服务进程内的采样子线程,二是独立的采集组件。前者部署简单,但进程挂掉采集也停;需要长期留存曲线时用后者。
跨机器统一采集时把 NVML 与 nvidia-smi 的口径对齐:显存单位、是否包含 ECC 预留这类差异会直接体现在报表上,混用会让同一天的曲线出现台阶。

易错点

  • 包名容易踩坑:安装名是 nvidia-ml-py,导入名才是 pynvml,装错包会出现接口缺失
  • 容器里初始化直接失败:设备没挂进容器,先核对运行时参数再排查代码
  • 采样频率过密:调用开销本身变成噪声,趋势反而看不出来
  • 用文本解析替代接口:nvidia-smi 输出随版本微调,脚本容易在某次升级后静默失效
  • 只在故障时临时采数:没有平时积累的基线曲线,就判断不出当前水位算高还是正常
  • 采集脚本没处理无 GPU 的节点:初始化直接抛异常,导致整批巡检中断

数据来源与参考

  • NVIDIA NVML API 文档(docs.nvidia.com/deploy/nvml-api)
  • nvidia-ml-py 包(pypi.org/project/nvidia-ml-py)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌