一、本文用通用的「Prometheus+Grafana+DCGM对GPU集群进行监控
前置条件
- 集群节点:所有 GPU 节点需安装 NVIDIA 驱动(418.x 以上)、Docker(可选,简化部署)。
- 网络:所有节点网络互通,监控节点(部署 Prometheus/Grafana)能访问其他 GPU 节点的 9400 端口(DCGM 暴露端口)、9100 端口(Node Exporter 暴露端口)。
步骤 1:部署 NVIDIA DCGM-Exporter(采集 GPU 指标)
DCGM(Data Center GPU Manager)是 NVIDIA 官方工具,dcgm-exporter 负责将 GPU 指标转换为 Prometheus 可识别的格式,是 GPU 监控的核心采集组件。
方式 1:Docker 部署(推荐,无需配置依赖)
# 在每个GPU节点执行(启动dcgm-exporter容器)
docker run -d \
--gpus all \ # 挂载所有GPU
--net="host" \ # 使用主机网络,避免端口映射问题
--pid="host" \
-v /etc/localtime:/etc/localtime:ro \ # 同步时间
nvidia/dcgm-exporter:3.3.5 # 推荐稳定版本
# 验证是否成功:访问 http://节点IP:9400/metrics,能看到GPU指标(如dcgm_gpu_utilization)
curl http://localhost:9400/metrics
方式 2:二进制部署(无 Docker 场景)
# 1. 安装DCGM
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-keyring_1.1-1_all.deb
dpkg -i cuda-keyring_1.1-1_all.deb
apt update && apt install -y datacenter-gpu-manager
# 2. 安装dcgm-exporter
apt install -y dcgm-exporter
# 3. 启动服务并设置开机自启
systemctl start dcgm-exporter
systemctl enable dcgm-exporter
# 验证:同Docker方式,访问9400端口
步骤 2:部署 Node Exporter(采集节点系统指标)
采集 CPU、内存、磁盘、网络等节点基础指标,与 GPU 指标联动分析(如 "GPU 利用率低但 CPU 满了" 可能是计算瓶颈在 CPU)。
Docker 部署(所有节点执行)
docker run -d \
--name node-exporter \
--net="host" \
--pid="host" \
-v "/:/host:ro,rslave" \
prom/node-exporter:v1.6.0 \
--path.rootfs=/host \
--collector.processes # 可选:采集进程详情(如每个PID占用的资源)
# 验证:访问 http://节点IP:9100/metrics,能看到node_cpu_usage等指标
curl http://localhost:9100/metrics
步骤 3:部署 Prometheus(存储 + 拉取指标)
Prometheus 是时序数据库,负责从所有节点的 DCGM-Exporter 和 Node Exporter 拉取指标并存储,部署在「监控节点」(建议单独一台服务器,避免占用 GPU 资源)。
1. 编写配置文件 prometheus.yml
global:
scrape_interval: 15s # 每15秒拉取一次指标(可根据需求调整)
scrape_configs:
# 1. 监控Prometheus自身
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 2. 监控GPU节点(DCGM-Exporter)
- job_name: 'gpu-cluster'
static_configs:
- targets: [
'192.168.1.10:9400', # 节点1的DCGM端口
'192.168.1.11:9400', # 节点2的DCGM端口
'192.168.1.12:9400' # 节点3的DCGM端口(按实际节点IP添加)
]
# 3. 监控节点系统指标(Node Exporter)
- job_name: 'node-cluster'
static_configs:
- targets: [
'192.168.1.10:9100',
'192.168.1.11:9100',
'192.168.1.12:9100'
]
-
Docker 部署 Prometheus
挂载配置文件和数据目录(持久化存储指标)
docker run -d
--name prometheus
--net="host"
-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \ # 映射配置文件
-v prometheus-data:/prometheus \ # 持久化数据
prom/prometheus:v2.45.0
--config.file=/etc/prometheus/prometheus.yml
--storage.tsdb.retention.time=30d # 指标保留30天(按需调整)验证:访问 http://监控节点IP:9090,进入Prometheus UI,查询dcgm_gpu_utilization能看到GPU利用率
步骤 4:部署 Grafana(可视化监控面板)
Grafana 是开源可视化工具,通过配置 Prometheus 数据源,快速生成 GPU 集群监控大屏(支持自定义面板、告警配置)。
1. Docker 部署 Grafana
docker run -d \
--name grafana \
--net="host" \
-v grafana-data:/var/lib/grafana \ # 持久化面板配置
-e GF_SECURITY_ADMIN_PASSWORD="your_password" \ # 管理员密码
grafana/grafana:10.1.0
# 访问Grafana:http://监控节点IP:3000,用户名admin,密码为上面设置的your_password
2. 配置 Prometheus 数据源
- 登录 Grafana → 左侧「Configuration」→「Data Sources」→「Add data source」→ 选择「Prometheus」。
- 在「URL」中输入
http://监控节点IP:9090(Prometheus 地址),其他默认,点击「Save & Test」,显示「Data source is working」即成功。
3. 导入 GPU 监控面板(无需从零设计)
Grafana 社区有现成的 NVIDIA GPU 监控面板,直接导入即可:
- 左侧「Dashboards」→「Import」→ 输入面板 ID
12239(NVIDIA DCGM 官方面板,支持多 GPU、多节点监控)→ 点击「Load」。 - 选择之前配置的 Prometheus 数据源 → 点击「Import」,即可看到完整的 GPU 监控大屏(包含算力、显存、温度、节点状态等)
自定义面板(可选)
如果需要添加业务指标(如训练任务进度、模型名称),可在 Grafana 中添加「新面板」,使用 PromQL 查询:
- GPU 算力利用率:
avg(dcgm_gpu_utilization{job="gpu-cluster"}) by (instance) - 节点内存占用:
100 - (avg(node_memory_available_bytes{job="node-cluster"}) by (instance) / avg(node_memory_total_bytes{job="node-cluster"}) by (instance) * 100) - 单个 GPU 显存占用:
dcgm_gpu_memory_used_bytes{job="gpu-cluster",gpu="0"} / dcgm_gpu_memory_total_bytes{job="gpu-cluster",gpu="0"} * 100
步骤 5:部署 Alertmanager(告警通知,可选)
当 GPU 温度过高、显存溢出或节点离线时,自动发送告警(邮件、钉钉、企业微信),部署在监控节点。
1. 编写 Alertmanager 配置文件 alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h # 重复告警间隔
receiver: 'dingtalk' # 默认告警接收者
receivers:
- name: 'dingtalk'
webhook_configs:
- url: 'http://dingtalk-webhook-url' # 钉钉机器人webhook地址(需提前创建)
send_resolved: true # 故障恢复时发送通知
# 定义告警规则
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093 # Alertmanager地址
# 在Prometheus中添加告警规则(修改prometheus.yml)
rule_files:
- "alert_rules.yml"
2. 编写告警规则 alert_rules.yml
groups:
- name: gpu_alerts
rules:
# GPU温度>85℃告警
- alert: GPUHighTemperature
expr: dcgm_gpu_temp_celsius > 85
for: 5m # 持续5分钟触发告警
labels:
severity: warning
annotations:
summary: "GPU温度过高"
description: "节点 {{ $labels.instance }} 的GPU {{ $labels.gpu }} 温度为 {{ $value }}℃,超过85℃阈值"
# GPU显存占用>95%告警
- alert: GPUHighMemoryUsage
expr: dcgm_gpu_memory_used_bytes / dcgm_gpu_memory_total_bytes > 0.95
for: 3m
labels:
severity: critical
annotations:
summary: "GPU显存占用过高"
description: "节点 {{ $labels.instance }} 的GPU {{ $labels.gpu }} 显存占用率为 {{ $value | humanizePercentage }},超过95%阈值"
# 节点离线告警(Node Exporter无数据)
- alert: NodeDown
expr: up{job="node-cluster"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "节点离线"
description: "节点 {{ $labels.instance }} 已离线,无法采集指标"
3. Docker 部署 Alertmanager
docker run -d \
--name alertmanager \
--net="host" \
-v /path/to/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
-v /path/to/alert_rules.yml:/etc/prometheus/alert_rules.yml \
prom/alertmanager:v0.26.0
# 重启Prometheus加载告警规则
docker restart prometheus
四、企业级扩展方案(大型集群适配)
如果集群规模超过 50 节点,或需要高可用、多集群统一管理,可在基础方案上扩展:
1. 容器化部署(Kubernetes)
- 用 K8s 的 DaemonSet 部署 DCGM-Exporter 和 Node Exporter,自动在所有 GPU 节点启动,无需手动逐个部署。
- 用 StatefulSet 部署 Prometheus/Grafana,配合 PersistentVolume 实现数据持久化,支持主从备份(高可用)。
- 插件推荐:
nvidia-gpu-operator(自动部署 DCGM、监控指标采集,适配 K8s 集群)。
2. 指标增强:添加分布式训练监控
- 监控多卡通信:部署
nvlink-exporter采集 NVLink 带宽、延迟指标(适配 NVIDIA GPU 集群)。 - 监控训练任务:集成
MLflow或Weights & Biases,将 GPU 指标与训练进度(loss、epoch)关联,定位训练效率瓶颈。
3. 多集群统一监控
- 用 Prometheus 联邦集群:每个子集群部署 Prometheus(采集本地指标),主集群 Prometheus 拉取所有子集群的指标,实现统一可视化。
- 商业工具替代:使用 Datadog、New Relic 或阿里云 ARMS,支持自动发现 GPU 节点、预置监控模板、多维度告警,无需手动配置(适合无运维团队的企业)。
五、关键优化与注意事项
- 性能优化 :
- 调整 Prometheus 拉取间隔(大型集群可设为 30s,减少网络压力)。
- 开启 Prometheus 指标压缩(如启用 Snappy 压缩),降低存储占用。
- 权限控制 :
- Grafana 配置用户角色(如只读用户、管理员),避免误操作面板。
- 限制 Prometheus/DCGM 端口访问(仅允许监控节点和管理员 IP 访问)。
- 故障排查 :
- 若 Grafana 看不到 GPU 指标:检查 Prometheus 是否能访问节点 9400 端口(
telnet 节点IP 9400),DCGM-Exporter 是否正常运行(docker logs dcgm-exporter)。 - 若指标缺失:确认 NVIDIA 驱动版本是否兼容 DCGM(需 418.x 以上),执行
nvidia-smi验证 GPU 是否正常识别。
- 若 Grafana 看不到 GPU 指标:检查 Prometheus 是否能访问节点 9400 端口(
六、常用工具汇总
| 组件 | 作用 | 核心优势 |
|---|---|---|
| NVIDIA DCGM-Exporter | 采集 GPU 硬件指标 | 官方工具,指标全面、兼容性强 |
| Node Exporter | 采集节点系统指标(CPU / 内存 / 网络) | 轻量、开源、适配所有 Linux 节点 |
| Prometheus | 存储时序指标、执行告警规则 | 高吞吐、支持 PromQL 查询 |
| Grafana | 可视化监控面板、配置告警 | 开源免费、面板丰富、操作简单 |
| Alertmanager | 告警分发(邮件 / 钉钉) | 支持多接收者、故障恢复通知 |
| nvidia-gpu-operator | K8s 集群 GPU 监控自动化部署 | 自动适配 K8s、减少手动配置 |
通过以上方案,可实现 GPU 集群的全链路监控,从硬件状态到任务运行,再到异常告警,覆盖研发和生产场景的核心需求。中小型集群优先选择基础方案(Docker 部署),快速落地;大型集群可迁移到 K8s 或使用商业工具,提升可扩展性和稳定性。