DCGM Exporter#

Data Center GPU Manager Exporter (DCGM Exporter) - инструмент, входящий в состав GPU Operator, предназначенный для сбора метрик с GPU NVIDIA и экспорта их в формате, совместимом с Prometheus.

Основные функции:

  1. Сбор метрик GPU в реальном времени, например:

    • DCGM_FI_DEV_GPU_UTIL — утилизация GPU (%);

    • CGM_FI_DEV_MEM_COPY_UTIL — утилизация памяти (%);

    • DCGM_FI_DEV_FB_USED — использовано видеопамяти (MiB);

    • DCGM_FI_DEV_POWER_USAGE — потребление энергии (Вт);

    • DCGM_FI_DEV_TEMPERATURE — температура GPU (°C);

    • DCGM_FI_PROF_PIPE_TENSOR_ACTIVE — активность тензорных ядер (для AI-ускорения).

  2. Тегирование метрик по pod/контейнерам/GPU. Совместно с GPU Feature Discovery , DCGM Exporter может:

    • связывать метрики GPU с конкретными pod и контейнерами.

    • показывать, какой pod сколько GPU использует.

    • включать метки pod, namespace, container, device, modelName.

    Примечание

    DCGM Exporter позволяет кластеру идентифицировать и отслеживать конкретные pod, которые используют ресурсы GPU, по их уникальным идентификаторам (UID). Для включения данной функции запустите DCGM Exporter с флагом --kubernetes.

  3. Экспорт в формате Prometheus:

    • Запуск HTTP-сервера на порту 9400.

    • Доступ метрики по адресу/metrics.

    • Совместимость с ServiceMonitor в экосистеме Prometheus Operator.

  4. В составе GPU Operator DCGM Exporter:

    • устанавливается автоматически как DaemonSet;

    • настраивается с поддержкой Kubernetes-меток;

    • имеет преднастроенные Service и ServiceMonitor.

Установка DCGM Exporter#

Для установки DCGM Exporter с помощью Helm, используйте команду:

helm install \
    --generate-name \
    <repository-helm-charts>/dcgm-exporter

Важно

Helm-чарт в состав поставки продукта не входит. Его можно получить с официального сайта NVIDIA.

Получение метрик#

Для быстрого получения метрик после развертывания pod dcgm-exporter можно воспользоваться переадресацией портов:

  1. Создайте файл dcgm-exporter.yaml:

    dcgm-exporter.yaml
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: "dcgm-exporter"
      labels:
        app.kubernetes.io/name: "dcgm-exporter"
        app.kubernetes.io/version: "4.7.0"
    spec:
      updateStrategy:
        type: RollingUpdate
      selector:
        matchLabels:
          app.kubernetes.io/name: "dcgm-exporter"
          app.kubernetes.io/version: "4.7.0"
      template:
        metadata:
          labels:
            app.kubernetes.io/name: "dcgm-exporter"
            app.kubernetes.io/version: "4.7.0"
          name: "dcgm-exporter"
        spec:
          automountServiceAccountToken: false
          containers:
          - image: "<image-path>/dcgm-exporter:4.4.1-4.6.0-ubi9"
            env:
            - name: "DCGM_EXPORTER_LISTEN"
              value: ":9400"
            - name: "DCGM_EXPORTER_KUBERNETES"
              value: "true"
            name: "dcgm-exporter"
            ports:
            - name: "metrics"
              containerPort: 9400
            securityContext:
              runAsNonRoot: false
              runAsUser: 0
              capabilities:
                add: ["SYS_ADMIN"]
                drop: ["ALL"]
              allowPrivilegeEscalation: false
            volumeMounts:
            - name: "pod-gpu-resources"
              readOnly: true
              mountPath: "/var/lib/kubelet/pod-resources"
            resources:
              limits:
                cpu: 200m
                memory: 256Mi
              requests:
                cpu: 100m
                memory: 128Mi
          volumes:
          - name: "pod-gpu-resources"
            hostPath:
              path: "/var/lib/kubelet/pod-resources"
    
    ---
    
    kind: Service
    apiVersion: v1
    metadata:
      name: "dcgm-exporter"
      labels:
        app.kubernetes.io/name: "dcgm-exporter"
        app.kubernetes.io/version: "4.7.0"
    spec:
      selector:
        app.kubernetes.io/name: "dcgm-exporter"
        app.kubernetes.io/version: "4.7.0"
      ports:
      - name: "metrics"
        port: 9400
    
  2. Разверните ресурс из файла dcgm-exporter.yaml:

    kubectl create -f dcgm-exporter.yaml
    
  3. Получите имя первого pod, который помечен меткой app.kubernetes.io/name=dcgm-exporter, и сохраните его в переменной NAME:

    NAME=$(kubectl get pods -l "app.kubernetes.io/name=dcgm-exporter" \
                             -o "jsonpath={ .items[0].metadata.name}")
    
  4. Переадресуйте метрики, собранные DCGM Exporter на стандартном порте 9400, на порт 8080. Такие метрики будут доступны локально по адресу http://<localhost-IP>:8080/metrics:

    kubectl port-forward $NAME 8080:9400 &
    
  5. Запросите метрики:

    curl -sL http://<localhost-IP>/metrics
    

    Пример вывода:

    # 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="<UUID>", container="", namespace="", pod=""} 139
    
    # HELP DCGM_FI_DEV_MEM_CLOCK Memory clock frequency (in MHz).
    # TYPE DCGM_FI_DEV_MEM_CLOCK gauge
    DCGM_FI_DEV_MEM_CLOCK{gpu="0", UUID="<UUID>", container="", namespace="", pod=""} 405
    
    # HELP DCGM_FI_DEV_MEMORY_TEMP Memory temperature (in C).
    # TYPE DCGM_FI_DEV_MEMORY_TEMP gauge
    DCGM_FI_DEV_MEMORY_TEMP{gpu="0", UUID="<UUID>", container="", namespace="", pod=""} 72
    

    Где:

    • HELP - описание каждой метрики (например, частота SM, частота памяти и температура памяти);

    • TYPE - тип метрики, в данном случае все метрики имеют тип gauge;

    • gpu, UUID, container, namespace и pod - метки для идентификации, какой конкретный GPU или pod используется;

    • 139, 405, 72 - значение метрики.