Мониторинг и управление GPU-ресурсами#

Данная ИИ-функция автоматизирует распознавание специализированного оборудования, планирование и контроль его использования, что позволяет подготовить инфраструктуру для обработки данных и обучения моделей ИИ:

Сценарий позволяет пользователю:

  • проверить готовность GPU-узлов и доступность ресурсов GPU в кластере;

  • отслеживать состояние и производительность GPU в реальном времени;

  • управлять конфигурацией Multi-Instance GPU (MIG);

  • контролировать установку и обновление драйверов NVIDIA.

Примечание

При использовании ИИ-функций DropApp соблюдайте правила работы пользователя с ИИ-функциями.

Предусловия#

Предварительными условиями выполнения сценария являются:

  • Развернутый кластер DropApp с установленным программным компонентом K8S Artificial Intelligence (K8SI).

  • Доступ к кластеру с правами, достаточными для просмотра состояния узлов, pod и метрик.

  • Наличие GPU-узлов, на которых развернуты инструменты управления GPU: GPU Operator, Container Toolkit, K8s-device-plugin, DCGM Exporter, Driver Manager, GDRCopy, MIG Parted.

Установка и настройка инструментов управления GPU описана в разделе «GPU Operator» Руководства по установке DropApp с помощью Dactl.

Сведения по администрированию инструментов приведены в разделе «Инструменты управления GPU» Руководства администратора.

Проверка доступности GPU-ресурсов в кластере#

Проверьте готовность GPU-узлов к запуску рабочих нагрузок и доступность ресурсов GPU (nvidia.com/gpu) в кластере. Регистрацию и отслеживание GPU в кластере выполняет K8s-device-plugin, устанавливаемый и управляемый GPU Operator.

Сценарий проверки доступности GPU-ресурсов:

  1. Убедитесь, что метки, добавленные GPU Feature Discovery, присутствуют на узлах кластера:

    kubectl get nodes -o json | jq '.items[].metadata.labels | with_entries(select(.key | startswith("nvidia.com")))'
    

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

    {
      "nvidia.com/gpu.compute.major": "8",
      "nvidia.com/gpu.compute.minor": "0",
      "nvidia.com/gpu.count": "1",
      "nvidia.com/gpu.family": "ampere",
      "nvidia.com/gpu.memory": "40536",
      "nvidia.com/gpu.product": "A100-SXM4-40GB"
    }
    
  2. Убедитесь, что ресурс GPU nvidia.com/gpu доступен на узле:

    kubectl get nodes -o json | jq '.items[] | {name: .metadata.name, gpu: .status.capacity["nvidia.com/gpu"]}'
    

    Если в выводе команды для узла присутствует значение ресурса nvidia.com/gpu, то GPU зарегистрирован в кластере и готов к использованию.

  3. Проверьте, что K8s-device-plugin запущен на GPU-узлах:

    kubectl get pods -A | grep nvidia-device-plugin
    
  4. Запустите тестовый pod, запрашивающий ресурс GPU, чтобы убедиться в его доступности:

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: gpu-check
    spec:
      restartPolicy: Never
      containers:
        - name: cuda-container
          image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2
          resources:
            limits:
              nvidia.com/gpu: 1
    EOF
    
  5. Проверьте журнал выполнения тестового pod:

    kubectl logs gpu-check
    

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

    [Vector addition of 50000 elements]
    Copy input data from the host memory to the CUDA device
    CUDA kernel launch with 196 blocks of 256 threads
    Copy output data from the CUDA device to the host memory
    Test PASSED
    Done
    

    Вывод Test PASSED подтверждает, что GPU-ресурс выделен корректно и доступен для выполнения рабочей нагрузки.

  6. После завершения проверки удалите тестовый pod:

    kubectl delete pod gpu-check
    

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

Отслеживайте состояние и производительность GPU в реальном времени с помощью метрик, собираемых DCGM Exporter в формате, совместимом с Prometheus.

Сценарий получения метрик GPU:

  1. Убедитесь, что DCGM Exporter запущен на GPU-узлах:

    kubectl get pods -A | grep dcgm-exporter
    
  2. Получите имя первого pod DCGM Exporter, обладающего меткой app.kubernetes.io/name=dcgm-exporter, и сохраните его в переменной NAME:

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

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

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

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

    # HELP DCGM_FI_DEV_GPU_UTIL GPU utilization (in %).
    # TYPE DCGM_FI_DEV_GPU_UTIL gauge
    DCGM_FI_DEV_GPU_UTIL{gpu="0", UUID="<UUID>", container="", namespace="", pod=""} 72
    
    # HELP DCGM_FI_DEV_FB_USED Used framebuffer memory (in MiB).
    # TYPE DCGM_FI_DEV_FB_USED gauge
    DCGM_FI_DEV_FB_USED{gpu="0", UUID="<UUID>", container="", namespace="", pod=""} 12345
    
    # HELP DCGM_FI_DEV_POWER_USAGE Power usage (in W).
    # TYPE DCGM_FI_DEV_POWER_USAGE gauge
    DCGM_FI_DEV_POWER_USAGE{gpu="0", UUID="<UUID>", container="", namespace="", pod=""} 312
    

    Где:

    • DCGM_FI_DEV_GPU_UTIL — утилизация GPU (в процентах);

    • DCGM_FI_DEV_FB_USED — использованный объем видеопамяти (в МиБ);

    • DCGM_FI_DEV_POWER_USAGE — потребляемая мощность (в ваттах);

    • gpu, UUID, container, namespace и pod — метки для идентификации конкретного GPU или pod, использующего GPU.

    Примечание

    При запуске DCGM Exporter с опцией --kubernetes он связывает метрики GPU с конкретными pod. В этом случае метрики содержат метки pod, namespace и container.

  5. Для интеграции метрик с системой мониторинга Prometheus используйте файл манифеста 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
    

    Разверните ресурс из файла dcgm-exporter.yaml:

    kubectl create -f dcgm-exporter.yaml
    

Управление конфигурацией MIG#

Управляйте конфигурацией Multi-Instance GPU (MIG) на узлах с поддержкой (начиная с архитектуры Ampere) с помощью MIG Parted. MIG-профили (например, 1g.5gb, 3g.20gb) позволяют разделить GPU на несколько изолированных экземпляров для многоарендного использования оборудования.

Примечание

По умолчанию режим MIG на GPU отключен. Перед применением MIG-конфигурации включите его с помощью команды nvidia-smi -i <gpu_id> -mig 1.

Сценарий управления конфигурацией MIG:

  1. Определите набор возможных конфигураций MIG в файле конфигурации mig-parted.yaml. Пример файла конфигурации приведен в разделе «Конфигурация MIG Parted» Руководства администратора.

  2. Примените выбранную конфигурацию MIG к GPU-узлу:

    nvidia-mig-parted apply -f <config_repo>/mig-parted.yaml -c <config_name>
    

    Где <config_name> — имя конфигурации из раздела mig-configs файла конфигурации (например, all-1g.5gb, all-balanced, custom-config).

    Например, для разделения всех GPU на узле на устройства емкостью 1g.5gb выполните команду:

    nvidia-mig-parted apply -f <config_repo>/mig-parted.yaml -c all-1g.5gb
    
  3. Проверьте, что ресурсы MIG-устройств доступны в кластере:

    kubectl get nodes -o json | jq '.items[] | {name: .metadata.name, mig: .status.capacity["nvidia.com/mig-1g.5gb"]}'
    
  4. Запустите рабочую нагрузку, запрашивающую MIG-ресурс:

    apiVersion: v1
    kind: Pod
    metadata:
      name: mig-pod
    spec:
      restartPolicy: Never
      containers:
        - name: cuda-container
          image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2
          resources:
            limits:
              nvidia.com/mig-1g.5gb: 1
    

    Примените манифест:

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Pod
    metadata:
      name: mig-pod
    spec:
      restartPolicy: Never
      containers:
        - name: cuda-container
          image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2
          resources:
            limits:
              nvidia.com/mig-1g.5gb: 1
    EOF
    
  5. Проверьте корректность запуска и удалите тестовый pod:

    kubectl logs mig-pod
    
    kubectl delete pod mig-pod
    

Результат#

Ожидаемым результатом являются:

  • готовность GPU-узлов к запуску рабочих нагрузок;

  • подтверждение доступности и состояния GPU;

  • доступность метрик GPU для мониторинга;

  • примененность и корректная работа конфигурации MIG.