Виртуализация ИИ-ускорителей#

Данная ИИ-функция автоматизирует планирование и распределение вычислительных ресурсов ускорителей между задачами, что позволяет эффективно разделять ресурсы ИИ-ускорителей различных типов (GPU, NPU и других) и повышать производительность обработки данных:

Сценарий позволяет пользователю:

  • совместно использовать один или несколько ИИ-ускорителей между несколькими pod;

  • ограничивать выделяемые ускорителем ресурсы по объему памяти и доле вычислительных ядер;

  • использовать существующие приложения без изменения их кода (нулевая модификация);

  • управлять конфигурацией Multi-Instance GPU (MIG) динамически.

Примечание

При использовании ИИ-функций DropApp соблюдайте правила работы пользователя с ИИ-функциями.

Предусловия#

Предварительными условиями выполнения сценария являются:

  • Развернутый кластер DropApp с установленным программным компонентом K8S Artificial Intelligence (K8SI).

  • Доступ к кластеру с правами, достаточными для просмотра состояния узлов, pod и ресурсов.

  • Наличие узлов с ИИ-ускорителями (GPU, NPU и другими), на которых развернут инструмент виртуализации HAMi.

  • Наличие метки gpu=on на узлах с ИИ-ускорителями, без которой узлы не смогут управляться планировщиком HAMi.

Сведения о HAMi и его установке — в разделе «HAMi» Руководства администратора.

Подготовка узлов с ИИ-ускорителями#

Отметьте узлы с ИИ-ускорителями для планирования с HAMi, добавив метку gpu=on. Без данной метки узлы не смогут управляться планировщиком.

Сценарий подготовки узлов:

  1. Отметьте ИИ-узел меткой gpu=on:

    kubectl label nodes <node_id> gpu=on
    
  2. Убедитесь, что pod HAMi (hami-device-plugin и hami-scheduler) в пространстве имен kube-system находятся в состоянии Running:

    kubectl get pods -n kube-system
    

    Если pod hami-device-plugin и hami-scheduler находятся в состоянии Running, HAMi готов к виртуализации ИИ-ускорителей.

Совместное использование ИИ-ускорителей#

HAMi обеспечивает совместное использование (шеринг) одного или нескольких ИИ-ускорителей между несколькими pod. Нагрузка запрашивает ускоритель с помощью стандартных ресурсов Kubernetes, указывая количество физических ускорителей и опциональные лимиты на объем памяти и долю вычислительных ядер.

Примечание

После установки HAMi значение ресурса nvidia.com/gpu, зарегистрированного на узле, по умолчанию соответствует количеству виртуальных GPU (vGPU). При запросе ресурсов в pod ресурс nvidia.com/gpu определяет количество физических GPU, необходимых текущему pod.

Сценарий совместного использования ИИ-ускорителя:

  1. Создайте pod, запрашивающий один физический GPU с ограничением по объему памяти и доле вычислительных ядер:

    apiVersion: v1
    kind: Pod
    metadata:
      name: gpu-pod
    spec:
      containers:
        - name: sberlinux-container
          image: sberlinux:9.8
          command: ["bash", "-c", "sleep 86400"]
          resources:
            limits:
              nvidia.com/gpu: 1
              nvidia.com/gpumem: 3000
              nvidia.com/gpucores: 30
    

    Где:

    • nvidia.com/gpu — количество физических GPU, необходимых для pod;

    • nvidia.com/gpumem — объем памяти GPU (в МиБ), который каждый физический GPU выделяет pod (опционально, целое число);

    • nvidia.com/gpucores — доля вычислительных ядер GPU (в процентах), которую каждый физический GPU выделяет pod (опционально, целое число).

  2. Примените манифест:

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Pod
    metadata:
      name: gpu-pod
    spec:
      containers:
        - name: sberlinux-container
          image: sberlinux:9.8
          command: ["bash", "-c", "sleep 86400"]
          resources:
            limits:
              nvidia.com/gpu: 1
              nvidia.com/gpumem: 3000
              nvidia.com/gpucores: 30
    EOF
    
  3. Убедитесь, что pod получил запрошенные ресурсы ускорителя:

    kubectl get pod gpu-pod -o json | jq '.spec.containers[0].resources'
    

    Если приложение внутри pod видит выделенный ресурс ускорителя, виртуализация настроена корректно. Один и тот же физический ускоритель может совместно использоваться несколькими pod в соответствии с политиками шеринга.

  4. После завершения проверки удалите тестовый pod:

    kubectl delete pod gpu-pod
    

