刚拿到一台崭新的GPU服务器时,很多开发者会直接跑模型训练,却忽略了监控这个关键环节。上周我就遇到个真实案例:同事的深度学习任务突然中断,排查半天才发现是GPU显存泄漏导致。如果有完善的监控体系,这种问题10分钟就能预警。
GPU监控能帮你捕捉三类关键指标:
传统监控工具如Zabbix对GPU支持有限,而Prometheus+nvidia_gpu_exporter的组合就像给服务器装了"心电图仪",不仅能实时采集数据,还能通过Grafana生成直观的驾驶舱视图。这套方案特别适合:
在安装监控组件前,先确保基础环境正常。连上服务器执行:
bash复制# 检查NVIDIA驱动版本
nvidia-smi -L
正常应该看到类似输出:
code复制GPU 0: NVIDIA H100 80GB HBM3 (UUID: GPU-xxxx)
如果报错NVIDIA-SMI has failed,可能是:
modprobe nvidia推荐使用Ubuntu 22.04 LTS系统,对NVIDIA生态支持最好。关键组件版本要求:
| 组件 | 最低版本 | 推荐版本 |
|---|---|---|
| NVIDIA驱动 | 470.x | 550.x |
| CUDA Toolkit | 11.4 | 12.2 |
| Prometheus | 2.30 | 2.53 |
| nvidia_gpu_exporter | 1.2.0 | 1.3.2 |
安装基础依赖包:
bash复制sudo apt update
sudo apt install -y wget curl tar gcc make
对于生产环境,我推荐直接下载预编译的deb/rpm包:
bash复制# 创建专用目录
mkdir -p /opt/monitoring && cd /opt/monitoring
# 下载deb包(以v1.3.2为例)
wget https://github.com/utkuozdemir/nvidia_gpu_exporter/releases/download/v1.3.2/nvidia-gpu-exporter_1.3.2_linux_amd64.deb
# 安装并启动服务
sudo dpkg -i nvidia-gpu-exporter_*.deb
sudo systemctl enable --now nvidia_gpu_exporter
验证服务状态:
bash复制curl -s http://localhost:9835/metrics | head -5
正常会返回类似:
code复制# HELP nvidia_smi_gpu_utilization GPU utilization percentage
# TYPE nvidia_smi_gpu_utilization gauge
nvidia_smi_gpu_utilization{gpu="0"} 23
如果你的环境已容器化,可以用更轻量的Docker方式:
bash复制docker run -d \
--name nvidia_exporter \
--runtime=nvidia \
-p 9835:9835 \
utkuozdemir/nvidia_gpu_exporter:1.3.2
记得添加--gpus all参数确保容器能访问GPU设备。
编辑Prometheus的配置文件/etc/prometheus/prometheus.yml,添加以下job:
yaml复制scrape_configs:
- job_name: 'gpu_metrics'
scrape_interval: 15s
static_configs:
- targets: ['localhost:9835']
labels:
device_type: 'h100'
location: 'rack_A'
几个实用技巧:
scrape_timeout控制采集超时(默认10s)metric_relabel_configs过滤不必要指标无需重启服务,用API触发配置重载:
bash复制curl -X POST http://localhost:9090/-/reload
检查采集状态:
nvidia_smi_开头的指标名验证常见问题排查:
推荐使用ID为14574的社区模板:
我优化后的配置包括:
有些关键指标需要二次计算,比如显存使用率:
code复制100 * (
nvidia_smi_memory_used_bytes{gpu="0"}
/
nvidia_smi_memory_total_bytes{gpu="0"}
)
在Grafana中配置Variables实现多GPU切换:
yaml复制# dashboard变量定义
variables:
- name: gpu_instance
query: label_values(nvidia_smi_gpu_utilization, gpu)
refresh: time_range
当服务器有8块GPU时,建议:
group_left关联PCIe拓扑信息示例配置:
yaml复制- targets: ['10.0.1.1:9835']
labels:
gpu_index: '0'
pcie_slot: '0'
原始Prometheus默认保存15天数据,对于训练任务分析建议:
案例1:突然丢失所有指标
dmesg | grep NVRM案例2:指标延迟严重
scrape_interval为30s在管理20+节点的GPU集群后,我总结出这些经验:
gpu_model、node_role等标签完整的systemd服务配置示例:
ini复制[Unit]
Description=NVIDIA GPU Exporter
After=network.target
[Service]
User=prometheus
Group=prometheus
ExecStart=/usr/bin/nvidia_gpu_exporter \
--web.listen-address=:9835 \
--collector.metrics-file=/etc/nvidia_metrics.yaml
Restart=always
[Install]
WantedBy=multi-user.target
监控配置应该像代码一样管理,建议采用GitOps工作流: