Перейти к содержимому

Установка и настройка GPU Operator

GPU Operator — это инструмент, который автоматизирует развертывание и управление всеми компонентами, необходимыми для работы GPU в кластере Managed Kubernetes (драйверы, Container Toolkit, Device Plugin, DCGM и другие). GPU Operator избавляет администратора от ручной настройки каждого узла с GPU, позволяя управлять GPU-ресурсами так же просто, как и узлами на основе ВМ Compute.

В состав GPU Operator входит Multi-Instance GPU (MIG) — технология NVIDIA, позволяющая разделить один физический GPU на несколько изолированных инстансов (экземпляров) с собственными вычислительными ресурсами и памятью. Компонент MIG Manager автоматизирует настройку MIG на узлах.

Чтобы начать работу с GPU Operator в кластере Managed Kubernetes:

  1. Выберите и установите одну из стандартных стратегий разделения ресурсов GPU.

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

  2. (опционально) Отключите MIG, если вам больше не нужно разделение GPU на отдельные инстансы.

  1. Для прохождения руководства вам понадобится устройство, поддерживающее работу с командной строкой. Используйте личный компьютер или создайте промежуточную ВМ в той же сети, где расположен кластер Managed Kubernetes.
  2. Создайте кластер Managed Kubernetes подходящей вам конфигурации в зоне доступности ru-central1-a.
  3. Создайте группу узлов с GPU подходящей вам конфигурации. В этом руководстве в качестве примера используется группа узлов из двух GPU A100-SXM4-80GB.
  4. Настройте подключение к кластеру подходящим вам способом.
Примечание

MWS Cloud Platform предоставляет одну актуальную версию GPU Operator, а также самостоятельно отслеживает и обновляет эту версию. Это связано с блокировкой официальных репозиториев NVIDIA на территории РФ.

  1. Создайте файл values.yaml с конфигурацией GPU Operator и MIG:

    yaml
    operator:
    repository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidia
    image: gpu-operator
    version: "v26.7.0"
    validator:
    repository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidia
    image: gpu-operator
    version: "v26.7.0"
    plugin:
    env:
    - name: WITH_WORKLOAD
    value: "true"
    nfd:
    nodeFeatureDiscovery:
    image:
    repository: registry.mwsapis.ru/mws-mk8s-images/customer/nfd/node-feature-discovery
    tag: "v0.19.0"
    gfd:
    enabled: true
    repository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidia
    image: k8s-device-plugin
    version: "v0.20.0"
    driver:
    enabled: true
    repository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidia
    image: driver
    version: "595.91.07"
    manager:
    repository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidia/cloud-native
    image: k8s-driver-manager
    version: "v0.12.0"
    upgradePolicy:
    drain:
    enable: true
    force: true
    deleteEmptyDir: true
    gpuPodDeletion:
    force: true
    toolkit:
    enabled: true
    repository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidia/k8s
    image: container-toolkit
    version: "v1.20.0"
    devicePlugin:
    enabled: true
    repository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidia
    image: k8s-device-plugin
    version: "v0.20.0"
    dcgm:
    enabled: true
    repository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidia/cloud-native
    image: dcgm
    version: "4.6.0-1-ubuntu24.04"
    dcgmExporter:
    enabled: false
    repository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidia/k8s
    image: dcgm-exporter
    version: "4.6.0-4.8.3-distroless"

    Здесь:

    • WITH_REBOOT со значением true — автоматическая перезагрузка узла для корректного применения геометрии MIG при обновлении.
    • driver.upgradePolicy.* — автоматическая очистка узлов (drain) и принудительное удаление подов при обновлении драйвера.
    • dcgmExporter.enabled — экспортер для сбора метрик с GPU-карт. По умолчанию сбор метрик отключен.
  2. Установите GPU Operator:

    bash
    helm upgrade --install gpu-operator \
    oci://registry.mwsapis.ru/mws-mk8s-images/customer/charts/gpu-operator \
    --version v26.7.0 \
    --namespace gpu-operator \
    --create-namespace \
    -f values.yaml
  3. Убедитесь, что все поды GPU Operator перешли в состояние Running:

    bash
    kubectl get pods -n gpu-operator
  4. Убедитесь, что на узел добавлены метки nvidia.com/gpu.present:

    bash
    kubectl get node -o json | jq '.items[] | select(.metadata.labels | has("nvidia.com/gpu.present")) | {
    "node": .metadata.name,
    "nvidia.com/gpu.present": .metadata.labels["nvidia.com/gpu.present"],
    "nvidia.com/gpu.product": .metadata.labels["nvidia.com/gpu.product"],
    "nvidia.com/mig.capable": .metadata.labels["nvidia.com/mig.capable"],
    "nvidia.com/mig.config": .metadata.labels["nvidia.com/mig.config"],
    "nvidia.com/mig.config.state": .metadata.labels["nvidia.com/mig.config.state"],
    "nvidia.com/mig.strategy": .metadata.labels["nvidia.com/mig.strategy"]
    }'

    Ожидаемый результат для одного узла:

    yaml
    {
    "node": "<имя узла>",
    "nvidia.com/gpu.present": "true",
    "nvidia.com/gpu.product": "NVIDIA-A100-80GB-PCIe",
    "nvidia.com/mig.capable": "true",
    "nvidia.com/mig.config": "all-disabled",
    "nvidia.com/mig.config.state": "success",
    "nvidia.com/mig.strategy": "single"
    }

