在AI模型部署和推理服务中,精确监控GPU资源利用率是基础设施优化的关键。传统的容器监控工具如cAdvisor和Node-Exporter虽然在CPU、内存、网络I/O方面表现出色,但对于细粒度的、容器级别的GPU使用率监控却显得力不从心。这是因为GPU指标通常需要访问底层的NVIDIA Management Library (NVML),而cAdvisor/Node-Exporter设计上并不直接集成此功能。
本篇文章将介绍如何引入NVIDIA官方推荐的解决方案——DCGM Exporter(Data Center GPU Manager Exporter),并结合Prometheus和Docker Compose,实现对容器级别GPU指标的全面采集和监控。
Contents
1. 为什么cAdvisor和Node-Exporter不够用?
- 缺乏细粒度指标: Node-Exporter主要关注宿主机硬件和OS指标。cAdvisor虽然能报告容器是否分配了GPU(通过设备文件挂载),但无法提供实时的、进程级别的利用率、温度、显存占用等高级指标。
- 依赖NVML/DCGM: 准确的GPU指标(例如SM利用率、PCIe吞吐量)需要通过NVIDIA提供的库(如NVML或DCGM)来获取,这些库不在标准Linux工具链或容器监控工具的范畴内。
2. 核心工具:NVIDIA DCGM Exporter
DCGM Exporter是一个专门为Prometheus设计、用于导出NVIDIA GPU指标的工具。它作为Prometheus的Target运行,能够通过DCGM接口获取GPU的各项状态,并以Prometheus可识别的格式暴露在端口上。
关键优势在于,当它运行在nvidia-container-runtime环境中时,可以获取到进程级别的指标,从而间接关联到是哪个容器在使用资源。
3. 实操步骤:部署监控栈
为了演示,我们将部署一个包含DCGM Exporter、Prometheus和Grafana的最小监控栈。
前提条件
- 宿主机安装了NVIDIA驱动。
- 宿主机安装了Docker,并且配置了nvidia-container-runtime(通常通过安装nvidia-docker2包即可自动配置)。
步骤 3.1: 准备配置文件
创建 prometheus.yml 文件,用于配置Prometheus抓取DCGM Exporter的指标:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 # prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
# Node Exporter (可选,用于宿主机CPU/内存监控)
- job_name: 'node_exporter'
static_configs:
- targets: ['host.docker.internal:9100'] # 假设Node Exporter部署在宿主机上
# DCGM Exporter Job (核心)
- job_name: 'dcgm_exporter'
static_configs:
- targets: ['dcgm-exporter:9400']
步骤 3.2: 部署 Docker Compose Stack
创建 docker-compose.yml 文件来部署服务。
注意: DCGM Exporter必须在nvidia运行时下运行,并且通常需要privileged: true或至少正确挂载设备文件才能访问底层的GPU信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 version: '3.7'
services:
# 1. DCGM Exporter - 负责采集GPU指标
dcgm-exporter:
image: nvidia/dcgm-exporter:3.2.0-cuda12.1
container_name: dcgm-exporter
restart: always
privileged: true
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=all
ports:
- "9400:9400"
# 2. Prometheus - 负责存储和查询指标
prometheus:
image: prom/prometheus:v2.47.0
container_name: prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
command:
- '--config.file=/etc/prometheus/prometheus.yml'
ports:
- "9090:9090"
depends_on:
- dcgm-exporter
# 3. Grafana - 负责可视化
grafana:
image: grafana/grafana:10.1.5
container_name: grafana
ports:
- "3000:3000"
volumes:
prometheus_data:
运行部署:
1 docker-compose up -d
4. 验证与PromQL查询
部署成功后,访问 http://
DCGM Exporter暴露的关键指标(例如,GPU利用率)前缀为 DCGM_FI_。以下是一些常用的查询示例:
| PromQL Query | 描述 |
|---|---|
| DCGM_FI_DEV_GPU_UTIL | GPU SM/核心利用率(百分比) |
| DCGM_FI_DEV_MEM_COPY_UTIL | 显存拷贝引擎利用率(百分比) |
| DCGM_FI_DEV_FB_USED | 显存使用量(字节) |
如何查看特定容器的GPU利用率?
虽然DCGM Exporter直接报告的是设备ID(例如device=0),但如果你的容器是使用runtime: nvidia运行的,DCGM Exporter还会提供进程级别的指标,你可以使用这些指标来关联到宿主机上的具体进程ID(PID)。
对于典型的AI服务部署,如果你想查看0号GPU的平均利用率:
1 avg by (gpu) (DCGM_FI_DEV_GPU_UTIL)
通过配置Grafana,导入针对DCGM指标的预制Dashboard(例如ID 13350),你可以获得更直观的容器级GPU性能视图,帮助你定位高负载的推理服务或训练任务。
汤不热吧