Стадия жизненного цикла модуля: Общедоступная версия
У модуля есть требования для установки
В этом примере рассматривается запуск рабочей нагрузки (пода) на GPU в случае работы модуля в режиме DRA. В этом режиме модуль обнаруживает GPU на всех узлах самостоятельно, а способ их разделения выбирается на уровне рабочей нагрузки, а не группы узлов.
Чтобы запустить рабочую нагрузку на GPU, выполните следующие шаги:
- Включите модуль в режиме DRA.
- Установите драйвер NVIDIA на узел.
- Убедитесь, что модуль обнаружил карту.
- Опубликуйте пул GPU.
- Запустите нагрузку на GPU.
Для запуска рабочих нагрузок на GPU кластер должен соответствовать требованиям.
В примерах ниже подразумевается, что узел, на котором запускается рабочая нагрузка, работает под управлением ОС Ubuntu, и ничего связанного с GPU на нём пока не настроено.
Включение модуля
Перед включением модуля в режиме DRA убедитесь, что кластер соответствует требованиям для DRA-режима.
Включите модуль в режиме DRA. Для этого примените ModuleConfig:
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: gpu
spec:
enabled: true
version: 1
settings:
dra:
enabled: trueДождитесь готовности модуля. Для проверки готовности используйте команду:
d8 k get module gpu -o jsonpath='{.status.phase}'Пример вывода при готовности модуля:
Ready
Установка драйвера NVIDIA на узел
Создайте ресурс NodeGroupConfiguration, который установит драйвер и NVIDIA Container Toolkit. Замените gpu на имя вашей NodeGroup:
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Перезагрузите узел, чтобы драйвер загрузился. Затем подключитесь к узлу и проверьте карту:
nvidia-smiПример вывода:
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.144.03 Driver Version: 550.144.03 CUDA Version: 12.4 |
|-----------------------------------------+------------------------+----------------------+
| 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 T4 Off | 00000000:01:00.0 Off | 0 |
| N/A 61C P8 17W / 70W | 1MiB / 15360MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+-----------------------------------------------------------------------------------------+
Секция Processes внизу должна быть пустой. Если GPU занят каким-то процессом, остановите его перед тем, как продолжать.
Убедитесь, что модуль обнаружил карту
Модуль находит GPU (карту) и создаёт для него объект PhysicalGPU. Для получения информации о всех объектах PhysicalGPU используйте команду:
d8 k get physicalgpusПример вывода:
NAME NODE MODEL PHASE MANAGEMENT STATUS AGE
dev-ee-ubuntu24-0-0-10de-1eb8 dev-ee-ubuntu24-0 tesla-t4 Ready Unclaimed 45s
Дождитесь, пока в PHASE появится Ready. В колонке MANAGEMENT стоит Unclaimed: картой
управляет модуль, и ни один ResourceClaim её пока не держит — так выглядит свободная карта, а не
повод для разбирательства. Как только карту запросит нагрузка, значение сменится на Managed.
Колонка STATUS остаётся пустой, когда объяснять нечего, и содержит человекочитаемую причину,
если карта не в Ready. Вендор, PCI-адрес, привязанный драйвер
ядра и его версия, здоровье и разбиение на разделы в вывод по умолчанию не попадают — добавьте
-o wide:
d8 k get physicalgpus -o wideЗатем проверьте, что карта предложена планировщику:
d8 k get resourceslicesПример вывода:
NAME NODE DRIVER POOL AGE
dev-ee-ubuntu24-0-gpu.deckhouse dev-ee-ubuntu24-0 gpu.deckhouse.io dev-ee-ubuntu24-0 30s
Публикация пула GPU
Создайте GPUClass, охватывающий все GPU в кластере:
apiVersion: gpu.deckhouse.io/v1alpha1
kind: GPUClass
metadata:
name: gpu-any
spec: {}Посмотрите, какие имена он создал:
d8 k get gpuclass gpu-any -o jsonpath='{.status.deviceClassNames}' | jqПример вывода:
[
"gpu-any",
"gpu-any-mps-percent",
"gpu-any-ts-percent"
]
Первое имя, gpu-any, выделяет целую карту. Оно понадобится на шаге запуска нагрузки на GPU.
Запуск нагрузки на GPU
Создайте и примените ресурс Job. В спецификации нагрузки (containers) укажите созданный ранее пул GPU:
apiVersion: batch/v1
kind: Job
metadata:
name: gpu-hello
namespace: default
spec:
backoffLimit: 0
template:
spec:
restartPolicy: Never
containers:
- name: probe
image: nvidia/cuda:12.8.0-devel-ubuntu24.04
command: ["nvidia-smi", "-L"]
resources:
requests:
gpu.deckhouse.io/gpu-any: 1
limits:
gpu.deckhouse.io/gpu-any: 1Проверьте логи созданного ресурса:
d8 k logs job/gpu-helloПример вывода информации о GPU, который получил под:
GPU 0: Tesla T4 (UUID: GPU-1c8f4a2e-6b3d-4f9a-8e15-7d2c9b0a4f61)