Стадия жизненного цикла модуля: Общедоступная версия
У модуля есть требования для установки
В разделе представлены готовые к применению манифесты для типовых задач администратора и пользователя.
GPU-узлы часто помечены taint’ом (например, node-role=gpu:NoSchedule), чтобы обычные нагрузки на них не попадали. Чтобы разрешить планирование обычных нагрузок на такие узлы, добавьте в примеры ниже соответствующие tolerations и nodeSelector.
Собственные ключи taint’ов должны быть разрешены в ModuleConfig global в массиве .spec.settings.modules.placement.customTolerationKeys, иначе создание NodeGroup будет отклонено:
it is forbidden to create a NodeGroup resource with taints not specified in ModuleConfig "global"
in the array .spec.settings.modules.placement.customTolerationKeys, add: node-role to customTolerationKeys
Администратор: публикация пулов GPU
Все GPU одной модели
apiVersion: gpu.deckhouse.io/v1alpha1
kind: GPUClass
metadata:
name: a100
spec:
selector:
matchLabels:
gpu.deckhouse.io/device: a100-sxm4-40gbТолько небольшие MIG-партиции
apiVersion: gpu.deckhouse.io/v1alpha1
kind: GPUClass
metadata:
name: a100-small
spec:
selector:
matchLabels:
gpu.deckhouse.io/device: a100-sxm4-40gb
partitionFilter:
allow:
- 1g5gb
- 2g10gbИмена профилей в фильтре — DNS-метки: 1g5gb, а не 1g.5gb.
Пул, который нельзя разделять
apiVersion: gpu.deckhouse.io/v1alpha1
kind: GPUClass
metadata:
name: a100-exclusive
spec:
selector:
matchLabels:
gpu.deckhouse.io/device: a100-sxm4-40gb
sharingFilter:
deny:
- mps
- tsКарты на конкретном узле
apiVersion: gpu.deckhouse.io/v1alpha1
kind: GPUClass
metadata:
name: training-rig
spec:
selector:
matchLabels:
gpu.deckhouse.io/node: worker-gpu-1Пользователь: запрос опубликованного класса
Посмотрите, что доступно, и запросите по имени:
Для просмотра всех GPUClass в кластере используйте команду:
d8 k get gpuclassesДля просмотра всех DeviceClass, которые были автоматически созданы контроллером GPU на основе GPUClass, используйте команду:
d8 k get gpuclass a100 -o jsonpath='{.status.deviceClassNames}' | jqЗапрос целого GPU
apiVersion: batch/v1
kind: Job
metadata:
name: train
spec:
backoffLimit: 0
template:
spec:
restartPolicy: Never
containers:
- name: train
image: nvidia/cuda:12.8.0-devel-ubuntu24.04
command: ["nvidia-smi", "-L"]
resources:
requests:
gpu.deckhouse.io/a100: 1
limits:
gpu.deckhouse.io/a100: 1Запрос MIG-партиции
resources:
requests:
gpu.deckhouse.io/a100-1g5gb: 1
limits:
gpu.deckhouse.io/a100-1g5gb: 1Запрос четверти разделяемого GPU
resources:
requests:
gpu.deckhouse.io/a100-mps-percent: 25
limits:
gpu.deckhouse.io/a100-mps-percent: 25Пользователь: самостоятельное описание claim’а
Используйте, когда опубликованные классы не покрывают ваши потребности.
Запрос целого GPU эксклюзивно
apiVersion: resource.k8s.io/v1
kind: DeviceClass
metadata:
name: nvidia-whole-gpu
spec:
selectors:
- cel:
expression: |
device.attributes["gpu.deckhouse.io"].vendor == "nvidia" &&
device.attributes["gpu.deckhouse.io"].computeAPI == "CUDA" &&
has(device.attributes["gpu.deckhouse.io"].deviceType) &&
device.attributes["gpu.deckhouse.io"].deviceType == "physical" &&
!has(device.attributes["gpu.deckhouse.io"].sharingStrategy)
---
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
name: whole-gpu
spec:
spec:
devices:
requests:
- name: gpu
exactly:
deviceClassName: nvidia-whole-gpu
count: 1
---
apiVersion: batch/v1
kind: Job
metadata:
name: whole-gpu
spec:
backoffLimit: 0
template:
spec:
restartPolicy: Never
resourceClaims:
- name: gpu
resourceClaimTemplateName: whole-gpu
containers:
- name: probe
image: nvidia/cuda:12.8.0-devel-ubuntu24.04
command: ["nvidia-smi", "-L"]
resources:
claims:
- name: gpuЗапрос конкретного MIG-профиля
apiVersion: resource.k8s.io/v1
kind: DeviceClass
metadata:
name: nvidia-mig-2g10gb
spec:
selectors:
- cel:
expression: |
device.attributes["gpu.deckhouse.io"].vendor == "nvidia" &&
device.attributes["gpu.deckhouse.io"].computeAPI == "CUDA" &&
has(device.attributes["gpu.deckhouse.io"].deviceType) &&
device.attributes["gpu.deckhouse.io"].deviceType == "partition" &&
has(device.attributes["gpu.deckhouse.io"].partitionTechnology) &&
device.attributes["gpu.deckhouse.io"].partitionTechnology == "MIG" &&
has(device.attributes["gpu.deckhouse.io"].partitionProfile) &&
device.attributes["gpu.deckhouse.io"].partitionProfile == "2g.10gb"Имена профилей в CEL-селекторе — аппаратные, с точками.
Запрос конкретной карты по PCI-адресу
- cel:
expression: |
device.attributes["gpu.deckhouse.io"].deviceType == "physical" &&
device.attributes["gpu.deckhouse.io"].pciAddress == "00000000:d5:00.0"Запрос четверти GPU через MPS
apiVersion: resource.k8s.io/v1
kind: DeviceClass
metadata:
name: nvidia-gpu-mps
spec:
selectors:
- cel:
expression: |
device.attributes["gpu.deckhouse.io"].vendor == "nvidia" &&
device.attributes["gpu.deckhouse.io"].computeAPI == "CUDA" &&
has(device.attributes["gpu.deckhouse.io"].deviceType) &&
device.attributes["gpu.deckhouse.io"].deviceType == "physical" &&
has(device.attributes["gpu.deckhouse.io"].sharingStrategy) &&
device.attributes["gpu.deckhouse.io"].sharingStrategy == "mps"
---
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
name: gpu-mps-quarter
spec:
spec:
devices:
requests:
- name: gpu
exactly:
deviceClassName: nvidia-gpu-mps
count: 1
capacity:
requests:
sharePercent: "25"
gpu.deckhouse.io/memory: 1Gi
config:
- requests: ["gpu"]
opaque:
driver: gpu.deckhouse.io
parameters:
apiVersion: resource.gpu.deckhouse.io/v1alpha1
kind: GpuConfig
sharing:
strategy: MPS
mpsConfig:
defaultActiveThreadPercentage: 25MPS поверх MIG-партиции
То же самое, но с MigDeviceConfig и селектором партиции. Для партиции достаточно одного sharePercent:
requests:
- name: gpu
exactly:
deviceClassName: nvidia-mig-2g10gb-mps
count: 1
capacity:
requests:
sharePercent: "25"
config:
- requests: ["gpu"]
opaque:
driver: gpu.deckhouse.io
parameters:
apiVersion: resource.gpu.deckhouse.io/v1alpha1
kind: MigDeviceConfig
sharing:
strategy: MPS
mpsConfig:
defaultActiveThreadPercentage: 25Любая доля, без указания стратегии
Селектор должен остаться разрешающим — не исключайте sharing-варианты:
apiVersion: resource.k8s.io/v1
kind: DeviceClass
metadata:
name: nvidia-gpu-any
spec:
selectors:
- cel:
expression: |
device.attributes["gpu.deckhouse.io"].vendor == "nvidia" &&
device.attributes["gpu.deckhouse.io"].computeAPI == "CUDA" &&
has(device.attributes["gpu.deckhouse.io"].deviceType) &&
device.attributes["gpu.deckhouse.io"].deviceType == "physical"
---
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
name: gpu-share
spec:
spec:
devices:
requests:
- name: gpu
exactly:
deviceClassName: nvidia-gpu-any
count: 1
capacity:
requests:
sharePercent: "25"
gpu.deckhouse.io/memory: 1GiVFIO-проброс
apiVersion: resource.k8s.io/v1
kind: DeviceClass
metadata:
name: h100-vfio
spec:
selectors:
- cel:
expression: |
device.attributes["gpu.deckhouse.io"].vendor == "nvidia" &&
has(device.attributes["gpu.deckhouse.io"].productName) &&
device.attributes["gpu.deckhouse.io"].productName.lowerAscii().matches("^.*h100.*$") &&
has(device.attributes["gpu.deckhouse.io"].deviceType) &&
device.attributes["gpu.deckhouse.io"].deviceType == "physical" &&
has(device.attributes["gpu.deckhouse.io"].bareMetal) &&
device.attributes["gpu.deckhouse.io"].bareMetal == true
---
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
name: h100-vfio
spec:
spec:
devices:
requests:
- name: gpu
exactly:
deviceClassName: h100-vfio
allocationMode: ExactCount
count: 1
config:
- requests: ["gpu"]
opaque:
driver: gpu.deckhouse.io
parameters:
apiVersion: resource.gpu.deckhouse.io/v1alpha1
kind: VfioDeviceConfig
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: h100-vfio
spec:
replicas: 1
selector:
matchLabels:
app: h100-vfio
template:
metadata:
labels:
app: h100-vfio
spec:
nodeSelector:
node.deckhouse.io/gpu-vfio-ready: "true"
resourceClaims:
- name: gpu
resourceClaimTemplateName: h100-vfio
containers:
- name: vfio-consumer
image: busybox:1.36
command: ["/bin/sh", "-c", "ls -l /dev/vfio && sleep infinity"]
resources:
claims:
- name: gpuВнутри контейнера с пробросом нет ни CUDA, ни nvidia-smi — только device-node’ы VFIO.
Манифесты для режима Device Plugin
Эти примеры применимы для режима Device Plugin (при dra.enabled: false). Разделение настраивается на уровне NodeGroup через spec.gpu, а нагрузки запрашивают nvidia.com/gpu.
Exclusive
apiVersion: deckhouse.io/v1
kind: NodeGroup
metadata:
name: gpu-exclusive
spec:
nodeType: Static # Или CloudStatic/CloudEphemeral по необходимости.
gpu:
sharing: Exclusive
nodeTemplate:
labels:
node-role/gpu: ""
taints:
- key: node-role
value: gpu
effect: NoScheduleTimeSlicing
spec:
gpu:
sharing: TimeSlicing
timeSlicing:
partitionCount: 4MIG
spec:
gpu:
sharing: MIG
mig:
partedConfig: all-1g.5gbДля отдельной настройки партиционирования по индексам GPU используйте partedConfig: custom с customConfigs. Подробнее — в разделе «Диагностика».
Проверочный запуск
apiVersion: batch/v1
kind: Job
metadata:
name: cuda-vectoradd
spec:
template:
spec:
restartPolicy: OnFailure
nodeSelector:
node-role/gpu: ""
tolerations:
- key: node-role
value: gpu
effect: NoSchedule
containers:
- name: cuda-vectoradd
image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda11.7.1-ubuntu20.04
resources:
limits:
nvidia.com/gpu: 1