Как работать с GPU-узлами?

Порядок действий по добавлению GPU-узла в кластер

Начиная с Deckhouse 1.75, если в NodeGroup есть секция spec.gpu, модуль gpu автоматически:

  • настраивает containerd с default_runtime = "nvidia" (через NodeGroupConfiguration);
  • применяет необходимые системные параметры (включая фиксы для NVIDIA Container Toolkit);
  • разворачивает системные компоненты: NFD, GFD, NVIDIA Device Plugin, DCGM Exporter и, при необходимости, MIG Manager.

Для корректной работы необходимо явно указать режим в spec.gpu.sharing (Exclusive, TimeSlicing или MIG). Ручная конфигурация containerd (через NodeGroupConfiguration, TOML и т.п.) не требуется и не должна комбинироваться с автоматической настройкой. Список поддерживаемых платформ NVIDIA Container Toolkit см. в официальной документации.

Чтобы добавить GPU-узел в кластер, выполните следующие действия:

  1. Создайте NodeGroup для GPU-узлов.

    Пример с включённым TimeSlicing (partitionCount: 4) и типичным taint/label:

    apiVersion: deckhouse.io/v1
    kind: NodeGroup
    metadata:
      name: gpu
    spec:
      nodeType: CloudStatic # или Static/CloudEphemeral — по вашей инфраструктуре.
      gpu:
        sharing: TimeSlicing
        timeSlicing:
          partitionCount: 4
      nodeTemplate:
        labels:
          node-role/gpu: ""
        taints:
          - key: node-role
            value: gpu
            effect: NoSchedule

    Если вы используете собственные ключи taint, убедитесь, что они разрешены в ModuleConfig global в массиве .spec.settings.modules.placement.customTolerationKeys, чтобы рабочие нагрузки могли добавлять соответствующие tolerations.

    Полная схема полей находится в описании кастомного ресурса NodeGroup.

  2. Установите драйвер NVIDIA и nvidia-container-toolkit.

    Установку драйвера NVIDIA и NVIDIA Container Toolkit выполняйте на самих узлах — вручную или с помощью NodeGroupConfiguration. Ниже приведены примеры NodeGroupConfiguration для группы узлов gpu.

    Ubuntu

    apiVersion: deckhouse.io/v1alpha1
    kind: NodeGroupConfiguration
    metadata:
      name: install-cuda.sh
    spec:
      bundles:
        - ubuntu-lts
      content: |
        #!/bin/bash
        if [ ! -f "/etc/apt/sources.list.d/nvidia-container-toolkit.list" ]; then
          distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
          curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey | sudo apt-key add -
          curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
        fi
        bb-apt-install nvidia-container-toolkit nvidia-driver-535-server
        nvidia-ctk config --set nvidia-container-runtime.log-level=error --in-place
      nodeGroups:
        - gpu
      weight: 30

    CentOS

    apiVersion: deckhouse.io/v1alpha1
    kind: NodeGroupConfiguration
    metadata:
      name: install-cuda.sh
    spec:
      bundles:
        - centos
      content: |
        #!/bin/bash
        if [ ! -f "/etc/yum.repos.d/nvidia-container-toolkit.repo" ]; then
          distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
          curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.repo | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
        fi
        bb-dnf-install nvidia-container-toolkit nvidia-driver
        nvidia-ctk config --set nvidia-container-runtime.log-level=error --in-place
      nodeGroups:
        - gpu
      weight: 30

    После того как конфигурации будут применены, необходимо провести бутстрап и перезагрузить узлы, чтобы применить настройки и установить драйвера.

  3. Проверьте установку на узле, используя команду:

    nvidia-smi

    Ожидаемый корректный вывод (пример):

    +---------------------------------------------------------------------------------------+
    | NVIDIA-SMI 535.247.01             Driver Version: 535.247.01   CUDA Version: 12.2     |
    |-----------------------------------------+----------------------+----------------------+
    | GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
    |                                         |                      |               MIG M. |
    |=========================================+======================+======================|
    |   0  Tesla V100-PCIE-32GB           Off | 00000000:65:00.0 Off |                    0 |
    | N/A   32C    P0              35W / 250W |      0MiB / 32768MiB |      0%      Default |
    |                                         |                      |                  N/A |
    +-----------------------------------------+----------------------+----------------------+
    
  4. Проверьте инфраструктурные компоненты в кластере.

    Поды NVIDIA в d8-nvidia-gpu:

    d8 k -n d8-nvidia-gpu get pod

    Ожидаемый корректный вывод (пример):

    NAME                                  READY   STATUS    RESTARTS   AGE
    gpu-feature-discovery-80ceb7d-r842q   2/2     Running   0          2m53s
    nvidia-dcgm-exporter-w9v9h            1/1     Running   0          2m53s
    nvidia-dcgm-njqqb                     1/1     Running   0          2m53s
    nvidia-device-plugin-80ceb7d-8xt8g    2/2     Running   0          2m53s
    

    Поды NFD в d8-nvidia-gpu:

    d8 k -n d8-nvidia-gpu get pods | egrep '^(NAME|node-feature-discovery)'

    Ожидаемый корректный вывод (пример):

    NAME                                             READY   STATUS      RESTARTS       AGE
    node-feature-discovery-gc-6d845765df-45vpj       1/1     Running     0              3m6s
    node-feature-discovery-master-74696fd9d5-wkjk4   1/1     Running     0              3m6s
    node-feature-discovery-worker-5f4kv              1/1     Running     0              3m8s
    

    Публикация ресурсов на узле:

    d8 k describe node <имя-узла>

    Фрагмент вывода (пример):

    Capacity:
      cpu:                40
      memory:             263566308Ki
      nvidia.com/gpu:     4
    Allocatable:
      cpu:                39930m
      memory:             262648294441
      nvidia.com/gpu:     4
    
  5. Запустите функциональные тесты.

    Вариант A. Вызов nvidia-smi из контейнера:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: nvidia-cuda-test
      namespace: default
    spec:
      completions: 1
      template:
        spec:
          restartPolicy: Never
          nodeSelector:
            node.deckhouse.io/group: gpu
          containers:
            - name: nvidia-cuda-test
              image: nvidia/cuda:11.6.2-base-ubuntu20.04
              imagePullPolicy: "IfNotPresent"
              command:
                - nvidia-smi

    Проверьте логи:

    d8 k logs job/nvidia-cuda-test

    Вариант B. CUDA sample (vectoradd):

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: gpu-operator-test
      namespace: default
    spec:
      completions: 1
      template:
        spec:
          restartPolicy: Never
          nodeSelector:
            node.deckhouse.io/group: gpu
          containers:
            - name: gpu-operator-test
              image: nvidia/samples:vectoradd-cuda10.2
              imagePullPolicy: "IfNotPresent"