Ограничение ресурсов ИИ-ускорителя#

HAMi позволяет ограничивать ресурсы, выделяемые ускорителем каждому pod, по объему памяти и доле вычислительных ядер. Это обеспечивает изоляцию ресурсов и предотвращает перегрузку совместно используемого оборудования.

Сценарий ограничения ресурсов:

  1. Создайте pod с ограничениями по памяти и вычислительным ядрам (пример манифеста — в подразделе «Совместное использование ИИ-ускорителей»).

  2. Примените манифест:

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Pod
    metadata:
      name: gpu-pod-limited
    spec:
      containers:
        - name: sberlinux-container
          image: sberlinux:9.8
          command: ["bash", "-c", "sleep 86400"]
          resources:
            limits:
              nvidia.com/gpu: 1
              nvidia.com/gpumem: 1500
              nvidia.com/gpucores: 20
    EOF
    
  3. Проверьте, что pod корректно запустился и получил запрошенные ограничения:

    kubectl get pod gpu-pod-limited
    
  4. Убедитесь, что несколько pod, запрашивающих доли одного физического ускорителя, могут выполняться одновременно:

    kubectl get pods | grep gpu-pod
    

    Если несколько pod находятся в состоянии Running и используют общий ускоритель, лимиты памяти и вычислительных ядер применены корректно.

  5. После завершения проверки удалите тестовый pod:

    kubectl delete pod gpu-pod-limited
    

Динамическое управление конфигурацией MIG#

HAMi поддерживает функцию dynamic-mig с использованием MIG Parted для динамической настройки MIG-устройств на узлах с поддержкой (начиная с архитектуры Ampere). Динамическое управление MIG позволяет создавать и выделять экземпляры MIG по требованию.

Примечание

По умолчанию режим MIG на GPU отключен. Перед применением MIG-конфигурации включите его с помощью команды nvidia-smi -i <gpu_id> -mig 1. Подробнее об управлении конфигурацией MIG — в разделе «Управление конфигурацией MIG» сценария использования ИИ-функции «Мониторинг и управление GPU-ресурсами».

Сценарий динамического управления конфигурацией MIG:

  1. Убедитесь, что функция dynamic-mig включена в конфигурации HAMi и узлы подготовлены для планирования (подраздел «Подготовка узлов с ИИ-ускорителями»).

  2. Создайте pod, запрашивающий MIG-устройство с указанием профиля:

    apiVersion: v1
    kind: Pod
    metadata:
      name: mig-pod
    spec:
      restartPolicy: Never
      containers:
        - name: cuda-container
          image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2
          resources:
            limits:
              nvidia.com/mig-1g.5gb: 1
    
  3. Примените манифест:

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Pod
    metadata:
      name: mig-pod
    spec:
      restartPolicy: Never
      containers:
        - name: cuda-container
          image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2
          resources:
            limits:
              nvidia.com/mig-1g.5gb: 1
    EOF
    
  4. Проверьте корректность запуска MIG-устройства:

    kubectl logs mig-pod
    
  5. После завершения проверки удалите тестовый pod:

    kubectl delete pod mig-pod
    

Результат#

Ожидаемым результатом являются:

  • подготовленность узлов с ИИ-ускорителями для планирования;

  • эффективное разделение ИИ-ускорителя между несколькими задачами с ограничением памяти и вычислительных ядер;

  • динамическое применение конфигурации MIG.