Компонент MIG Manager автоматически создает конфигурацию MIG во время запуска, опрашивая доступные GPU через NVML. Результат записывается в ресурс ConfigMap вида <имя узла>-mig-config для каждого узла.

Конфигурация включает в себя профили — готовые пресеты, которые MIG применит ко всем GPU на узле. MIG Manager создает стандартные профили:

  • (по умолчанию) all-disabled — MIG отключен, GPU работает как одно устройство. Полезно, если ваши задачи требуют полной мощности GPU.

  • all-enabled — GPU будет разделен на максимально возможное количество инстансов. Например, для GPU A100 80 Гб будет создано 7 инстансов 1g.10gb. Один вычислительный блок GPU резервируется для управления устройством и не может быть использован. Этот профиль подойдет для тестирования или обработки легких запросов.

  • Профили вида all-2g.20gb — GPU будет разделен на количество инстансов, указанное в параметре профиля. Например, GPU A100 80 ГБ будет разделен на 3 инстанса, каждый из которых будет содержать 2 вычислительных блока и 20 Гб видеопамяти. Подробнее о доступных профилях для GPU читайте в документации NVIDIA.

  • all-balanced — сбалансированный профиль. GPU будет разделен на инстансы, включающие в себя оптимальное количество вычислительных блоков и видеопамяти. К примеру, GPU A100 80 Гб может быть разделен на инстансы 1g.10gb, 2g.10gb, 3g.40gb или 4g.40gb (в примере приведен не полный список комбинаций). Такой профиль подойдет, например, когда модель машинного обучения не помещается в минимальные 10 Гб, но и не требует ресурсов целого GPU.

После установки MIG узлам автоматически присваивается метка с профилем nvidia.com/mig.config: all-disabled. Это означает, что по умолчанию MIG не задействован.

Чтобы включить MIG, перейдите в следующий подраздел руководства.

3. Выберите и установите стратегию применения профилей

Заголовок раздела «3. Выберите и установите стратегию применения профилей»

MIG поддерживает стратегии применения профилей — правила, по которым профили будут применяться к GPU в кластере. Доступно две стратегии:

  • Стратегия single (устанавливается по умолчанию) — ко всем узлам с GPU будет применен один профиль.

  • Стратегия mixed — к узлам с GPU будут применены различные профили.

    Например, вы планируете использовать узел с GPU NVIDIA A100 80GB как для работы с простыми моделями, так и для обработки сложных запросов. MIG Manager в режиме стратегии mixed может распределить ресурсы так:

    • 3 инстанса с профилем 1g.10gb — для простых задач;
    • 1 инстанс с профилем 3g.40gb — для ресурсоемких задач.

Если инстанс не справляется с нагрузкой, вы можете динамически переключить профили MIG — это позволит выделить инстансам дополнительные ресурсы. А если созданные при установке MIG стандартные профили вам не подходят, вы можете создать собственный.

Следуя этой стратегии, MIG Manager применит один профиль ко всем GPU в кластере. В примере ниже применяется профиль all-1g.10gb.

