Для улучшения работы сайта мы используем файлы cookies. Оставаясь на сайте, вы соглашаетесь с политикой обработки персональных данных.

Nova AI. Пользовательские сценарии

1. MIG

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

Для H100 доступно несколько профилей. В качестве примера в данной статье рассмотрен профиль all-3g.40gb (2 GPU-юнита, 40 ГБ памяти на каждый экземпляр MIG).

  1. Настройте конфигурацию MIG в GPU Operator. Отредактируйте ConfigMap mig.config в namespace nova-nvidia-gpu-operator, добавив следующий блок в поле data файла config.yaml:

      all-3g.40gb:
        - devices: all
          mig-enabled: true
          mig-devices:
            "3g.40gb": 2
  2. Откройте Nova Console. В меню выберите Узлы кластера → Nodes.

  3. Перейдите на целевой узел с H100 и откройте раздел YAML.

  4. Установите метку nvidia.com/mig.config: all-3g.40gb. Сохраните изменения и подождите 1-2 минуты.

  5. Откройте раздел Терминал и введите в консоли команду:

    chroot /host
    nvidia-smi

    В результате выполнения команды отобразится информация о видеокарте: существующие профили MIG, текущая загрузка и запущенные процессы.

    ai scenario 1
  6. Проверьте значение аннотации у целевого узла H100. Значение nvidia.com/gpu.replicas должно быть равно 2.

  7. Если вы хотите выключить ранее примененное разделение GPU, то необходимо установить значение метки nvidia.com/mig.config на этом узле на all-disabled. Подождите несколько минут, пока изменения вступят в силу.

Для более детальной настройки MIG обратитесь к официальной документации.

2. Time-Slicing

Time-Slicing — это технология, которая позволяет нескольким процессам использовать один графический процессор (GPU) посредством быстрого переключения контекстов между ними. Каждому процессу отводится фиксированный квант времени, который распределяется между процессами по циклическому алгоритму. Память графического процессора при этом остается общей для всех процессов.

  1. Настройте конфигурацию Time-Slicing в GPU Operator. Отредактируйте ConfigMap time-slicing-config в namespace nova-nvidia-gpu-operator, добавив следующий блок в поле data файла config.yaml:

      h100-80gb: |-
        version: v1
        flags:
          migStrategy: none
        sharing:
          timeSlicing:
            resources:
            - name: nvidia.com/gpu
              replicas: 2
  2. Откройте Nova Console. В меню выберите Узлы кластера → Nodes.

  3. Перейдите на целевой узел с H100 и откройте раздел YAML.

  4. Установите метку nvidia.com/device-plugin.config: h100-80gb. Сохраните изменения и подождите 1-2 минуты.

  5. Проверьте значение аннотации у целевого узла с H100. Значение nvidia.com/gpu.replicas должно быть равно 2.

  6. Если вы хотите выключить ранее примененное разделение GPU, то необходимо установить значение метки nvidia.com/device-plugin.config на этом узле на default. Подождите несколько минут, пока изменения вступят в силу.

Для более детальной настройки Time-Slicing обратитесь к официальной документации.

3. MPS

MPS (Multi-Process Service) — механизм совместного использования GPU, позволяющий нескольким процессам одновременно использовать один ускоритель за счет общего CUDA-контекста. Этот подход обеспечивает лучшую изоляцию памяти по сравнению с Time-Slicing, но не дает такой строгой изоляции ресурсов, как MIG.

  1. В режиме MPS количество одновременных реплик GPU ограничено 48. Отредактируйте ConfigMap time-slicing-config в namespace nova-nvidia-gpu-operator, добавив следующий блок в поле data файла config.yaml:

      2-slices-mps-config: |-
        version: v1
        flags:
          migStrategy: none
        sharing:
          mps:
            renameByDefault: false
            resources:
              - name: nvidia.com/gpu
                replicas: 2
  2. Откройте Nova Console. В меню выберите Узлы кластера → Nodes.

  3. Перейдите на целевой узел с H100 и откройте раздел YAML.

  4. Установите метку nvidia.com/device-plugin.config: 2-slices-mps-config. Сохраните изменения и подождите 1-2 минуты. В namespace nova-nvidia-gpu-operator будет создан под. nvidia-device-plugin-mps-control-daemon, который размещается на целевом узле.

  5. Проверьте значение аннотации у целевого узла с H100. Значение nvidia.com/gpu.replicas должно быть равно 2.

  6. Если вы хотите выключить ранее примененное разделение GPU, то необходимо установить значение метки nvidia.com/device-plugin.config на этом узле на default. Подождите несколько минут, пока изменения вступят в силу.

