Стадия жизненного цикла модуля: Общедоступная версия

У модуля есть требования для установки

В этом примере рассматривается запуск рабочей нагрузки (пода) на GPU в случае работы модуля в режиме DRA. В этом режиме модуль обнаруживает GPU на всех узлах самостоятельно, а способ их разделения выбирается на уровне рабочей нагрузки, а не группы узлов.

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

  1. Включите модуль в режиме DRA.
  2. Установите драйвер NVIDIA на узел.
  3. Убедитесь, что модуль обнаружил карту.
  4. Опубликуйте пул GPU.
  5. Запустите нагрузку на 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                VENDOR   DEVICE   MODEL      PHASE   MODE      HEALTHY
dev-ee-ubuntu24-0-0-10de-1eb8   dev-ee-ubuntu24-0   nvidia   1eb8     tesla-t4   Ready   Compute   True

Дождитесь, пока в PHASE появится Ready, а в HEALTHY — True. Затем проверьте, что карта предложена планировщику:

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)