В логах nvidia-device-plugin/gpu-feature-discovery: Incompatible strategy detected auto

Ошибки вида:

  • Incompatible strategy detected auto
  • failed to create resource manager: unsupported strategy auto
  • invalid device discovery strategy

означают, что компонент не смог определить платформу (NVML) внутри контейнера (обычно нет libnvidia-ml.so.* / NVIDIA Container Toolkit runtime не используется).

Что проверить:

  1. На узле работает nvidia-smi.
  2. Установлен NVIDIA Container Toolkit (/usr/bin/nvidia-container-runtime существует).
  3. Для GPU-узлов containerd настроен на runtime nvidia (это делает модуль gpu после установки драйвера/toolkit и перезапуска containerd/перезагрузки узла).
  4. После исправлений пересоздайте поды nvidia-device-plugin-* и gpu-feature-discovery-* в namespace d8-nvidia-gpu.

Как мониторить GPU?

Deckhouse Kubernetes Platform автоматически устанавливает DCGM Exporter; метрики GPU попадают в Prometheus и доступны в Grafana.

Какие режимы работы GPU поддерживаются?

Поддерживаются следующие режимы работы GPU:

  • Exclusive — узел публикует ресурс nvidia.com/gpu; каждому поду выделяется целый GPU.
  • TimeSlicing — временное разделение одного GPU между несколькими подами (по умолчанию partitionCount: 4), при этом под по-прежнему запрашивает nvidia.com/gpu.
  • MIG (Multi-Instance GPU) — аппаратное разделение совместимых GPU на независимые экземпляры; при профиле all-1g.5gb появятся ресурсы вида nvidia.com/mig-1g.5gb.

Как посмотреть доступные MIG-профили в кластере?

Предустановленные профили находятся в ConfigMap mig-parted-config в пространстве имен d8-nvidia-gpu. Для их просмотра используйте команду:

d8 k -n d8-nvidia-gpu get cm mig-parted-config -o json | jq -r '.data["config.yaml"]'

В разделе mig-configs вы увидите конкретные модели ускорителей (по PCI-ID) и список совместимых MIG-профилей для каждой из них. Найдите свою видеокарту и выберите подходящий профиль — его имя указывается в spec.gpu.mig.partedConfig вашего NodeGroup. Это позволит применить правильный профиль именно к вашей карте.

Как задать свой MIG-профиль для каждой карты на узле?

Используйте partedConfig: custom и задайте разбиение отдельно для каждого индекса GPU:

gpu:
  sharing: MIG
  mig:
    partedConfig: custom
    customConfigs:
      - index: 0
        slices:
          - profile: "1g.10gb"
            count: 7
      - index: 1
        slices:
          - profile: "2g.20gb"
            count: 3

Что делает модуль:

  1. Генерирует уникальное имя MIG-конфига для NodeGroup и выставляет его в лейбл nvidia.com/mig.config.
  2. Для GPU, перечисленных в customConfigs, рендерит mig-enabled: true с указанными slices.
  3. Для всех неуказанных индексов (остальных карт на узле) рендерит mig-enabled: false, чтобы эти карты гарантированно остались в full-режиме и не перетирали явно заданные конфигурации.

Для GPU не активируется MIG-профиль — что проверить?

  1. Модель GPU: MIG поддерживают H100/A100/A30, не поддерживает V100/T4. См. таблицы профилей в руководстве NVIDIA MIG.

  2. Конфигурация NodeGroup:

    gpu:
      sharing: MIG
      mig:
        partedConfig: all-1g.5gb
  3. Дождитесь, пока nvidia-mig-manager выполнит drain узла и переконфигурирует GPU. Этот процесс может занять несколько минут. Пока операция идёт, на узле стоит taint mig-reconfigure. После успешного окончания taint удаляется.

  4. Ход процесса можно отслеживать по label nvidia.com/mig.config.state на узле: pending, rebooting, success (или failed, если что-то пошло не так).

  5. Если ресурсы nvidia.com/mig-* не появились — проверьте:

    d8 k -n d8-nvidia-gpu logs daemonset/nvidia-mig-manager
    nvidia-smi -L

Поддерживаются ли AMD или Intel GPU?

Сейчас Deckhouse Kubernetes Platform автоматически настраивает только NVIDIA GPU. Поддержка AMD (ROCm) и Intel GPU находится в проработке и планируется к добавлению в будущих релизах.