Для более детальной настройки MPS обратитесь к официальной документации.

4. Динамическое дробление GPU с помощью Volcano

Для эффективного использования GPU-ресурсов в Nova AI Volcano поддерживает динамическое дробление физических видеокарт на виртуальные GPU-экземпляры. Пользователь описывает требования непосредственно на уровне workload — например, необходимый объем видеопамяти и вычислительных ресурсов, — а Volcano совместно с Volcano vGPU Device Plugin подбирает подходящее размещение и выделяет необходимую часть видеокарты контейнеру. Такой подход позволяет нескольким Pod’ам совместно использовать одну физическую GPU, избегая резервирования целой видеокарты для небольшой задачи и повышая общую утилизацию ускорителей.

Для включения данного функционала необходимо в манифесте MLInfrastructure указать spec.volcano.VGPUDevicePlugin.enabled: true.

После успешной установки MLInfrastructure в ConfigMap nova-volcano-scheduler-configmap в namespace nova-ml-volcano необходимо активировать плагин deviceshare, добавив следующий объект в блок tiers:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nova-volcano-scheduler-configmap
  namespace: nova-ml-volcano
  labels:
    app.kubernetes.io/name: nova-volcano
    app.kubernetes.io/instance: nova-volcano-scheduler
    app.kubernetes.io/version: 1.13.1
    app.kubernetes.io/managed-by: Nova
data:
  volcano-scheduler.conf: |
    actions: "enqueue, allocate, backfill"
    tiers:
    - plugins:
      - name: priority
      - name: gang
        enablePreemptable: false
      - name: conformance
      - name: overcommit
      - name: predicates
      - name: proportion
      - name: nodeorder
      - name: binpack
    # Add the block below
    - plugins:
      - name: deviceshare
        arguments:
          deviceshare.VGPUEnable: true
          deviceshare.SchedulePolicy: binpack # Either binpack or spread
          deviceshare.KnownGeometriesCMNamespace: nova-ml-volcano
          deviceshare.KnownGeometriesCMName: nova-volcano-vgpu-device-config

Теперь в кластере доступен ресурс volcano.sh/vgpu-number. По умолчанию используется технология HaMi-Core для деления видеокарт. Она поддерживается всеми архитектурами NVIDIA GPU. В качестве примера запустите нагрузку ниже, запрашивающую только часть памяти GPU.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: python-executor-4
spec:
  replicas: 1
  selector:
    matchLabels:
      app: python-executor
  template:
    metadata:
      labels:
        app: python-executor
    spec:
      schedulerName: volcano
      containers:
      - name: executor
        image: python:3.12.12
        command: ["python", "-c", "import time; time.sleep(10**9)"]
        resources:
          limits:
            volcano.sh/vgpu-number: 1
            volcano.sh/vgpu-memory: 5000

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

  1. Отредактируйте ConfigMap nova-volcano-vgpu-device-config в namespace nova-ml-volcano, добавив в него поддерживаемые MIG-профили для нужных видеокарт в поле knownMigGeometries:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: nova-volcano-vgpu-device-config
      namespace: nova-ml-volcano
      labels:
        app.kubernetes.io/name: nova-volcano
        app.kubernetes.io/instance: nova-volcano-device-plugin
        app.kubernetes.io/version: 1.11.0
        app.kubernetes.io/managed-by: Nova
    data:
      device-config.yaml: |-
        nvidia:
          resourceCountName: volcano.sh/vgpu-number
          resourceMemoryName: volcano.sh/vgpu-memory
          resourceCoreName: volcano.sh/vgpu-cores
          overwriteEnv: false
          defaultMemory: 0
          defaultCores: 0
          defaultGPUNum: 1
          deviceSplitCount: 10
          deviceMemoryScaling: 1
          deviceCoreScaling: 1
          gpuMemoryFactor: 1
          knownMigGeometries:
          - models: [ "NVIDIA-NVIDIA H100 80GB HBM3", "NVIDIA H100 80GB HBM3" ]
            allowedGeometries:
              - group: group1
                geometries:
                - name: 1g.10gb
                  memory: 10240
                  count: 7
              - group: group2
                geometries:
                - name: 1g.20gb
                  memory: 20480
                  count: 4
              - group: group3
                geometries:
                - name: 2g.20gb
                  memory: 20480
                  count: 3
              - group: group4
                geometries:
                - name: 3g.40gb
                  memory: 40960
                  count: 2
              - group: group5
                geometries:
                - name: 4g.40gb
                  memory: 40960
                  count: 1
              - group: group6
                geometries:
                - name: 7g.80gb
                  memory: 80896
                  count: 1
  2. Отредактируйте ConfigMap nova-volcano-vgpu-node-config в namespace nova-ml-volcano, добавив в config.json названия узлов, на которых необходимо разделить видеокарты с помощью MIG:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: nova-volcano-vgpu-node-config
      namespace: nova-ml-volcano
      labels:
        app.kubernetes.io/name: nova-volcano
        app.kubernetes.io/instance: nova-volcano-device-plugin
        app.kubernetes.io/version: 1.11.0
        app.kubernetes.io/managed-by: Nova
    data:
      config.json: |
        {
          "nodeconfig": [
            {
              "name": "<node-name>",
              "operatingmode": "mig",
              "devicememoryscaling": 1.0
            }
          ]
        }

