K8s集群GPU算力监控:用Prometheus暴露显存与利用率
GPU算力在K8s里为什么需要单独监控
Kubernetes默认只关心CPU和内存,GPU的显存占用、SM利用率、温度、功耗这些指标它看不到。
如果你只管了Pod调度成功,却不知道GPU跑没跑满、有没有卡在显存溢出,算力就是一笔糊涂账。
本文用NVIDIA官方维护的DCGM Exporter配合Prometheus,把每张卡的算力指标暴露出来,步骤面向零基础用户,照着做就能看到数据。
需要说明的是,DCGM Exporter只负责采集和暴露指标,它不负责调度GPU,也不改变你的训练任务。
适用前提是节点已装好NVIDIA驱动,且容器运行时能识别GPU。
动手前先确认三件事
- 节点上执行
nvidia-smi能正常列出GPU型号和驱动版本。 - 已安装
nvidia-container-toolkit,且容器运行时(containerd或Docker)配置了NVIDIA runtime。 - 集群里已有Prometheus,能通过ServiceMonitor或静态配置抓取新target。
验证容器运行时是否就绪,可以在节点上跑一个官方测试镜像:
nvidia-ctk --version
ctr run --rm --gpus 0 nvcr.io/nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi
如果第二条命令报no such device或找不到GPU,先别急着往下走,问题出在运行时配置而不是Exporter。
用DaemonSet部署DCGM Exporter
推荐用Helm安装,版本号请以你实际拉取到的chart为准,不同版本values字段名可能不同。
helm repo add gpu-helm-charts https://nvidia.github.io/dcgm-exporter/helm-charts
helm repo update
helm install dcgm-exporter gpu-helm-charts/dcgm-exporter \
--namespace monitoring --create-namespace
如果不用Helm,核心是让DaemonSet满足两点:
- 挂载
/run/nvidia/driver或/dev/nvidia*设备,具体路径取决于驱动安装方式。 - 容器启动参数指向
-f /etc/dcgm-exporter/dcp-metrics-included.csv,即采集指标清单。
部署后确认Pod落在有GPU的节点上:
kubectl -n monitoring get pods -o wide | grep dcgm
kubectl -n monitoring logs --tail=50
日志里能看到Starting dcgm-exporter且没有Failed to initialize字样,说明采集端正常。
让Prometheus抓到指标
DCGM Exporter默认在9400端口暴露/metrics。
先手动验证:
kubectl -n monitoring port-forward svc/dcgm-exporter 9400:9400
curl -s localhost:9400/metrics | grep DCGM_FI_DEV_GPU_UTIL
能返回带数值的行,说明数据已经出来了。
接着在Prometheus里加抓取任务,如果用Prometheus Operator,创建ServiceMonitor:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: dcgm-exporter
namespace: monitoring
spec:
selector:
matchLabels:
app.kubernetes.io/name: dcgm-exporter
endpoints:
- port: metrics
interval: 30s
应用后到Prometheus的Status > Targets页面,应该能看到dcgm-exporter的target状态为UP。
高频报错与避坑说明
Pod一直Pending:多半是节点选择器或污点没处理。
GPU节点常带nvidia.com/gpu污点,DaemonSet需要对应的toleration,否则调度不上去。
指标里只有部分GPU:检查节点是否混插了不同代际的卡,或驱动版本不一致。
DCGM对驱动版本有最低要求,版本过低会漏采部分字段。
重启后指标消失:
DaemonSet不会自动恢复被删除的采集容器,
确认你的部署方式带上了restartPolicy:(DaemonSet默认行为,
Always
但自定义Pod模板时容易漏)。
显存指标和nvidia-smi对不上:DCGM采集有间隔,默认约1秒到30秒不等,瞬时峰值可能采不到。
对账时用同一时间窗口比较,不要拿单点值硬对。
怎么看结果才算验证通过
在Prometheus查询框里先查DCGM_FI_DEV_GPU_UTIL,能看到每张卡一条时间序列,值为百分比。
再查DCGM_FI_DEV_FB_USED(显存已用,单位MB),跟nvidia-smi输出对比,误差在采集间隔内属正常。
Grafana可以直接导入NVIDIA提供的DCGM Dashboard(ID以官方仓库当前提供的为准),导入后能看到利用率、显存、温度、功耗四类曲线。
如果曲线全是断点,回到Targets页面看抓取是否稳定,通常是网络策略或端口没放通。
常见疑问
必须用DCGM Exporter吗,能不能自己写脚本采集?
可以,但DCGM覆盖的字段更全,且由NVIDIA维护,省去自己解析nvidia-smi的兼容成本。自建脚本适合字段需求极少的场景。
一个Exporter能采集多节点吗?
不能。DCGM Exporter是DaemonSet,每个GPU节点跑一个实例,各自暴露本机指标,Prometheus按节点分别抓取。
指标保留多久合适?
由Prometheus的retention决定,跟Exporter无关。算力趋势分析一般保留15到30天,具体看存储容量。
没装Prometheus Operator怎么办?
在prometheus.yml的scrape_configs里加一段静态配置,target写各节点IP加9400端口,效果一样。
监控搭好后,GPU算力就有了可查、可对比的数据。
这套流程本身不涉及调度和配额,属于纯观测层,风险低,适合先在测试节点跑一遍再推到生产。