NVIDIA GPU Operator поддерживает возможность настройки Time-Slicing — механизма виртуального разделения одной физической GPU между несколькими подами на уровне рабочего узла.
Например, если на узле установлена одна GPU V100, а в кластере есть пять подов, каждый из которых запрашивает всю GPU, то без использования Time-Slicing на узел будет назначен только один под. Остальные останутся в статусе «Pending» из-за нехватки ресурсов. При включении Time-Slicing ресурсы одной физической GPU делятся между пятью подами.
Таким образом, все пять подов смогут быть запущены на одном узле одновременно, несмотря на то, что физически доступна только одна GPU.
С помощью этого руководства вы настроите Time-Slicing, развернете пять реплик приложения, которое требует для своей работы GPU-ресурсы, проверите состояние подов и логи.
Вы будете использовать следующие сервисы:
Managed Kubernetes — сервис управления кластерами Kubernetes на вычислительных ресурсах облака.
NVIDIA GPU Operator — плагин для автоматизации управления программными компонентами NVIDIA, необходимыми для предоставления графического процессора GPU.
Шаги:
Если вы уже зарегистрированы, войдите под своей учетной записью.
В кластере создайте группу узлов с параметрами для GPU:
Графический процессор (GPU) — активно.
Модель GPU — GPU NVIDIA Tesla V100.
GPU — 1.
Создайте пространство имен gpu-operator:
kubectl create ns gpu-operator
Перезапишите метку:
kubectl label --overwrite ns gpu-operator pod-security.kubernetes.io/enforce=privileged
Создайте файл cloudru-time-slicing.yaml со следующим содержимым:
apiVersion: v1kind: ConfigMapmetadata:name: time-slicing-confignamespace: gpu-operatordata:tesla-v100: |-version: v1sharing:timeSlicing:resources:- name: nvidia.com/gpureplicas: 5
Выполните команду:
kubectl apply -f cloudru-time-slicing.yaml
Результат:
configmap/time-slicing-config created
Проверьте статус:
kubectl get cm time-slicing-config -n gpu-operator
Результат:
NAME DATA AGEtime-slicing-config 1 114s
В дополнение к стандартным меткам, которые применяются к узлам после настройки Time-Slicing, для узла применяется метка:
nvidia.com/gpu.replicas = <replicas-count>
Здесь <replicas-count> указывает, сколько раз выделенный ресурс gpu может быть переподписан на узле.
Также по умолчанию модифицируется метка nvidia.com/gpu.product:
nvidia.com/gpu.product = <product-name>-SHARED
Суффикс -SHARED помогает отличать узлы с поддержкой Time-Slicing.
В личном кабинете перейдите в кластер, для которого создали группу узлов с GPU.
Перейдите в раздел Плагины и справа над списком установленных плагинов нажмите Добавить плагин.
Выберите NVIDIA GPU Operator.
Нажмите Установить.
В разделе Расширенная конфигурация → YAML укажите параметры:
devicePlugin:config:name: time-slicing-configdefault: tesla-v100
Нажмите Установить.
Дождитесь, когда состояние плагина изменится на «Установлен».
Создайте файл cloudru-time-slicing-check.yaml со следующим содержимым:
apiVersion: apps/v1kind: Deploymentmetadata:name: cloudru-time-slicing-checklabels:app: cloudru-time-slicing-checkspec:replicas: 5selector:matchLabels:app: cloudru-time-slicing-checktemplate:metadata:labels:app: cloudru-time-slicing-checkspec:tolerations:- key: nvidia.com/gpuoperator: Existseffect: NoSchedulehostPID: truecontainers:- name: cuda-sample-vector-addimage: "nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda11.7.1-ubuntu20.04"command: ["/bin/bash", "-c", "--"]args:- while true; do /cuda-samples/vectorAdd; doneresources:limits:nvidia.com/gpu: 1
Выполните команду:
kubectl apply -f cloudru-time-slicing-check.yaml
Результат:
deployment.apps/cloudru-time-slicing-check created
Проверьте, что все пять реплик в статусе «Running»:
kubectl get pods
Примерный результат:
NAME READY STATUS RESTARTS AGEcloudru-time-slicing-check-6dcc7495bc-6dt4k 1/1 Running 0 6m25scloudru-time-slicing-check-6dcc7495bc-7vdvw 1/1 Running 0 6m25scloudru-time-slicing-check-6dcc7495bc-g5xdr 1/1 Running 0 6m25scloudru-time-slicing-check-6dcc7495bc-txbd9 1/1 Running 0 6m25scloudru-time-slicing-check-6dcc7495bc-zxdx8 1/1 Running 0 6m25s
Посмотрите логи одного из подов:
kubectl logs deploy/cloudru-time-slicing-check
Примерный результат:
Found 5 pods, using pod/cloudru-time-slicing-check-6dcc7495bc-7vdvw[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 PASSED...
Вы научились:
Настраивать Time-Slicing.
Разворачивать несколько реплик приложения, которое требует для своей работы GPU-ресурсы.
Проверять состояние подов и логи.