Nova AI. Пользовательские сценарии
1. MIG
MIG (Multi-Instance GPU) позволяет аппаратно разделить один физический графический процессор (GPU) на несколько изолированных экземпляров с гарантированными ресурсами памяти и вычислительной мощности. Этот подход позволяет одновременно запускать несколько моделей или сервисов на одном ускорителе.
Для H100 доступно несколько профилей. В качестве примера в данной статье рассмотрен профиль all-3g.40gb (2 GPU-юнита, 40 ГБ памяти на каждый экземпляр MIG).
-
Настройте конфигурацию MIG в GPU Operator. Отредактируйте ConfigMap
mig.configв namespacenova-nvidia-gpu-operator, добавив следующий блок в полеdataфайла config.yaml:all-3g.40gb: - devices: all mig-enabled: true mig-devices: "3g.40gb": 2 -
Откройте Nova Console. В меню выберите Узлы кластера → Nodes.
-
Перейдите на целевой узел с H100 и откройте раздел YAML.
-
Установите метку
nvidia.com/mig.config: all-3g.40gb. Сохраните изменения и подождите 1-2 минуты. -
Откройте раздел Терминал и введите в консоли команду:
chroot /host nvidia-smiВ результате выполнения команды отобразится информация о видеокарте: существующие профили MIG, текущая загрузка и запущенные процессы.
-
Проверьте значение аннотации у целевого узла H100. Значение
nvidia.com/gpu.replicasдолжно быть равно 2. -
Если вы хотите выключить ранее примененное разделение GPU, то необходимо установить значение метки
nvidia.com/mig.configна этом узле наall-disabled. Подождите несколько минут, пока изменения вступят в силу.
Для более детальной настройки MIG обратитесь к официальной документации.
2. Time-Slicing
Time-Slicing — это технология, которая позволяет нескольким процессам использовать один графический процессор (GPU) посредством быстрого переключения контекстов между ними. Каждому процессу отводится фиксированный квант времени, который распределяется между процессами по циклическому алгоритму. Память графического процессора при этом остается общей для всех процессов.
-
Настройте конфигурацию Time-Slicing в GPU Operator. Отредактируйте ConfigMap
time-slicing-configв namespacenova-nvidia-gpu-operator, добавив следующий блок в полеdataфайла config.yaml:h100-80gb: |- version: v1 flags: migStrategy: none sharing: timeSlicing: resources: - name: nvidia.com/gpu replicas: 2 -
Откройте Nova Console. В меню выберите Узлы кластера → Nodes.
-
Перейдите на целевой узел с H100 и откройте раздел YAML.
-
Установите метку
nvidia.com/device-plugin.config: h100-80gb. Сохраните изменения и подождите 1-2 минуты. -
Проверьте значение аннотации у целевого узла с H100. Значение
nvidia.com/gpu.replicasдолжно быть равно 2. -
Если вы хотите выключить ранее примененное разделение GPU, то необходимо установить значение метки
nvidia.com/device-plugin.configна этом узле наdefault. Подождите несколько минут, пока изменения вступят в силу.
Для более детальной настройки Time-Slicing обратитесь к официальной документации.
3. MPS
MPS (Multi-Process Service) — механизм совместного использования GPU, позволяющий нескольким процессам одновременно использовать один ускоритель за счет общего CUDA-контекста. Этот подход обеспечивает лучшую изоляцию памяти по сравнению с Time-Slicing, но не дает такой строгой изоляции ресурсов, как MIG.
-
В режиме MPS количество одновременных реплик GPU ограничено 48. Отредактируйте ConfigMap
time-slicing-configв namespacenova-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 -
Откройте Nova Console. В меню выберите Узлы кластера → Nodes.
-
Перейдите на целевой узел с H100 и откройте раздел YAML.
-
Установите метку
nvidia.com/device-plugin.config: 2-slices-mps-config. Сохраните изменения и подождите 1-2 минуты. В namespacenova-nvidia-gpu-operatorбудет создан под.nvidia-device-plugin-mps-control-daemon, который размещается на целевом узле. -
Проверьте значение аннотации у целевого узла с H100. Значение
nvidia.com/gpu.replicasдолжно быть равно 2. -
Если вы хотите выключить ранее примененное разделение 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 для деления видеокарт, дополнительно выполните следующие действия:
-
Отредактируйте ConfigMap
nova-volcano-vgpu-device-configв namespacenova-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 -
Отредактируйте ConfigMap
nova-volcano-vgpu-node-configв namespacenova-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.