Стадия жизненного цикла модуля: Общедоступная версия
У модуля есть требования для установки
GPUClass — это заданный администратором пул GPU. В нём описывается, какие карты входят в пул и какие варианты партиционирования и разделения разрешены. Модуль превращает это в набор объектов DeviceClass, каждый из которых получает имя extended-ресурса, доступное пользователям напрямую.
Это рекомендуемый способ предоставления GPU пользователям. Без GPUClass каждому пользователю приходится самостоятельно описывать DeviceClass с CEL-селектором — этот путь описан в разделе «Использование».
GPUClass — кластерный ресурс. Короткое имя: gpucls.
Использование ресурсов GPUClass
Принципы работы с GPUClass следующие:
- Администратор кластера создаёт GPUClass с селектором по объектам PhysicalGPU.
gpu-controllerнаходит подходящие карты и читает их возможности — какие MIG-профили они поддерживают и какие стратегии разделения доступны.- Для каждой разрешённой комбинации он создаёт DeviceClass, принадлежащий этому GPUClass. Каждый такой объект получает
extendedResourceName. - Пользователи запрашивают GPU по имени этого extended-ресурса. Мутирующий вебхук модуля создаёт ResourceClaim за них.
Удаление GPUClass удаляет все сгенерированные им объекты DeviceClass (они связаны с GPUClass через owner references).
Пример минимального GPUClass
Все GPU в кластере, только целые карты:
apiVersion: gpu.deckhouse.io/v1alpha1
kind: GPUClass
metadata:
name: gpu-any
spec: {}Пустой spec означает «все объекты PhysicalGPU, все поддерживаемые профили партиций, все поддерживаемые стратегии разделения». На смешанном кластере это создаст очень много объектов DeviceClass, поэтому на практике селектор нужен.
Выбор карт
spec.selector — обычный label selector по объектам PhysicalGPU. Пустой селектор соответствует всем картам.
Доступные лейблы PhysicalGPU:
| Лейбл | Пример | Значение |
|---|---|---|
gpu.deckhouse.io/vendor |
nvidia, metax, amd, intel |
Вендор GPU. |
gpu.deckhouse.io/device |
a100-sxm4-40gb, h100-sxm5-96gb, tesla-t4 |
Модель карты. |
gpu.deckhouse.io/node |
worker-1 |
Узел, в котором установлена карта. |
gpu.deckhouse.io/sharing.mps |
true |
Карта поддерживает MPS. |
gpu.deckhouse.io/sharing.ts |
true |
Карта поддерживает time-slicing. |
Для просмотра всех физических GPU в кластере и их лейблов используйте команду:
d8 k get physicalgpus --show-labelsПример класса GPU, ограниченного одной моделью:
apiVersion: gpu.deckhouse.io/v1alpha1
kind: GPUClass
metadata:
name: a100
spec:
selector:
matchLabels:
gpu.deckhouse.io/device: a100-sxm4-40gbОграничение профилей партиций
spec.partitionFilter ограничивает набор MIG-профилей, которые публикует класс. Используйте allow как белый список или deny как чёрный.
Имена профилей в фильтре должны быть DNS-метками: пишите 1g5gb, а не 1g.5gb. Эти имена используются для построения имён DeviceClass, в которых точки недопустимы. Значение с точками отклоняется admission-вебхуком с ошибкой partitionFilter value "1g.5gb" must be a DNS label: must not contain dots.
Чтобы посмотреть, какие профили поддерживает карта, используйте команду:
d8 k get physicalgpu <имя> -o jsonpath='{.status.capabilities.partitionSupport.profiles[*].name}'Эта команда выводит аппаратные имена (1g.5gb, 2g.10gb, …). При записи в фильтр точки нужно убрать.
Пример GPUClass с публикацией только небольших партиций A100:
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Всё, кроме партиции на всю карту:
spec:
partitionFilter:
deny:
- 7g40gbОграничение разделения
spec.sharingFilter ограничивает набор стратегий разделения, которые публикует класс. Допустимые имена — mps и ts; используются только те стратегии, которые действительно поддерживает оборудование.
Пример описания пула только для эксклюзивного использования — совместный доступ к этим картам запрещён полностью:
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Пример описания пула, в котором разрешён только MPS:
spec:
sharingFilter:
allow:
- mpsИмена сгенерированных DeviceClass
Имена строятся из имени класса плюс сегменты партиции и разделения:
| Сгенерированное имя | Что выделяется |
|---|---|
<класс> |
Целая карта, эксклюзивно. |
<класс>-<партиция> |
MIG-партиция этого профиля, эксклюзивно. |
<класс>-<разделение>-percent |
Доля целой карты. |
<класс>-<партиция>-<разделение>-percent |
Доля MIG-партиции. |
Например, класс ml-ai-h100, разрешающий профиль 1g12gb и MPS, создаёт ml-ai-h100, ml-ai-h100-1g12gb, ml-ai-h100-mps-percent и ml-ai-h100-1g12gb-mps-percent.
Сгенерированные объекты получают лейблы, по которым их удобно искать и проверять:
d8 k get deviceclasses -l gpu.deckhouse.io/gpuclass=ml-ai-h100| Лейбл | Значение |
|---|---|
gpu.deckhouse.io/gpuclass |
Владеющий GPUClass. |
gpu.deckhouse.io/managed-by=gpu-controller |
Объект сгенерирован, а не написан вручную. Не редактируйте его. |
gpu.deckhouse.io/partition |
Профиль партиции; отсутствует у классов на целую карту. |
gpu.deckhouse.io/sharing |
mps или ts; отсутствует у эксклюзивных классов. |
gpu.deckhouse.io/capacity-units |
1 для эксклюзивных классов, 100 для классов -percent — единица, которую запрашивает пользователь. |
Считайте схему именования удобством, а не контрактом. Достоверный список всегда находится в .status.deviceClassNames у GPUClass.
Просмотр доступных объектов GPUClass
Для просмотра доступных в кластере объектов GPUClass используйте команду:
d8 k get gpuclassesПример вывода:
NAME DEVICES DEVICECLASSES READY
ml-ai-h100 2 ["ml-ai-h100","ml-ai-h100-1g12gb", ...] True
Значения полей в выводе команды:
| Поле | Значение |
|---|---|
DEVICES (.status.matchingPhysicalGPUCount) |
Сколько объектов PhysicalGPU попало под селектор. 0 означает, что селектор неверен или ни одна подходящая карта не находится в Ready. |
DEVICECLASSES (.status.deviceClassNames) |
Все DeviceClass, сгенерированные для этого класса. |
READY |
Условие Ready. True с причиной Reconciled означает, что сгенерированные классы актуальны. |
Чтобы получить полный список имён классов устройств (DeviceClass), которые были созданы на основе конкретного класса GPU, используйте команду:
d8 k get gpuclass ml-ai-h100 -o jsonpath='{.status.deviceClassNames}' | jqКакую информацию передавать пользователям, запрашивающим GPU
Каждый сгенерированный DeviceClass публикует extended-ресурс с именем gpu.deckhouse.io/<имя-device-class>.
Для получения имени этого extended-ресурса используйте команду (ml-ai-h100-1g12gb замените на свое значение):
d8 k get deviceclass ml-ai-h100-1g12gb -o jsonpath='{.spec.extendedResourceName}'Пример вывода:
gpu.deckhouse.io/ml-ai-h100-1g12gb
Эту строку пользователи должны указывать в спецификации пода для запроса GPU. Подробнее — в разделе «Использование».
Особенности и ограничения классов GPU
Классы GPU имеют следующие особенности и ограничения:
- Валидация строгая и «падает закрыто». У вебхука GPUClass установлено
failurePolicy: Fail, поэтому покаgpu-controllerнедоступен, создание и изменение GPUClass отклоняются. На чтение и использование уже сгенерированных DeviceClass это не влияет. - Классы могут пересекаться. Ничто не запрещает двум объектам GPUClass выбирать одни и те же карты; они просто дадут два набора имён для одного оборудования. Конфликты выделения разрешает планировщик, а не определение класса.
- Фильтры не создают возможности. Если разрешить MIG-профиль или стратегию разделения, которой карта не поддерживает, DeviceClass для такой комбинации не появится — она пропускается, при этом сообщение об ошибке не формируется. Если ожидаемое имя отсутствует в
.status.deviceClassNames, сначала проверьте.status.capabilitiesкарты. - Не редактируйте сгенерированные объекты.
gpu-controllerих реконсилирует, поэтому ручные изменения будут отменены.