Чтобы применить стратегию single и один профиль для всех GPU:

  1. Установите стратегию single в политике кластера:

    bash
    kubectl patch clusterpolicies.nvidia.com/cluster-policy \
    --type='json' \
    -p='[{"op":"replace", "path":"/spec/mig/strategy", "value":"single"}]'
  2. Назначьте узлу метку профиля all-1g.10gb:

    bash
    kubectl label nodes <имя узла> nvidia.com/mig.config=all-1g.10gb --overwrite

    MIG Manager завершит работу текущих GPU-подов и сформирует запрашиваемую геометрию.

  3. Убедитесь, что новая конфигурация узла применена:

    bash
    kubectl get node <имя узла> -o=jsonpath='{.metadata.labels}' | jq '."nvidia.com/mig.config.state"'

    Ожидаемый результат:

    bash
    nvidia.com/mig.config.state: success
  4. (опционально) Проверьте создание MIG-устройства. Для этого запустите команду:

    bash
    kubectl exec -it -n gpu-operator ds/nvidia-driver-daemonset -- nvidia-smi -L

    Эта команда запустит утилиту nvidia-smi внутри контейнера драйвера. Вывод команды покажет список всех физических GPU и их MIG-инстансов.

    Пример вывода:

    bash
    GPU 0: A100-SXM4-80GB (MIG 1g.10gb) UUID: MIG-<инстанс 1>
    GPU 0: A100-SXM4-80GB (MIG 1g.10gb) UUID: MIG-<инстанс 2>
    GPU 0: A100-SXM4-80GB (MIG 1g.10gb) UUID: MIG-<инстанс 3>
    ...

Следуя этой стратегии, MIG Manager применит разные профили к одному или нескольким GPU. Это даст максимальную гибкость: узел сможет обрабатывать как легкие, так и тяжелые запросы.

Чтобы применить стратегию mixed и разные профили для разных GPU:

  1. Установите стратегию mixed в политике кластера:

    bash
    kubectl patch clusterpolicies.nvidia.com/cluster-policy \
    --type='json' \
    -p='[{"op":"replace", "path":"/spec/mig/strategy", "value":"mixed"}]'
  2. Назначьте узлу метку сбалансированного профиля:

    bash
    kubectl label nodes <имя узла> nvidia.com/mig.config=all-balanced --overwrite

(опционально) Динамическая переконфигурация MIG

Заголовок раздела «(опционально) Динамическая переконфигурация MIG»

MIG Manager поддерживает горячее изменение геометрии узла. Чтобы переключить узел, например, на профиль 3g.40gb, выполните команду:

bash
kubectl label nodes <имя узла> nvidia.com/mig.config=all-3g.40gb --overwrite

Отслеживать изменение можно с помощью команды:

bash
kubectl logs -n gpu-operator -l app=nvidia-mig-manager -c nvidia-mig-manager

(опционально) Использование пользовательского ConfigMap

Заголовок раздела «(опционально) Использование пользовательского ConfigMap»

Если стандартные профили вам не подходят, вы можете передать собственную конфигурацию:

  • с помощью Helm — через настройку файла values.yaml;
  • вручную с помощью kubectl — через создание и применение отдельного ресурса ConfigMap.

В этом руководстве при установке GPU Operator создается несколько пользовательских профилей: custom-mixed-dual, balanced-dual и asymmetric-dual.

Настройки каждого профиля указаны в секции config.data.config.yaml.mig-configs файла values.yaml:

  • devices:
    • all — настройки для всех доступных GPU;
    • [0] или [1] — настройки только для первого или второго GPU на узле;
    • [0,1] — настройки только для первого и второго GPU (для случаев, если на узле больше двух GPU);
  • mig-enabled — включен ли MIG для выбранных GPU, true или false;
  • mig-devices — настройки профиля для выбранных GPU: количество вычислительных блоков, объем видеопамяти и количество инстансов с такими настройками.

В профиле custom-mixed-dual:

yaml
custom-mixed-dual:
- devices: [0, 1]
mig-enabled: true
mig-devices:
"3g.40gb": 1
"2g.20gb": 1
"1g.10gb": 2
  • используется первый и второй GPU;
  • MIG включен;
  • каждый GPU разделен на один инстанс 3g.40gb, один инстанс 2g.20gb и два инстанса 1g.10gb.

