はじめに
GPU を使うアプリケーションの性能監視は、ML/DL/LLM/AI/並列処理において非常に重要です。Instana が最近公開している GPU Observability (Public Preview) 機能を、NVIDIA DCGM Exporter + OpenTelemetry Collector を用いて検証しました。この記事では、Windows11 上の WSL2 に Ubuntu22.04 と Docker を入れた環境で、RTX 4090 GPU のメトリクスを収集し、Instana SaaS/Agent に送信するまでの手順と設定例、注意点をまとめます。
参考
- IBM の公式ドキュメント「GPU Public Preview」機能 (IBM)
- Community Blog: “GPU Observability With Instana” (IBM TechXchange)
- GitHub の dcgm-exporter リポジトリ (GitHub)
環境構成
項目 | 内容 |
---|---|
OS | Windows 11 |
仮想環境 | WSL2 上 Ubuntu 22.04 |
GPU | NVIDIA RTX 4090 |
Docker | 27.1.2 |
dcgm-exporter バージョン | nvidia/dcgm-exporter:4.4.0-4.5.0-ubuntu22.04 |
OpenTelemetry Collector | otel/opentelemetry-collector-contrib:最新 |
手順
以下のステップで検証を行います。
ステップ 1:環境準備
-
Windows にて NVIDIA ドライバを最新にし、「WSL2 + GPU サポート」が有効であることを確認。
-
Windows 上で WSL2 を起動し、Ubuntu 22.04 をセットアップ済み。
-
WSL2 の中で
nvidia-smi
を実行し、GPU(RTX 4090)が見えることを確認。
nvidia-smi
4.Docker が Ubuntu (WSL2) 上で動いており、docker run --gpus all ...
が可能であること。
ステップ 2:dcgm-exporter を起動する
2.1 最新の dcgm-exporter イメージを取得・起動。
docker pull nvidia/dcgm-exporter:4.4.0-4.5.0-ubuntu22.04
2.2 dcgm-exporter docker instanceを起動コマンド例:
ホストネットワークを使う場合
docker run -d --rm \
--gpus all \
--net host \
--cap-add SYS_ADMIN \
--name dcgm-exporter \
nvidia/dcgm-exporter:4.4.0-4.5.0-ubuntu22.04 \
-f /etc/dcgm-exporter/default-counters.csv
ポートを明示的にマッピングする場合
docker run -d --rm \
--gpus all \
--cap-add SYS_ADMIN \
-p 9400:9400 \
nvidia/dcgm-exporter:4.4.0-4.5.0-ubuntu22.04 \
-f /etc/dcgm-exporter/default-counters.csv
ポイント解説
-
--gpus all
: Docker コンテナから GPU にアクセスできるようにするオプション -
--cap-add SYS_ADMIN
: 一部のメトリクス収集や hostengine 動作に必要な管理権限を付与 -
-f default-counters.csv
: 収集するメトリクスの定義ファイルを指定。デフォルトのカウンターで十分な場合はそのままでよいが、Instana 側で追加のメトリクスが必要な場合は CSV をカスタマイズして利用可能。
2.3 確認
curl localhost:9400/metrics | head
===============
# HELP DCGM_FI_DEV_SM_CLOCK SM clock frequency (in MHz).
# TYPE DCGM_FI_DEV_SM_CLOCK gauge
DCGM_FI_DEV_SM_CLOCK{gpu="0",UUID="GPU-2385660b-22f4-a478-0eaa-745e32b5c526",pci_bus_id="00000000:01:00.0",device="nvidia0",modelName="NVIDIA GeForce RTX 4090 Laptop GPU",Hostname="f5b8eb52ca91",DCGM_FI_DRIVER_VERSION="571.96"} 210
# HELP DCGM_FI_DEV_MEM_CLOCK Memory clock frequency (in MHz).
# TYPE DCGM_FI_DEV_MEM_CLOCK gauge
......
DCGM_FI_DEV_...
系のメトリクスが見えれば OK。 (GitHub)
ステップ 3:OpenTelemetry Collector のセットアップ
Collector をコンテナで動かします。以下は設定ファイル例 (otel-dcgm.yaml
)。
receivers:
prometheus/nvidia-dcgm:
config:
scrape_configs:
- job_name: 'nvidia-dcgm'
scrape_interval: 10s
static_configs:
- targets: ["172.17.0.1:9400"] # Docker ブリッジのゲートウェイ
otlp:
protocols:
grpc:
processors:
batch:
resource:
attributes:
- key: service.name
value: nvidia-dcgm
action: insert
- key: INSTANA_PLUGIN
value: dcgm
action: insert
exporters:
otlp:
endpoint: "172.17.0.1:4317" # Host の Instana Agent / OTLP エンドポイント
tls:
insecure: true
service:
pipelines:
metrics:
receivers: [prometheus/nvidia-dcgm]
processors: [batch, resource]
exporters: [otlp]
-
172.17.0.1
は Docker ブリッジネットワークでのホストゲートウェイ。先の検証でこのアドレスがip route
で得られた。 -
4317
ポートは Agent または Instana OTLP 受信設定に応じて変える必要あり。
起動コマンド例:
docker run -d --name otelcol \
-v /home/XXXX/dcgm/otel-dcgm.yaml:/etc/otel/config.yaml \
otel/opentelemetry-collector-contrib:latest \
--config /etc/otel/config.yaml
- 上記の"/home/XXXX/dcgm/otel-dcgm.yaml"は実際のパスに応じて変更してください。
"docker logs otelcol"コマンドでOTELの動作確認:
~/dcgm$ docker logs otelcol
2025-09-18T10:35:36.505Z info service@v0.135.0/service.go:211 Starting otelcol-contrib... {"resource": {"service.instance.id": "16afe6da-9724-425e-8a15-31caeb436165", "service.name": "otelcol-contrib", "service.version": "0.135.0"}, "Version": "0.135.0", "NumCPU": 32}
2025-09-18T10:35:36.506Z info extensions/extensions.go:41 Starting extensions... {"resource": {"service.instance.id": "16afe6da-9724-425e-8a15-31caeb436165", "service.name": "otelcol-contrib", "service.version": "0.135.0"}}
2025-09-18T10:35:36.506Z info prometheusreceiver@v0.135.0/metrics_receiver.go:157 Starting discovery manager {"resource": {"service.instance.id": "16afe6da-9724-425e-8a15-31caeb436165", "service.name": "otelcol-contrib", "service.version": "0.135.0"}, "otelcol.component.id": "prometheus/nvidia-dcgm", "otelcol.component.kind": "receiver", "otelcol.signal": "metrics"}
2025-09-18T10:35:36.506Z info targetallocator/manager.go:210 Scrape job added {"resource": {"service.instance.id": "16afe6da-9724-425e-8a15-31caeb436165", "service.name": "otelcol-contrib", "service.version": "0.135.0"}, "otelcol.component.id": "prometheus/nvidia-dcgm", "otelcol.component.kind": "receiver", "otelcol.signal": "metrics", "jobName": "nvidia-dcgm"}
......
ステップ 4:Instana 側の設定
Instana Agentの設定で以下を確認・設定:
- Instana Agent(もしローカル Agent を使うなら)が OTLP/gRPC を受け入れるよう設定されていること。Instana の設定ファイルで
com.instana.plugin.opentelemetry:
grpc:
enabled: true
http:
enabled: true
Instana SaaS の場合は、SaaS 側の OTLP エンドポイント、TLS 証明書/トークン 認証が必要ならそれも設定。
ステップ 5:検証 & モニタリング
1. GPU に負荷をかける(例えば CUDA プログラムや ML トレーニング、あるいは GPU を使うベンチマーク)
2. nvidia-smi
で GPU 使用率やメモリ使用率が上昇することを確認。
3. curl
で 172.17.0.1:9400/metrics
を Collector コンテナから取得できるか確認。
4. Collector ログを docker logs otelcol -f
で追い、Prometheus レシーバーがスクレイプ成功していることを確認。
5. Instana SaaS UI で GPU メトリクスが届いている/グラフ化できていることを確認。
5.1 Instana SaaS UI でメトリクスを確認する手順
- Instana SaaS UI を開き、分析 をクリック
- 続いて インフラストラクチャー を選択
- エンティティのタイプ一覧から OTEL Dcgm を選択
- OTEL Dcgm エンティティのインスタンスをクリックすると、対応するダッシュボードが開きます
確認できる GPU メトリクス例
Instana UI では以下のような GPU 関連メトリクスを可視化できます。
- GPU 使用率 (Utilization)
- メモリ使用量 / 空き容量
- GPU クロック (SM / メモリ)
- 温度
- 消費電力
- その他 DCGM Exporter が提供するカウンタ群
注意点/ハマりやすいところ
-
targets
を YAML のリスト形式(["IP:ポート"]
)にしないと設定読み込みエラーになる。 -
localhost
を使うと、Collector コンテナの中からは自分自身を指してしまい、Host のサービスには届かない。必ず Docker やホストとの通信経路を明示する IP(例:Docker ブリッジの gateway)を使うこと。 - Instana エンドポイントが TLS/認証ありなら、それぞれ証明書/ヘッダーを設定する必要あり。
- デフォルトのメトリクス収集設定(CSV)に含まれていないカウンターが欲しければ、dcgm-exporter の
-f <csv>
オプションで追加。 (GitHub) - メトリクスのラベルにホスト名などの情報が含まれているかを確認。例えばどの GPU がどのマシンか識別できるようラベルが必要。
- ネットワーク設定(ポート開放、Firewall、Docker ネットワーク設定など)が正しいかを確認。
結果と展望
検証の結果、以下が確認できた:
- dcgm-exporter 4.4/4.5 を使い、RTX 4090 の GPU メトリクスが
DCGM_FI_DEV_*
系で正しく出力されること。 - OpenTelemetry Collector Contrib を使い、Prometheus レシーバーでスクレイプ可能であること。
- 正しいゲートウェイ IP を使うことで、Collector から Host の dcgm-exporter・Instana Agent に通信できること。
- Instana にメトリクスが届き、GPU 利用率・温度・メモリ利用などを可視化できた。
将来的に、下記を試すとより良くなる可能性あり:
- dcgm-exporter のプロファイル機能(profiling metrics)が使えるか確認
- 高頻度のスクレイプ設定(例 5s や 1s)での Overhead/精度比較
- Instana のダッシュボードを使ってアラート設定(GPU 温度高・利用率過大など)
- 複数 GPU/分散環境でのメトリクス集約