中型 GPU 集群(10-50 节点)的监控核心需求是 "稳定采集 + 联动分析 + 精准告警 + 弹性扩展",需兼顾 "轻量部署" 与 "企业级能力"(如自动发现节点、负载隔离、多维度告警)。以下方案基于「Prometheus+Grafana+DCGM」生态优化,补充节点自动发现、分布式训练监控、告警分级等中型集群必备功能,附部署细节和最佳实践:
一、方案架构总览(核心组件分工)
[GPU节点层]:DCGM-Exporter(GPU指标)+ Node Exporter(系统指标)+ NVLink-Exporter(多卡通信)
↓
[中间件层]:Consul(服务发现)+ Prometheus(存储查询)+ Alertmanager(告警分发)
↓
[可视化/告警层]:Grafana(统一面板)+ 钉钉/企业微信/邮件(多渠道告警)
核心优化点(适配中型集群)
- 服务自动发现:用 Consul 替代静态配置,新增 GPU 节点自动注册到监控,无需手动修改 Prometheus 配置;
- 分布式训练监控:新增 NVLink-Exporter,监控多卡通信带宽 / 延迟,定位分布式训练瓶颈;
- 告警分级:按严重程度划分告警级别(Critical/Warning/Info),适配不同故障响应流程;
- 监控高可用:Prometheus 主从备份,避免监控节点单点故障;
- 资源隔离:Grafana 多租户权限,不同团队仅能查看所属 GPU 节点监控
二、前置条件
- 集群环境:所有 GPU 节点统一操作系统(推荐 Ubuntu 20.04/CentOS 7),安装 NVIDIA 驱动(470.x+,兼容 DCGM 3.x);
- 网络要求:
- 监控节点(推荐 2 台,主从备份)能访问所有 GPU 节点的 9400(DCGM)、9100(Node Exporter)、9401(NVLink)端口;
- 所有节点能访问 Consul 节点的 8500 端口(服务注册);
- 依赖工具:Docker(容器化部署)、Docker Compose(简化多组件启动)。
三、分步部署(重点优化中型集群核心需求)
步骤 1:部署 Consul(服务自动发现,必备)
中型集群节点较多,手动维护静态配置易出错,用 Consul 实现节点自动注册 / 注销。
1.1 单节点 Consul 部署(测试 / 小型中型集群)
docker run -d \
--name consul \
--net=host \
-v consul-data:/consul/data \
consul:1.15.4 agent -server -bootstrap-expect=1 -client=0.0.0.0 -ui
- 访问
http://Consul节点IP:8500,进入 Consul UI,后续 GPU 节点会自动注册到这里。
1.2 所有 GPU 节点注册服务(自动接入监控)
在每个 GPU 节点执行以下脚本,将 DCGM-Exporter、Node Exporter 注册到 Consul:
# 编写服务注册脚本 register_consul.sh
cat > register_consul.sh << EOF
#!/bin/bash
NODE_IP=\$(hostname -I | awk '{print \$1}') # 获取节点IP
# 注册DCGM-Exporter服务
curl -X PUT http://Consul节点IP:8500/v1/agent/service/register -H "Content-Type: application/json" -d '{
"ID": "dcgm-\$NODE_IP",
"Name": "dcgm-exporter",
"Address": "\$NODE_IP",
"Port": 9400,
"Tags": ["gpu", "metrics"],
"Check": {
"HTTP": "http://\$NODE_IP:9400/metrics",
"Interval": "10s",
"Timeout": "5s"
}
}'
# 注册Node Exporter服务
curl -X PUT http://Consul节点IP:8500/v1/agent/service/register -H "Content-Type: application/json" -d '{
"ID": "node-\$NODE_IP",
"Name": "node-exporter",
"Address": "\$NODE_IP",
"Port": 9100,
"Tags": ["system", "metrics"],
"Check": {
"HTTP": "http://\$NODE_IP:9100/metrics",
"Interval": "10s",
"Timeout": "5s"
}
}'
EOF
# 执行脚本(需安装curl)
chmod +x register_consul.sh && ./register_consul.sh
- 验证:Consul UI → Services,能看到所有节点的
dcgm-exporter和node-exporter服务(健康状态为绿色)。
步骤 2:GPU 节点部署采集组件(DCGM+Node+NVLink)
2.1 部署 DCGM-Exporter(GPU 核心指标)
docker run -d \
--name dcgm-exporter \
--gpus all \
--net=host \
-v /etc/localtime:/etc/localtime:ro \
nvidia/dcgm-exporter:3.3.5
2.2 部署 Node Exporter(系统指标)
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 \
--collector.netstat # 新增:采集网络连接状态(适配分布式训练网络监控)
2.3 部署 NVLink-Exporter(多卡通信指标,可选但推荐)
中型集群常用于分布式训练,NVLink 带宽 / 延迟是核心监控指标:
# 拉取NVLink-Exporter镜像(开源社区版本)
docker run -d \
--name nvlink-exporter \
--net=host \
--gpus all \
-v /etc/localtime:/etc/localtime:ro \
evansde77/nvlink-exporter:latest # 暴露9401端口
# 验证:访问 http://节点IP:9401/metrics,能看到nvlink_bandwidth_usage指标
curl http://localhost:9401/metrics | grep nvlink
- 注册到 Consul:参考步骤 1.2,新增 NVLink-Exporter 服务注册(端口 9401,Name 设为
nvlink-exporter)。
步骤 3:监控节点部署 Prometheus(主从高可用)
3.1 编写 Prometheus 配置文件(支持 Consul 自动发现)
# prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
# 服务发现配置(从Consul拉取所有GPU节点服务)
scrape_configs:
# 1. GPU指标(DCGM-Exporter)
- job_name: 'gpu-cluster'
consul_sd_configs:
- server: 'Consul节点IP:8500'
services: ['dcgm-exporter'] # 仅拉取dcgm-exporter服务
relabel_configs:
- source_labels: [__meta_consul_address]
target_label: instance # 将Consul注册的节点IP作为instance标签
# 2. 系统指标(Node Exporter)
- job_name: 'node-cluster'
consul_sd_configs:
- server: 'Consul节点IP:8500'
services: ['node-exporter']
relabel_configs:
- source_labels: [__meta_consul_address]
target_label: instance
# 3. NVLink通信指标(可选)
- job_name: 'nvlink-cluster'
consul_sd_configs:
- server: 'Consul节点IP:8500'
services: ['nvlink-exporter']
relabel_configs:
- source_labels: [__meta_consul_address]
target_label: instance
# 告警配置
alerting:
alertmanagers:
- static_configs:
- targets: ['监控节点IP:9093'] # Alertmanager地址
rule_files:
- "alert_rules.yml" # 告警规则文件
3.2 编写中型集群专属告警规则(alert_rules.yml)
针对中型集群的分布式训练、多节点管理场景,优化告警规则:
groups:
- name: gpu_cluster_alerts
rules:
# 1. 严重告警(Critical:立即处理)
- alert: GPU显存溢出
expr: dcgm_gpu_memory_used_bytes / dcgm_gpu_memory_total_bytes > 0.95
for: 3m
labels:
severity: critical
annotations:
summary: "GPU {{ $labels.gpu }} 显存占用过高"
description: "节点 {{ $labels.instance }} 的GPU {{ $labels.gpu }} 占用率:{{ $value | humanizePercentage }}(阈值95%),可能导致训练任务中断"
- alert: 节点离线
expr: up{job=~"gpu-cluster|node-cluster"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "节点 {{ $labels.instance }} 离线"
description: "节点 {{ $labels.instance }} 的 {{ $labels.job }} 服务无响应,影响集群算力"
- alert: NVLink通信异常
expr: nvlink_bandwidth_usage < 10 # 带宽低于10GB/s(按需调整)
for: 5m
labels:
severity: critical
annotations:
summary: "节点 {{ $labels.instance }} NVLink通信异常"
description: "NVLink带宽仅 {{ $value }} GB/s,可能导致分布式训练梯度同步缓慢"
# 2. 警告告警(Warning:关注)
- alert: GPU温度过高
expr: dcgm_gpu_temp_celsius > 85
for: 5m
labels:
severity: warning
annotations:
summary: "GPU {{ $labels.gpu }} 温度过高"
description: "节点 {{ $labels.instance }} 的GPU {{ $labels.gpu }} 温度:{{ $value }}℃(阈值85℃),长期高负载可能损坏硬件"
- alert: 节点CPU满负载
expr: avg(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance) > 0.85
for: 10m
labels:
severity: warning
annotations:
summary: "节点 {{ $labels.instance }} CPU满负载"
description: "CPU利用率:{{ $value | humanizePercentage }}(阈值85%),可能导致训练任务调度延迟"
# 3. 信息告警(Info:统计)
- alert: GPU长期低负载
expr: dcgm_gpu_utilization < 10
for: 30m
labels:
severity: info
annotations:
summary: "GPU {{ $labels.gpu }} 长期低负载"
description: "节点 {{ $labels.instance }} 的GPU {{ $labels.gpu }} 利用率仅 {{ $value }}%,算力资源浪费"
3.3 启动 Prometheus 主从节点(高可用)
# 主节点启动(监控节点1)
docker run -d \
--name prometheus-master \
--net=host \
-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /path/to/alert_rules.yml:/etc/prometheus/alert_rules.yml \
-v prometheus-master-data:/prometheus \
prom/prometheus:v2.45.0 \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.retention.time=30d \
--web.enable-lifecycle # 支持热加载配置
# 从节点启动(监控节点2,仅同步数据,不执行告警)
docker run -d \
--name prometheus-slave \
--net=host \
-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
-v prometheus-slave-data:/prometheus \
prom/prometheus:v2.45.0 \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.retention.time=30d \
--web.enable-lifecycle \
--storage.tsdb.remote.write="http://prometheus-master-IP:9090/api/v1/write" # 同步数据到主节点
- 验证:访问
http://主节点IP:9090,「Status」→「Targets」,所有节点状态为「UP」。
步骤 4:部署 Alertmanager(分级告警 + 多渠道分发)
4.1 编写 Alertmanager 配置文件(支持分级告警)
# alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'instance', 'severity']
group_wait: 10s
group_interval: 5m
repeat_interval:
critical: 15m # Critical告警15分钟重复一次
warning: 30m # Warning告警30分钟重复一次
info: 2h # Info告警2小时重复一次
receiver: 'default-receiver'
# 告警路由匹配:不同级别发送到不同渠道
routes:
- match:
severity: critical
receiver: 'dingtalk-critical' # Critical告警发送到核心钉钉群
- match:
severity: warning
receiver: 'dingtalk-warning' # Warning告警发送到普通运维群
- match:
severity: info
receiver: 'email-info' # Info告警仅发送邮件统计
receivers:
# 1. Critical告警:钉钉核心群
- name: 'dingtalk-critical'
webhook_configs:
- url: 'https://oapi.dingtalk.com/robot/send?access_token=核心群Token'
send_resolved: true
email_configs:
- to: 'admin@company.com' # 同时抄送管理员邮箱
from: 'alertmanager@company.com'
smarthost: 'smtp.company.com:25'
auth_username: 'alertmanager@company.com'
auth_password: 'smtp-password'
# 2. Warning告警:钉钉运维群
- name: 'dingtalk-warning'
webhook_configs:
- url: 'https://oapi.dingtalk.com/robot/send?access_token=运维群Token'
send_resolved: true
# 3. Info告警:仅邮件
- name: 'email-info'
email_configs:
- to: 'ops@company.com'
from: 'alertmanager@company.com'
smarthost: 'smtp.company.com:25'
auth_username: 'alertmanager@company.com'
auth_password: 'smtp-password'
templates:
- '/etc/alertmanager/templates/dingtalk.tmpl' # 复用之前的钉钉模板
4.2 启动 Alertmanager
docker run -d \
--name alertmanager \
--net=host \
-v /path/to/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
-v /path/to/dingtalk.tmpl:/etc/alertmanager/templates/dingtalk.tmpl \
prom/alertmanager:v0.26.0
步骤 5:Grafana 可视化(多面板 + 多租户)
5.1 启动 Grafana 并配置高可用
docker run -d \
--name grafana \
--net=host \
-v grafana-data:/var/lib/grafana \
-v /etc/localtime:/etc/localtime:ro \
-e GF_SECURITY_ADMIN_PASSWORD="your_password" \
-e GF_USERS_ALLOW_SIGN_UP=false # 禁用注册,仅管理员创建用户
grafana/grafana:10.1.0
5.2 导入中型集群专属监控面板
- 基础 GPU 面板:导入 ID
12239(DCGM 官方面板,覆盖 GPU 核心指标); - 分布式训练面板:导入 ID
18616(包含 NVLink 带宽、节点网络、CPU / 内存联动指标); - 集群概览面板:导入 ID
14694(多节点状态汇总,支持按节点 / GPU 筛选)。
5.3 配置多租户权限(中型集群必备)
- 左侧「Server Admin」→「Users」:创建不同团队的用户(如 "算法团队 A""算法团队 B");
- 左侧「Configuration」→「Data Sources」:为每个用户配置 "数据源权限",仅允许查看所属节点的指标(通过 PromQL 标签过滤:
instance=~"192.168.1.10|192.168.1.11"); - 左侧「Dashboards」→「Manage」:为面板设置 "查看权限",避免跨团队数据泄露。
四、中型集群监控最佳实践
1. 性能优化(避免监控占用集群资源)
- Prometheus 配置优化:
- 调整拉取间隔:非核心指标(如风扇转速)设为 30s,核心指标(算力 / 显存)保持 15s;
- 启用指标压缩:启动时添加
--storage.tsdb.compaction.enabled=true,降低存储占用; - 分片存储:若集群超 30 节点,将 Prometheus 数据按节点分片(如按 IP 段拆分 Job)。
- 采集组件优化:
- Node Exporter 禁用无用采集器(如
--no-collector.hwmon),仅保留 CPU / 内存 / 网络 / 进程; - DCGM-Exporter 按需采集指标:通过
-e DCGM_EXPORTER_COLLECTORS=utilization,temperature,memory指定核心指标,减少数据传输量。
- Node Exporter 禁用无用采集器(如
2. 故障排查流程(基于监控指标)
| 故障现象 | 关联监控指标 | 排查方向 |
|---|---|---|
| 分布式训练速度慢 | NVLink 带宽低、节点网络延迟高(node_network_transmit_delay) | 检查 NVLink 连接、集群网络拓扑 |
| 任务频繁 OOM | GPU 显存占用率 > 95%、节点内存占用 > 90% | 优化模型批量大小、清理僵尸进程 |
| 部分 GPU 利用率为 0 | dcgm_gpu_utilization=0、进程指标无对应 PID | 任务调度失败、GPU 驱动异常 |
| 节点温度持续升高 | GPU 温度 > 85℃、风扇转速低(dcgm_gpu_fan_speed) | 机房散热不足、GPU 风扇故障 |
3. 扩展方向(集群扩容至 50 + 节点)
- 监控架构升级:从 "单 Prometheus" 改为 "Prometheus 联邦集群"(子 Prometheus 按机房 / 机架划分,主 Prometheus 汇总数据);
- 日志监控集成:添加 Loki+Promtail,采集 GPU 节点日志(如 nvidia-smi 日志、训练任务日志),实现 "指标 + 日志" 联动排查;
- 告警升级:集成 PagerDuty/OnCall,支持电话 / 短信告警(Critical 级故障)。
五、核心组件版本推荐(稳定优先)
| 组件 | 推荐版本 | 核心原因 |
|---|---|---|
| DCGM-Exporter | 3.3.5 | 兼容 NVIDIA 驱动 470.x+,指标稳定 |
| Node Exporter | v1.6.0 | 支持进程详情采集,兼容性好 |
| Prometheus | v2.45.0 | 支持 Consul 服务发现,稳定性高 |
| Alertmanager | v0.26.0 | 支持告警分级,多渠道分发 |
| Grafana | v10.1.0 | 面板编辑体验优化,多租户权限完善 |
| Consul | v1.15.4 | 服务注册稳定,UI 操作便捷 |
该方案已适配 10-50 节点 GPU 集群的核心需求,既保证 "轻量部署、快速落地",又具备 "自动发现、高可用、分级告警" 等企业级能力,可直接用于 AI 训练、推理服务等中型 GPU 集群场景。若需对接 Kubernetes 集群(容器化部署 GPU 服务),可替换 Consul 为 K8s ServiceDiscovery,其余组件部署逻辑保持一致。