В профиле balanced-dual создаются два инстанса 3g.40gb на всех GPU, даже если их будет больше двух:

yaml
balanced-dual:
- devices: all
mig-enabled: true
mig-devices:
"3g.40gb": 2

В профиле asymmetric-dual первый и второй GPU будут разделены на неоднородные инстансы — они будут различаться по производительности и количеству:

yaml
asymmetric-dual:
- devices: [0]
mig-enabled: true
mig-devices:
"3g.40gb": 2
- devices: [1]
mig-enabled: true
mig-devices:
"1g.10gb": 7

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

  • Helm
  • kubectl
  1. Добавьте структуру нужной вам конфигурации в файл values.yaml:

    yaml
    mig:
    strategy: mixed
    migManager:
    enabled: true
    repository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidia/cloud-native
    image: k8s-mig-manager
    version: "v0.15.0"
    imagePullPolicy: IfNotPresent
    imagePullSecrets: []
    env:
    - name: WITH_REBOOT
    value: "true"
    config:
    name: custom-mig-config
    create: true
    data:
    config.yaml: |-
    version: v1
    mig-configs:
    all-disabled:
    - devices: all
    mig-enabled: false
    custom-mixed-dual:
    - devices: [0, 1]
    mig-enabled: true
    mig-devices:
    "3g.40gb": 1
    "2g.20gb": 1
    "1g.10gb": 2
    balanced-dual:
    - devices: all
    mig-enabled: true
    mig-devices:
    "3g.40gb": 2
    asymmetric-dual:
    - devices: [0]
    mig-enabled: true
    mig-devices:
    "3g.40gb": 2
    - devices: [1]
    mig-enabled: true
    mig-devices:
    "1g.10gb": 7
  2. Обновите GPU Operator, используя новый файл с конфигурацией:

    bash
    helm upgrade --install gpu-operator \
    oci://registry.mwsapis.ru/mws-mk8s-images/customer/charts/gpu-operator \
    --version v26.7.0 \
    --namespace gpu-operator \
    --create-namespace \
    -f values.yaml
  3. Назначьте узлу метку созданного вами профиля:

    bash
    kubectl label nodes <имя узла> nvidia.com/mig.config=custom-mixed-dual --overwrite
  4. Проверьте применение новой конфигурации с помощью команд:

    bash
    kubectl get node <имя узла> -o json | jq '.status.allocatable | with_entries(select(.key | startswith("nvidia.com")))'

    Ожидаемый вывод этой команды: для одного узла — 4, для двух узлов — 8.

    bash
    kubectl exec -it -n gpu-operator ds/nvidia-driver-daemonset -- nvidia-smi -L

    Вывод этой команды покажет список всех физических GPU и их MIG-инстансов.

  1. Узнайте, какая метка nvidia.com/gpu.product назначена для узла с GPU:

    bash
    kubectl get node -o json | jq '.items[] | select(.metadata.labels | has("nvidia.com/gpu.present")) | {
    "node": .metadata.name,
    "nvidia.com/gpu.product": .metadata.labels["nvidia.com/gpu.product"]
    }'

    Пример вывода команды:

    bash
    {
    "node": "<имя узла>",
    "nvidia.com/gpu.product": "NVIDIA-A100-SXM4-80GB"
    }
  2. Запустите одиночный под vectoradd-cuda11.2.1, указав в манифесте пода запрос на ресурс и фильтрацию узла через параметр nodeSelector, метка для которого была получена на предыдущем шаге.

    bash
    cat << EOF | kubectl create -f -
    apiVersion: v1
    kind: Pod
    metadata:
    name: cuda-vectoradd
    spec:
    restartPolicy: OnFailure
    containers:
    - name: vectoradd
    image: nvidia/samples:vectoradd-cuda11.2.1
    resources:
    limits:
    nvidia.com/gpu: 1
    nodeSelector:
    nvidia.com/gpu.product: NVIDIA-A100-SXM4-80GB
    EOF

    Под выполнит ряд проверок и завершит работу самостоятельно.

  3. Убедитесь, что под успешно запустился:

    bash
    kubectl describe pod cuda-vectoradd

    Ожидаемый результат:

    bash
    ...
    Normal Scheduled ... Successfully assigned default/cuda-vectoradd to node-gpu-01
    Normal Pulled ... Container image "nvidia/samples:vectoradd-cuda11.2.1" already present on machine
    Normal Started ... Started container vectoradd
  4. Когда под завершит работу, проверьте лог контейнера:

    bash
    kubectl logs cuda-vectoradd

    Если проверка прошла успешно, в логе пода будет выведено сообщение:

    bash
    ...
    [Vector addition of 50000 elements]
    Copy input data from the host memory to the CUDA device
    CUDA kernel launch with 196 blocks of 256 threads
    Copy output data from the CUDA device to the host memory
    Test PASSED
    Done