После этого для указанных узлов будет использоваться MIG для деления видеокарт. В качестве примера тестовой нагрузки можно использовать манифест выше.

Подробнее ознакомиться с динамическим дроблением GPU при помощи Volcano можно в официальной документации данного планировщика:

5. Пример запуска модели через KServe

В качестве примера для быстрого запуска модели через KServe используйте следующий манифест InferenceService:

apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  name: qwen25-32b
  namespace: nova-ml-kserve
spec:
  predictor:
    model:
      modelFormat:
        name: huggingface
      storageUri: <URL_модели>
      args:
        - "--model_name=qwen25-32b"
      resources:
        requests:
          cpu: "4"
          memory: 24Gi
          nvidia.com/gpu: "1"
        limits:
          cpu: "8"
          memory: 26Gi
          nvidia.com/gpu: "1"

Для более детальной настройки обратитесь к официальной документации KServe.

6. Пример запуска модели через KubeRay

В качестве примера для быстрого запуска модели через KubeRay с использованием библиотеки Ray Serve используйте следующий манифест KubeRay:

apiVersion: ray.io/v1
kind: RayService
metadata:
  name: qwen
  namespace: nova-ml-kuberay
spec:
  rayClusterConfig:
    headGroupSpec:
      rayStartParams:
        dashboard-host: 0.0.0.0
        include-dashboard: 'true'
        num-cpus: '2'
        num-gpus: '0'
      template:
        spec:
          containers:
            - image: 'rayproject/ray-llm:2.52.0-py311-cu128'
              name: ray-head
              ports:
                - containerPort: 8000
                  name: serve
                  protocol: TCP
                - containerPort: 8080
                  name: metrics
                  protocol: TCP
                - containerPort: 6379
                  name: gcs
                  protocol: TCP
                - containerPort: 8265
                  name: dashboard
                  protocol: TCP
                - containerPort: 10001
                  name: client
                  protocol: TCP
              resources:
                limits:
                  cpu: '2'
                  memory: 5Gi
                requests:
                  cpu: '2'
                  memory: 4Gi
    rayVersion: 2.52.0
    workerGroupSpecs:
      - groupName: gpu-group
        maxReplicas: 1
        minReplicas: 1
        numOfHosts: 1
        rayStartParams:
          num-cpus: '4'
          num-gpus: '1'
        replicas: 1
        template:
          spec:
            containers:
              - env:
                  - name: HUGGING_FACE_HUB_TOKEN
                    valueFrom:
                      secretKeyRef:
                        key: hf_token
                        name: hf-token
                image: 'rayproject/ray-llm:2.52.0-py311-cu128'
                name: ray-worker
                resources:
                  limits:
                    cpu: '8'
                    memory: 16Gi
                    nvidia.com/gpu: '1'
                  requests:
                    cpu: '4'
                    memory: 8Gi
                    nvidia.com/gpu: '1'
  serveConfigV2: |
    applications:
      - name: llms
        import_path: ray.serve.llm:build_openai_app
        route_prefix: "/"
        args:
          llm_configs:
          - model_loading_config:
              model_id: <id_модели>
              model_source: <название_модели>
            engine_kwargs:
              dtype: bfloat16
              max_model_len: 1024
              gpu_memory_utilization: 0.45
            deployment_config:
              autoscaling_config:
                min_replicas: 1
                max_replicas: 4
                target_ongoing_requests: 64
              max_ongoing_requests: 128

Для более детальной настройки обратитесь к официальной документации Ray Serve.