Установка и настройка 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:
Выберите и установите одну из стандартных стратегий разделения ресурсов GPU.
В этом подразделе вы также узнаете, как динамически переконфигурировать MIG и как создать собственный профиль MIG с помощью пользовательского ConfigMap, адаптированного под ваши задачи.
(опционально) Запустите параллельные задачи Argo Workflows.
(опционально) Отключите MIG, если вам больше не нужно разделение GPU на отдельные инстансы.
Перед началом работы
Заголовок раздела «Перед началом работы»- Для прохождения руководства вам понадобится устройство, поддерживающее работу с командной строкой. Используйте личный компьютер или создайте промежуточную ВМ в той же сети, где расположен кластер Managed Kubernetes.
- Создайте кластер Managed Kubernetes подходящей вам конфигурации в зоне доступности
ru-central1-a. - Создайте группу узлов с GPU подходящей вам конфигурации. В этом руководстве в качестве примера используется группа узлов из двух GPU A100-SXM4-80GB.
- Настройте подключение к кластеру подходящим вам способом.
1. Установите GPU Operator
Заголовок раздела «1. Установите GPU Operator»Создайте файл
values.yamlс конфигурацией GPU Operator и MIG:yaml operator:repository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidiaimage: gpu-operatorversion: "v26.7.0"validator:repository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidiaimage: gpu-operatorversion: "v26.7.0"plugin:env:- name: WITH_WORKLOADvalue: "true"nfd:nodeFeatureDiscovery:image:repository: registry.mwsapis.ru/mws-mk8s-images/customer/nfd/node-feature-discoverytag: "v0.19.0"gfd:enabled: truerepository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidiaimage: k8s-device-pluginversion: "v0.20.0"driver:enabled: truerepository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidiaimage: driverversion: "595.91.07"manager:repository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidia/cloud-nativeimage: k8s-driver-managerversion: "v0.12.0"upgradePolicy:drain:enable: trueforce: truedeleteEmptyDir: truegpuPodDeletion:force: truetoolkit:enabled: truerepository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidia/k8simage: container-toolkitversion: "v1.20.0"devicePlugin:enabled: truerepository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidiaimage: k8s-device-pluginversion: "v0.20.0"dcgm:enabled: truerepository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidia/cloud-nativeimage: dcgmversion: "4.6.0-1-ubuntu24.04"dcgmExporter:enabled: falserepository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidia/k8simage: dcgm-exporterversion: "4.6.0-4.8.3-distroless"Здесь:
WITH_REBOOTсо значениемtrue— автоматическая перезагрузка узла для корректного применения геометрии MIG при обновлении.driver.upgradePolicy.*— автоматическая очистка узлов (drain) и принудительное удаление подов при обновлении драйвера.dcgmExporter.enabled— экспортер для сбора метрик с GPU-карт. По умолчанию сбор метрик отключен.
Установите 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Убедитесь, что все поды GPU Operator перешли в состояние
Running:bash kubectl get pods -n gpu-operatorУбедитесь, что на узел добавлены метки
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"}
2. Изучите настройки Multi-Instance GPU
Заголовок раздела «2. Изучите настройки Multi-Instance GPU»Компонент 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 стандартные профили вам не подходят, вы можете создать собственный.
Стратегия single
Заголовок раздела «Стратегия single»Следуя этой стратегии, MIG Manager применит один профиль ко всем GPU в кластере. В примере ниже применяется профиль all-1g.10gb.
Чтобы применить стратегию single и один профиль для всех GPU:
Установите стратегию
singleв политике кластера:bash kubectl patch clusterpolicies.nvidia.com/cluster-policy \--type='json' \-p='[{"op":"replace", "path":"/spec/mig/strategy", "value":"single"}]'Назначьте узлу метку профиля
all-1g.10gb:bash kubectl label nodes <имя узла> nvidia.com/mig.config=all-1g.10gb --overwriteMIG Manager завершит работу текущих GPU-подов и сформирует запрашиваемую геометрию.
Убедитесь, что новая конфигурация узла применена:
bash kubectl get node <имя узла> -o=jsonpath='{.metadata.labels}' | jq '."nvidia.com/mig.config.state"'Ожидаемый результат:
bash nvidia.com/mig.config.state: success(опционально) Проверьте создание 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>...
Стратегия mixed
Заголовок раздела «Стратегия mixed»Следуя этой стратегии, MIG Manager применит разные профили к одному или нескольким GPU. Это даст максимальную гибкость: узел сможет обрабатывать как легкие, так и тяжелые запросы.
Чтобы применить стратегию mixed и разные профили для разных GPU:
Установите стратегию
mixedв политике кластера:bash kubectl patch clusterpolicies.nvidia.com/cluster-policy \--type='json' \-p='[{"op":"replace", "path":"/spec/mig/strategy", "value":"mixed"}]'Назначьте узлу метку сбалансированного профиля:
bash kubectl label nodes <имя узла> nvidia.com/mig.config=all-balanced --overwrite
(опционально) Динамическая переконфигурация MIG
Заголовок раздела «(опционально) Динамическая переконфигурация MIG»MIG Manager поддерживает горячее изменение геометрии узла. Чтобы переключить узел, например, на профиль 3g.40gb, выполните команду:
kubectl label nodes <имя узла> nvidia.com/mig.config=all-3g.40gb --overwriteОтслеживать изменение можно с помощью команды:
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.
Создайте новую конфигурацию:
- Helm
- kubectl
Добавьте структуру нужной вам конфигурации в файл
values.yaml:yaml mig:strategy: mixedmigManager:enabled: truerepository: registry.mwsapis.ru/mws-mk8s-images/customer/nvidia/cloud-nativeimage: k8s-mig-managerversion: "v0.15.0"imagePullPolicy: IfNotPresentimagePullSecrets: []env:- name: WITH_REBOOTvalue: "true"config:name: custom-mig-configcreate: truedata:config.yaml: |-version: v1mig-configs:all-disabled:- devices: allmig-enabled: falsecustom-mixed-dual:- devices: [0, 1]mig-enabled: truemig-devices:"3g.40gb": 1"2g.20gb": 1"1g.10gb": 2balanced-dual:- devices: allmig-enabled: truemig-devices:"3g.40gb": 2asymmetric-dual:- devices: [0]mig-enabled: truemig-devices:"3g.40gb": 2- devices: [1]mig-enabled: truemig-devices:"1g.10gb": 7Обновите 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Назначьте узлу метку созданного вами профиля:
bash kubectl label nodes <имя узла> nvidia.com/mig.config=custom-mixed-dual --overwriteПроверьте применение новой конфигурации с помощью команд:
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-инстансов.
4. Запустите тестовую нагрузку
Заголовок раздела «4. Запустите тестовую нагрузку»Узнайте, какая метка
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"}Запустите одиночный под
vectoradd-cuda11.2.1, указав в манифесте пода запрос на ресурс и фильтрацию узла через параметрnodeSelector, метка для которого была получена на предыдущем шаге.bash cat << EOF | kubectl create -f -apiVersion: v1kind: Podmetadata:name: cuda-vectoraddspec:restartPolicy: OnFailurecontainers:- name: vectoraddimage: nvidia/samples:vectoradd-cuda11.2.1resources:limits:nvidia.com/gpu: 1nodeSelector:nvidia.com/gpu.product: NVIDIA-A100-SXM4-80GBEOFПод выполнит ряд проверок и завершит работу самостоятельно.
Убедитесь, что под успешно запустился:
bash kubectl describe pod cuda-vectoraddОжидаемый результат:
bash ...Normal Scheduled ... Successfully assigned default/cuda-vectoradd to node-gpu-01Normal Pulled ... Container image "nvidia/samples:vectoradd-cuda11.2.1" already present on machineNormal Started ... Started container vectoraddКогда под завершит работу, проверьте лог контейнера:
bash kubectl logs cuda-vectoraddЕсли проверка прошла успешно, в логе пода будет выведено сообщение:
bash ...[Vector addition of 50000 elements]Copy input data from the host memory to the CUDA deviceCUDA kernel launch with 196 blocks of 256 threadsCopy output data from the CUDA device to the host memoryTest PASSEDDone
Проверки, которые выполняет под в процессе работы, отражены в таблице ниже:
| Критерий проверки | Успешная проверка | Ошибка |
|---|---|---|
| GPU Operator работает | Под успешно выполнился и завершил работу | Под остается в статусе pending |
| Device Plugin зарегистрировал GPU | Pod получил ресурс 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.
Установите Argo CLI на ваше устройство.
Установите 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Создайте файл
vector-add.yamlс манифестом сценария Argo Workflow:yaml apiVersion: argoproj.io/v1alpha1kind: Workflowmetadata:generateName: argo-mig-example-spec:entrypoint: argo-mig-result-exampletemplates:- name: argo-mig-result-examplesteps:- - name: generatetemplate: gen-mig-device-list- - name: argo-migtemplate: argo-migarguments:parameters:- name: argo-migvalue: "{{item}}"withParam: "{{steps.generate.outputs.result}}"- name: gen-mig-device-listscript:image: python:3-alpinecommand: [python]source: |import jsonimport sysjson.dump([i for i in range(0, 2)], sys.stdout)- name: argo-migretryStrategy:limit: 10retryPolicy: "Always"inputs:parameters:- name: argo-migcontainer:image: nvidia/samples:vectoradd-cuda11.2.1resources:limits:nvidia.com/gpu: 1nodeSelector:nvidia.com/gpu.product: <название GPU и инстанса, в формате A100-SXM4-40GB-MIG-3g.20gb>Запустите Argo Workflow, используя флаг
--watchдля наблюдения за выполнением команды в реальном времени:bash argo submit -n argo --watch vector-add.yamlВ процессе выполнения команды будут созданы два пода с тестовыми CUDA-задачами. Каждый под будет запланирован на отдельном MIG-инстансе. Когда поды завершат выполнение тестовых задач, Argo Workflow автоматически завершит работу и сообщит об успешном выполнении:
bash Name: argo-mig-example-xyz78Namespace: argoServiceAccount: defaultStatus: SucceededCreated: ...Started: ...Duration: 1m 20sProgress: 2/2
6. (опционально) Отключите MIG
Заголовок раздела «6. (опционально) Отключите MIG»Если вам больше не нужно разделение GPU на инстансы, вы можете отключить MIG:
kubectl label nodes <имя узла> nvidia.com/mig.config=all-disabled --overwriteУдалите платные ресурсы
Заголовок раздела «Удалите платные ресурсы»Ресурсы, созданные в руководстве, тарифицируются. Если вы больше не планируете использовать их:
- Если вы создавали виртуальную машину, удалите ее.