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 预留这类差异会直接体现在报表上,混用会让同一天的曲线出现台阶。