Как работать с 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-узел в кластер, выполните следующие действия:
-
Создайте 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. -
Установите драйвер 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: 30CentOS
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После того как конфигурации будут применены, необходимо провести бутстрап и перезагрузить узлы, чтобы применить настройки и установить драйвера.
-
Проверьте установку на узле, используя команду:
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 | +-----------------------------------------+----------------------+----------------------+ -
Проверьте инфраструктурные компоненты в кластере.
Поды 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 -
Запустите функциональные тесты.
Вариант 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 autofailed to create resource manager: unsupported strategy autoinvalid device discovery strategy
означают, что компонент не смог определить платформу (NVML) внутри контейнера (обычно нет libnvidia-ml.so.* / NVIDIA Container Toolkit runtime не используется).
Что проверить:
- На узле работает
nvidia-smi. - Установлен NVIDIA Container Toolkit (
/usr/bin/nvidia-container-runtimeсуществует). - Для GPU-узлов containerd настроен на runtime
nvidia(это делает модульgpuпосле установки драйвера/toolkit и перезапуска containerd/перезагрузки узла). - После исправлений пересоздайте поды
nvidia-device-plugin-*иgpu-feature-discovery-*в namespaced8-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Что делает модуль:
- Генерирует уникальное имя MIG-конфига для NodeGroup и выставляет его в лейбл
nvidia.com/mig.config. - Для GPU, перечисленных в
customConfigs, рендеритmig-enabled: trueс указаннымиslices. - Для всех неуказанных индексов (остальных карт на узле) рендерит
mig-enabled: false, чтобы эти карты гарантированно остались в full-режиме и не перетирали явно заданные конфигурации.
Для GPU не активируется MIG-профиль — что проверить?
-
Модель GPU: MIG поддерживают H100/A100/A30, не поддерживает V100/T4. См. таблицы профилей в руководстве NVIDIA MIG.
-
Конфигурация NodeGroup:
gpu: sharing: MIG mig: partedConfig: all-1g.5gb -
Дождитесь, пока
nvidia-mig-managerвыполнит drain узла и переконфигурирует GPU. Этот процесс может занять несколько минут. Пока операция идёт, на узле стоит taintmig-reconfigure. После успешного окончания taint удаляется. -
Ход процесса можно отслеживать по label
nvidia.com/mig.config.stateна узле:pending,rebooting,success(илиfailed, если что-то пошло не так). -
Если ресурсы
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 находится в проработке и планируется к добавлению в будущих релизах.