Docker 环境下 GPU 监控实战:使用 Prometheus 实现 DCGM Exporter 部署与 GPU 性能监控
文章目录
本文介绍了如何在 Docker 环境下,通过 Prometheus 和 DCGM Exporter 实现对 GPU 资源的监控。文章首先展示了如何使用
nvidia-smi
查看 GPU 信息,并提供了通过 Docker run 和 Docker Compose 部署 DCGM Exporter 的详细步骤。接着,文章还解决了部署过程中可能遇到的 NVML 初始化错误,指导用户安装 NVIDIA 容器工具包,确保 GPU 监控顺利进行。最后,用户可以通过 Prometheus 配置抓取 GPU 性能指标数据,并通过访问
metrics
页面验证系统是否成功运行,帮助开发者和运维人员实现对 GPU 资源的高效监控和管理。
预备课:
Docker 部署 Prometheus+Grafana 监控系统快速指南
Docker Compose 部署大模型GPU集群:高效分配与管理算力资源
一 查看当前 GPU 信息
nvidia-smi
当前GPU信息
二 dcgm-exporter 部署
1)Docker run 运行
$ DCGM_EXPORTER_VERSION=2.1.4-2.3.1 && \
docker run -d --rm \
--gpus all \
--net host \
--cap-add SYS_ADMIN \
nvcr.io/nvidia/k8s/dcgm-exporter:${DCGM_EXPORTER_VERSION}-ubuntu20.04 \
-f /etc/dcgm-exporter/dcp-metrics-included.csv
# 或者
或者
$ sudo docker run -d --gpus all --rm -p 9400:9400 nvidia/dcgm-exporter:3.2.5-3.1.8-ubi8
注:测试时可以用 --rm
,其他情况删除上面的 --rm
。
2)Docker compose 运行
docker-compose.gpu192.yml
version: '3'
services:
dcgm-exporter:
image: nvidia/dcgm-exporter:3.2.5-3.1.8-ubi8
container_name: dcgm-exporter
hostname: dcgm-exporter_192
restart: always
ports:
- "9400:9400"
三 运行时报错
运行上面的 docker compose 报错,如下
dcgm-exporter | Warning #2: dcgm-exporter doesn't have sufficient privileges to expose profiling metrics. To get profiling metrics with dcgm-exporter, use --cap-add SYS_ADMIN
dcgm-exporter | time="2023-10-23T07:55:38Z" level=info msg="Starting dcgm-exporter"
dcgm-exporter | Error: Failed to initialize NVML
dcgm-exporter | time="2023-10-23T07:55:38Z" level=fatal msg="Error starting nv-hostengine: DCGM initialization error"
ERROR
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
解决方案
curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
#
sudo yum install -y nvidia-container-toolkit
#
sudo nvidia-ctk runtime configure --runtime=docker
#
sudo systemctl restart docker
运行,sudo nvidia-ctk runtime configure --runtime=docker
,追加 /etc/docker/daemon.json 的内容
{
"runtimes": {
"nvidia": {
"args": [],
"path": "nvidia-container-runtime"
}
}
}
四 验证测试
访问 URL:http://your-ip:9400/metrics 。
五 配置 prometheus
global:
scrape_interval: 15s # 设置全局默认的抓取周期为15秒,这意味着Prometheus每15秒从配置的目标处拉取数据一次
external_labels:
monitor: gpu-monitor # 给所有从此Prometheus实例抓取的数据添加额外的标签,这里的标签名是"monitor",值是"gpu-monitor"
scrape_configs:
- job_name: 'dcgm-exporter' # 定义一个抓取任务,名称为'dcgm-exporter'
static_configs:
- targets: ['your-ip:9400'] # 指定抓取目标,这里是位于'your-ip'的主机上,端口为9400的服务
属性解释
scrape_interval
定义了Prometheus抓取指标数据的频率。external_labels
用于添加一些额外的、全局的标签到抓取到的数据中,这有助于在多个Prometheus实例中区分数据来源。scrape_configs
部分定义了具体的抓取任务。每个任务可以有不同的目标和配置。job_name
为这个抓取任务命名,可以在Prometheus的查询界面中用于区分不同的任务。static_configs
中的targets
列表指定了具体的抓取目标。这里的地址需要替换成实际的IP地址和端口,通常是运行监控代理的服务器地址。