Мониторинг и управление 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-ресурсов:
Убедитесь, что метки, добавленные 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" }Убедитесь, что ресурс GPU
nvidia.com/gpuдоступен на узле:kubectl get nodes -o json | jq '.items[] | {name: .metadata.name, gpu: .status.capacity["nvidia.com/gpu"]}'Если в выводе команды для узла присутствует значение ресурса
nvidia.com/gpu, то GPU зарегистрирован в кластере и готов к использованию.Проверьте, что K8s-device-plugin запущен на GPU-узлах:
kubectl get pods -A | grep nvidia-device-pluginЗапустите тестовый 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Проверьте журнал выполнения тестового 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-ресурс выделен корректно и доступен для выполнения рабочей нагрузки.После завершения проверки удалите тестовый pod:
kubectl delete pod gpu-check
Получение метрик GPU#
Отслеживайте состояние и производительность GPU в реальном времени с помощью метрик, собираемых DCGM Exporter в формате, совместимом с Prometheus.
Сценарий получения метрик GPU:
Убедитесь, что DCGM Exporter запущен на GPU-узлах:
kubectl get pods -A | grep dcgm-exporterПолучите имя первого 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}")Переадресуйте метрики, собранные DCGM Exporter на порту
9400, на локальный порт8080:kubectl port-forward $NAME 8080:9400 &Запросите метрики:
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.Для интеграции метрик с системой мониторинга 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:
Определите набор возможных конфигураций MIG в файле конфигурации
mig-parted.yaml. Пример файла конфигурации приведен в разделе «Конфигурация MIG Parted» Руководства администратора.Примените выбранную конфигурацию 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Проверьте, что ресурсы MIG-устройств доступны в кластере:
kubectl get nodes -o json | jq '.items[] | {name: .metadata.name, mig: .status.capacity["nvidia.com/mig-1g.5gb"]}'Запустите рабочую нагрузку, запрашивающую 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Проверьте корректность запуска и удалите тестовый pod:
kubectl logs mig-podkubectl delete pod mig-pod
Результат#
Ожидаемым результатом являются:
готовность GPU-узлов к запуску рабочих нагрузок;
подтверждение доступности и состояния GPU;
доступность метрик GPU для мониторинга;
примененность и корректная работа конфигурации MIG.