Вы просматриваете документацию для Cozystack v1.4. Документация последней версии доступна по ссылке: v1.5.

GPU Sharing с HAMi

Как включить дробное разделение GPU в tenant-кластерах Kubernetes с помощью HAMi.

HAMi (Heterogeneous AI Computing Virtualization Middleware) — проект CNCF Sandbox, который включает дробное разделение GPU в Kubernetes. Вместо выделения целого GPU под одну рабочую нагрузку HAMi позволяет контейнерам запрашивать конкретный объем GPU-памяти и вычислительных ядер.

Как это работает

HAMi работает между планировщиком Kubernetes и драйвером NVIDIA GPU:

  • Scheduler Extender добавляет GPU-aware решения при планировании (filtering и binding), чтобы pod попадали на ноды с достаточной GPU-емкостью.
  • Device Plugin регистрирует виртуальные GPU-ресурсы (nvidia.com/gpu, nvidia.com/gpumem, nvidia.com/gpucores) в kubelet.
  • MutatingWebhook автоматически направляет GPU pod в планировщик HAMi.
  • HAMi-core (libvgpu.so) внедряется в контейнеры рабочей нагрузки через LD_PRELOAD, чтобы обеспечить изоляцию памяти и вычислений на уровне CUDA API.

Когда HAMi включен, встроенный плагин устройств GPU Operator автоматически отключается, чтобы избежать конфликтов при регистрации ресурсов.

Требования

  • Tenant-кластер Kubernetes с worker нодами, для которых включены GPU (node groups с настроенными GPU).
  • Расширение GPU Operator включен в tenant-кластере.

Включение HAMi

Включите GPU Operator и HAMi в конфигурации tenant-кластера Kubernetes:

apiVersion: apps.cozystack.io/v1alpha1
kind: Kubernetes
metadata:
  name: my-cluster
  namespace: tenant-example
spec:
  nodeGroups:
    gpu-workers:
      minReplicas: 1
      maxReplicas: 3
      instanceType: u1.xlarge
      gpus:
        - name: nvidia.com/GA102GL_A10
  addons:
    gpuOperator:
      enabled: true
    hami:
      enabled: true

Примените эту конфигурацию:

kubectl apply -f my-cluster.yaml

Запрос дробных GPU-ресурсов

После запуска HAMi рабочие нагрузки могут запрашивать дробные GPU-ресурсы:

apiVersion: v1
kind: Pod
metadata:
  name: gpu-workload
spec:
  containers:
    - name: cuda-app
      image: nvcr.io/nvidia/cuda:11.8.0-base-ubuntu20.04
      resources:
        limits:
          nvidia.com/gpu: 1
          nvidia.com/gpumem: 3000
          nvidia.com/gpucores: 30

В примере выше используется абсолютный объем памяти (gpumem). Используйте gpumem-percentage, если нужна переносимость между моделями GPU с разным объемом памяти.

РесурсОписание
nvidia.com/gpuЗапрошенное количество виртуальных GPU
nvidia.com/gpumemЛимит GPU-памяти в MiB
nvidia.com/gpucoresДоля вычислительных ядер GPU в процентах (1–100)
nvidia.com/gpumem-percentageЛимит GPU-памяти в процентах (1–100)

Используйте nvidia.com/gpumem-percentage вместо nvidia.com/gpumem, если нужен переносимый лимит, который работает на разных моделях GPU без знания точного объема памяти.

Если gpumem и gpucores не указаны, контейнер получает доступ ко всей памяти и вычислительной емкости GPU. При этом слой виртуализации HAMi остается активным — это не то же самое, что проброс GPU на bare-metal-уровне.

Пользовательская конфигурация

Поведение HAMi можно настроить через valuesOverride в конфигурации расширения:

addons:
  hami:
    enabled: true
    valuesOverride:
      hami:
        devicePlugin:
          deviceSplitCount: 10
          deviceMemoryScaling: 1
        scheduler:
          defaultSchedulerPolicy:
            nodeSchedulerPolicy: binpack
            gpuSchedulerPolicy: spread

Все параметры ниже указываются относительно ключа valuesOverride.hami, показанного в примере выше.

ПараметрОписаниеПо умолчанию
devicePlugin.deviceSplitCountМаксимальное количество виртуальных GPU на один физический GPU10
devicePlugin.deviceMemoryScalingКоэффициент избыточности для памяти (>1.0 включает избыточность)1
scheduler.defaultSchedulerPolicy.nodeSchedulerPolicyСтратегия размещения по нодам: binpack или spreadbinpack
scheduler.defaultSchedulerPolicy.gpuSchedulerPolicyСтратегия размещения по GPU: binpack или spreadspread

Известные ограничения

Совместимость с glibc

HAMi-core использует приватный символ glibc (_dl_sym), который был удален в glibc 2.34. Это влияет только для образов контейнеров рабочей нагрузки — собственные компоненты HAMi и host OS не затрагиваются.

Base imageglibcИзоляция
Ubuntu 20.042.31Полная (memory + compute)
Ubuntu 22.042.35Только изоляция памяти (Изоляция вычислительных ресурсов завершается неявной ошибкой)
Ubuntu 24.042.39Изоляции нет (HAMi-core тихо не загружается)
Alpine (musl)N/AНесовместим

Разница в поведении Ubuntu 22.04 и 24.04 основана на upstream-тестировании — подробности см. в HAMi-core #174.

Большинство актуальных образов CUDA 12.x и PyTorch 2.x используют Ubuntu 22.04+, поэтому изоляция вычислительных ресурсов с ними работать не будет. Для полной изоляции используйте образа на базе Ubuntu 20.04 или старше, пока не будет принят upstream fix.

Alpine / musl libc

HAMi-core несовместим с musl libc. Поддерживаются только образа контейнеров на базе glibc (Debian, Ubuntu, RHEL).