В предыдущей заметке я рассказывал как развернуть локальный кластер Kubernetes с доступом к GPU внутри WSL2 окружения. Для того, чтобы собирать детальные метрики с видеокарты, nvidia-smi не достаточно, т. к. GPU-Util показывает только активность в рамках короткого sampling-окна. Для анализа того, что происходит с GPU при обработке задач, нужен DCGM. dcgm-exporter — это утилита NVIDIA для сбора GPU-метрик через DCGM, которая отдает их через HTTP-метод /metrics для Prometheus и похожих систем мониторинга.
При попытке установить dcgm-exporter в k3s кластер Helm chart по умолчанию создает ServiceMonitor. Но если в кластере не установлен Prometheus оператор, процесс завершится с ошибкой:
no matches for kind "ServiceMonitor" in version "monitoring.coreos.com/v1"
ensure CRDs are installed firstЭто ожидаемое поведение. В dcgm-exporter chart по умолчанию serviceMonitor.enabled: true, а ServiceMonitor относится к CRD из экосистемы Prometheus Operator. В том же чарте runtimeClassName — пустой.
Проверяем, что Kubernetes все еще видит GPU:
kubectl get nodes -o json | jq '.items[].status.allocatable'На моей системе результат такой:
{
"cpu": "20",
"ephemeral-storage": "1027046117185",
"hugepages-1Gi": "0",
"hugepages-2Mi": "0",
"memory": "16233644Ki",
"nvidia.com/gpu": "1",
"pods": "110"
}Далее добавляем репозиторий:
helm repo add gpu-helm-charts https://nvidia.github.io/dcgm-exporter/helm-charts
helm repo updateОтключаем создание ServiceMonitor и указываем Nvidia runtime class:
helm install dcgm-exporter gpu-helm-charts/dcgm-exporter \
--set serviceMonitor.enabled=false \
--set runtimeClassName=nvidiaПроверяем, что pod с экспортером поднялся:
kubectl get pods -l app.kubernetes.io/name=dcgm-exporter -o wide
kubectl logs -l app.kubernetes.io/name=dcgm-exporter --tail=50Успешный запуск выглядит примерно так:
Starting dcgm-exporter
Attempting to initialize DCGM.
Initialized DCGM Fields module.
Attempting to initialize NVML library.
NVML provider successfully initialized for Kubernetes MIG support
DCGM successfully initialized!
Successfully queried DCGM profiling metric groups
HTTP server started - ready to serve metrics
Listening on [::]:9400Это означает, что:
- DCGM инициализировался
- NVML инициализировался
- exporter увидел GPU
- HTTP endpoint с метриками уже работает
Если chart создал сервис, его можно посмотреть так:
kubectl get svcДальше пробрасываем порт:
kubectl port-forward svc/dcgm-exporter 9400:9400И проверяем:
curl http://127.0.0.1:9400/metrics | head -50
curl http://127.0.0.1:9400/healthЕсли все ок, /health вернет успешный ответ, а /metrics начнет отдавать метрики вида DCGM_FI_*.