Grafana×Prometheus×dcgm-exporterでGPUを可視化する最短手順
GPUメトリクスの可視化は、dcgm-exporterで数値化し、Prometheusで保存し、Grafanaで見る、が最短経路である。
この記事のゴール
中級エンジニアが、最小構成の Grafana+Prometheus+dcgm-exporter で NVIDIA GPU のメトリクス(使用率、メモリ、温度、電力、クロックなど)をダッシュボード化できるようにする。
役者と関係性(まずは全体像)
-
NVML: NVIDIAが提供する管理用ライブラリ。
nvidia-smi
の裏側。GPUの利用率や温度などの生データを返す。 - DCGM: Data Center GPU Manager。NVMLを利用して健全性チェックやメトリクス収集を行う基盤。
- dcgm-exporter: DCGMのデータを Prometheus形式の/metrics に変換して公開する小さなHTTPサーバ。履歴は持たない。
- Prometheus: /metricsを定期収集して時系列DBに保存する。
- Grafana: Prometheusにたまった時系列を可視化する。
事前準備(共通)
-
NVIDIAドライバが正常(
nvidia-smi
が通る)。 - Dockerでやる場合のみ NVIDIA Container Toolkit を導入(
--gpus all
が使える状態)。 - ポート衝突がないか確認:Grafana 3000、Prometheus 9090、dcgm-exporter 9400。
最小のdocker-compose構成
いちばん手軽な構成。GrafanaとPrometheusはコンテナ、dcgm-exporterはホストで動かすか、コンテナにするかを選べる。
1) dcgm-exporter をホストで起動する(簡単)
- Ubuntuなら snap 版が手軽。
# DCGMとexporterをまとめて導入
sudo snap install dcgm
# exporterを起動して自動起動化
sudo snap start --enable dcgm.dcgm-exporter
# 動作確認
curl -s http://localhost:9400/metrics | head
2) PrometheusとGrafanaをcomposeで立てる
docker-compose.yml
(抜粋)
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
ports:
- "9090:9090"
extra_hosts:
- host.docker.internal:host-gateway
grafana:
image: grafana/grafana-oss:latest
container_name: grafana
restart: unless-stopped
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
volumes:
grafana_data: {}
prometheus/prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ["localhost:9090"]
# ホストで動く dcgm-exporter を収集
- job_name: nvidia-gpu
static_configs:
- targets: ["host.docker.internal:9400"]
起動と確認
docker compose up -d
xdg-open http://localhost:9090/targets # nvidia-gpu が UP になればOK
3) dcgm-exporter もコンテナにしたい場合
docker-compose.yml
に追記(NVIDIA Container Toolkit必須)
dcgm-exporter:
image: nvidia/dcgm-exporter:latest
container_name: dcgm-exporter
restart: unless-stopped
gpus: all
ports:
- "9400:9400"
この場合、Prometheusのターゲットは dcgm-exporter:9400
に変更する。
Grafana設定の最小手順
- ブラウザで
http://localhost:3000
にアクセス(admin/admin)。 -
Data source に Prometheus を追加(URL:
http://prometheus:9090
もしくはhttp://localhost:9090
)。 - ダッシュボードを作成し、以下のPromQLを貼るだけで主要な可視化は完成。
- GPU使用率(%)
avg by (Hostname, gpu) (DCGM_FI_DEV_GPU_UTIL)
- メモリ使用率(%)
100 * sum by (Hostname, gpu) (DCGM_FI_DEV_FB_USED)
/ sum by (Hostname, gpu) (DCGM_FI_DEV_FB_TOTAL)
- 消費電力(W)
avg by (Hostname, gpu) (DCGM_FI_DEV_POWER_USAGE)
- 温度(℃)
avg by (Hostname, gpu) (DCGM_FI_DEV_GPU_TEMP)
補足: ラベル Hostname
や modelName
は dcgm-exporter が付与する。ダッシュボード変数を作るなら label_values(DCGM_FI_DEV_GPU_UTIL, Hostname)
などを使う。
よくあるハマりどころと対処
No data の典型原因と対策:
-
Prometheusがdcgm-exporterに到達できていない
-
http://localhost:9090/targets
でnvidia-gpu
が UP か確認 - コンテナ→ホスト参照は
extra_hosts: host.docker.internal:host-gateway
-
-
変数のAll値が正規表現でない
- Grafana変数の All value は
.*
にする(node=~"$node"
などが空マッチしないように)
- Grafana変数の All value は
-
ラベル名の不一致
- 例: クエリが
node
を使っているのに実データはHostname
しかない - どちらかに合わせる(Prometheus側でrelabelするか、Grafanaクエリを直す)
- 例: クエリが
コンテナ運用とローカル運用の比較(どちらを選ぶ?)
比較軸 | dcgm-exporterをコンテナ | dcgm-exporterをローカル(ホスト) |
---|---|---|
導入の容易さ | NVIDIA Container Toolkitの設定が必要 | snapやdebで手早い |
権限まわり | gpus: all で安定。ときどきprivileged切り分けが必要 | ドライバ直上で素直に動く |
ポータビリティ | Composeだけで完結。移設が楽 | ホスト依存が増える |
障害切り分け | コンテナ単位でログが追える | systemdやsnapで管理しやすい |
Prometheus設定 | dcgm-exporter:9400 をターゲット | host.docker.internal:9400 をターゲット |
監視設計のヒント(運用で効く小ネタ)
-
保持期間: Prometheusの既定は約15日。長く保持したいなら
--storage.tsdb.retention.time=45d
等で延長。 - ダッシュボードの粒度: ノード別×GPU別で集約し、アプリ別はcAdvisorなどと合わせて相関パネルに。
- アラート例: 温度がしきい値超過、メモリ使用率が90%超過、電力が定格近傍で一定時間継続、など。
まとめ
- dcgm-exporter は DCGM(NVML)の数値を Prometheus形式 に変換して公開する“翻訳係”。
- Prometheus がそれを収集・保存し、Grafana が見やすく表示する。
- 最小構成は、dcgm-exporter(9400) → Prometheus(9090) → Grafana(3000)。
- 運用要件に合わせて、dcgm-exporterを コンテナ か ローカル のどちらで動かすかを選べばよい。