AI服务器GPU利用率监控:nvidia-smi与DCGM指标解读
GPU 利用率监控要解决的核心问题是:卡到底有没有在干活。
最直接的办法是用 nvidia-smi 看当前瞬时占用,但要持续观察训练或推理任务的波动,就需要把 DCGM 采集到的利用率指标接入 Prometheus。
下面按准备、采集、验证、避坑的顺序说明。
先确认驱动和 GPU 可见
在 AI 服务器上执行以下命令,确认 NVIDIA 驱动正常、GPU 能被系统识别:
nvidia-smi
正常输出会列出每张卡的型号、显存占用和 GPU-Util 百分比。
如果命令不存在,先检查驱动是否安装;
如果只显示部分卡,检查 CUDA_VISIBLE_DEVICES 环境变量或容器启动参数是否限制了可见设备。
再用一条命令快速观察利用率变化:
nvidia-smi --query-gpu=index,utilization.gpu,memory.used,memory.total --format=csv -l 1
-l 1 表示每秒刷新一次。
这个方式适合临时排查,不适合长期留存数据。
用 DCGM Exporter 持续采集利用率
DCGM Exporter 是 NVIDIA 提供的指标导出组件,默认监听 9400 端口,把 GPU 利用率、显存、温度、功耗等指标以 Prometheus 格式暴露出来。
如果服务器已安装 Docker 和 NVIDIA Container Toolkit,可以直接启动:
docker run -d --gpus all --rm -p 9400:9400 \
--name dcgm-exporter \
nvcr.io/nvidia/k8s/dcgm-exporter:latest
启动后访问 http://服务器IP:9400/metrics,能看到大量以 DCGM_FI_ 开头的指标行。
其中与利用率直接相关的是:
DCGM_FI_DEV_GPU_UTIL:GPU 计算利用率百分比DCGM_FI_DEV_MEM_COPY_UTIL:显存带宽利用率DCGM_FI_DEV_FB_USED:已用显存DCGM_FI_DEV_POWER_USAGE:功耗
如果 9400 端口没有返回指标,先看容器日志:
docker logs dcgm-exporter
常见原因是驱动版本与容器镜像不匹配,或 --gpus all 没有生效。
接入 Prometheus 并确认抓取成功
在 Prometheus 的 prometheus.yml 中增加抓取任务:
scrape_configs:
- job_name: 'gpu'
static_configs:
- targets: ['192.168.1.10:9400']
把 192.168.1.10 换成实际服务器地址,然后重启或热加载 Prometheus。
在 Prometheus 页面进入 Status -> Targets,确认 gpu 任务状态为 UP。
之后可以在查询框输入:
DCGM_FI_DEV_GPU_UTIL
如果返回多条时间序列,说明利用率指标已经进入 Prometheus。
按 GPU 编号区分可以加标签过滤,例如 DCGM_FI_DEV_GPU_UTIL{gpu="0"}。
利用率读数怎么判断
DCGM_FI_DEV_GPU_UTIL 反映的是采样周期内 GPU 有计算任务执行的时间比例。
训练任务中看到 90% 以上通常说明计算负载饱满;
推理服务看到 30% 到 60% 也可能是正常现象,因为请求间隔和批处理策略会影响瞬时值。
需要留意的是,利用率高不等于显存够用,也不等于没有瓶颈。
如果利用率长期偏低但显存接近打满,可能是 batch 设置或数据加载拖慢了计算;
如果利用率和显存都低,先检查任务是否真的提交到了 GPU。
常见异常和避坑
- 容器内看不到 GPU:确认启动时加了
--gpus all,并且宿主机nvidia-smi正常。 - 指标存在但数值全为 0:先确认采集时 GPU 上确实有任务在运行,空载时利用率就是 0。
- 多卡只采到一张:检查 DCGM Exporter 启动参数和容器可见设备,必要时显式指定 GPU 列表。
- 长期只靠 nvidia-smi 截图:瞬时值无法反映趋势,持续监控应使用 DCGM 加 Prometheus 的组合。
最后验证一遍:
Prometheus 中 DCGM_FI_DEV_GPU_UTIL 能查出数据,
Grafana 或查询结果里利用率曲线随任务启动上升、
任务结束回落,
就说明监控链路已经打通。