Проверки, которые выполняет под в процессе работы, отражены в таблице ниже:

Критерий проверкиУспешная проверкаОшибка
GPU Operator работаетПод успешно выполнился и завершил работуПод остается в статусе pending
Device Plugin зарегистрировал GPUPod получил ресурс nvidia.com/gpu: 1Под не получил запрашиваемый ресурс и остается в статусе pending
MIG настроен корректноПод запланирован именно на инстанс A100-SXM4-80GB-MIG-1g.10gbМетка nvidia.com/gpu.product не содержит суффикс с именем инстанса (-MIG-1g.10gb), под не находит узел
Container Toolkit пробрасывает устройствоСообщение Test PASSED в логе подаПод остается в статусе pending, в логе нет сообщения Test PASSED
Изоляция GPU работаетНесколько подов, запущенных одновременно, используют разные MIG-инстансы-

5. (опционально) Запустите параллельные задачи Argo Workflows

Заголовок раздела «5. (опционально) Запустите параллельные задачи Argo Workflows»

Вы можете запустить несколько параллельных задач CUDA на устройствах MIG с помощью инструмента Argo Workflows.

  1. Установите Argo CLI на ваше устройство.

  2. Установите Argo Workflows в кластер Managed Kubernetes:

    bash
    kubectl create ns argo && \
    kubectl apply -n argo -f https://raw.githubusercontent.com/argoproj/argo-workflows/stable/manifests/quick-start-postgres.yaml
    Важно

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

  3. Создайте файл vector-add.yaml с манифестом сценария Argo Workflow:

    yaml
    apiVersion: argoproj.io/v1alpha1
    kind: Workflow
    metadata:
    generateName: argo-mig-example-
    spec:
    entrypoint: argo-mig-result-example
    templates:
    - name: argo-mig-result-example
    steps:
    - - name: generate
    template: gen-mig-device-list
    - - name: argo-mig
    template: argo-mig
    arguments:
    parameters:
    - name: argo-mig
    value: "{{item}}"
    withParam: "{{steps.generate.outputs.result}}"
    - name: gen-mig-device-list
    script:
    image: python:3-alpine
    command: [python]
    source: |
    import json
    import sys
    json.dump([i for i in range(0, 2)], sys.stdout)
    - name: argo-mig
    retryStrategy:
    limit: 10
    retryPolicy: "Always"
    inputs:
    parameters:
    - name: argo-mig
    container:
    image: nvidia/samples:vectoradd-cuda11.2.1
    resources:
    limits:
    nvidia.com/gpu: 1
    nodeSelector:
    nvidia.com/gpu.product: <название GPU и инстанса, в формате A100-SXM4-40GB-MIG-3g.20gb>
  4. Запустите Argo Workflow, используя флаг --watch для наблюдения за выполнением команды в реальном времени:

    bash
    argo submit -n argo --watch vector-add.yaml

    В процессе выполнения команды будут созданы два пода с тестовыми CUDA-задачами. Каждый под будет запланирован на отдельном MIG-инстансе. Когда поды завершат выполнение тестовых задач, Argo Workflow автоматически завершит работу и сообщит об успешном выполнении:

    bash
    Name: argo-mig-example-xyz78
    Namespace: argo
    ServiceAccount: default
    Status: Succeeded
    Created: ...
    Started: ...
    Duration: 1m 20s
    Progress: 2/2

Если вам больше не нужно разделение GPU на инстансы, вы можете отключить MIG:

bash
kubectl label nodes <имя узла> nvidia.com/mig.config=all-disabled --overwrite

Ресурсы, созданные в руководстве, тарифицируются. Если вы больше не планируете использовать их:

  1. Если вы создавали виртуальную машину, удалите ее.