Использование процессоров GPU для интенсивных вычислительных рабочих нагрузок в Службе Azure Kubernetes (AKS)
Графические единицы обработки (GPU) часто используются для вычислительных рабочих нагрузок, таких как рабочие нагрузки графики и визуализации. AKS поддерживает пулы узлов Linux с поддержкой GPU для выполнения вычислительных рабочих нагрузок Kubernetes.
В этой статье показано, как подготовить узлы с неуклюдными gpu в новых и существующих кластерах AKS.
Поддерживаемые виртуальные машины с поддержкой GPU
Сведения о поддерживаемых виртуальных машинах с поддержкой GPU см. в статье о размерах виртуальных машин, оптимизированных для GPU, в Azure. Для пулов узлов AKS рекомендуется минимальный размер Standard_NC6s_v3. Серия NVv4 (на основе GPU AMD) не поддерживается в AKS.
Примечание.
Виртуальные машины с поддержкой GPU содержат специализированное оборудование с более высокими ценами и доступностью регионов. Дополнительные сведения можно получить с помощью калькулятора цен и данных о доступности в регионах.
Ограничения
- Если вы используете пул узлов с поддержкой GPU Для Azure, автоматические исправления безопасности не применяются. Ознакомьтесь с текущей версией API AKS для поведения канала обновления ОС узла по умолчанию.
Примечание.
Для API AKS версии 2023-06-01 или более поздней версии канал по умолчанию для обновления ОС узла — NodeImage. Для предыдущих версий канал по умолчанию — None. Дополнительные сведения см. в статье об автоматическом обновлении.
- NVadsA10 версии 5 не рекомендуется использовать номер SKU для VHD GPU.
- Обновление существующего пула узлов для добавления GPU не поддерживается.
Подготовка к работе
- В этой статье предполагается, что у вас есть существующий кластер AKS. Если у вас нет кластера, создайте его с помощью Azure CLI, Azure PowerShell или портал Azure.
- Вам потребуется azure CLI версии 2.0.64 или более поздней версии. Чтобы узнать версию, выполните команду
az --version
. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.
Получение учетных данных для кластера
Получите учетные данные для кластера AKS с помощью az aks get-credentials
команды. Следующая команда получает учетные данные для myAKSCluster в группе ресурсов myResourceGroup :
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
Параметры использования GPU NVIDIA
Использование GPU NVIDIA включает установку различных программных компонентов NVIDIA, таких как подключаемый модуль устройства NVIDIA для Kubernetes, установка драйвера GPU и многое другое.
Примечание.
По умолчанию корпорация Майкрософт автоматически поддерживает версию драйверов NVidia в рамках развертывания образа узла, а AKS поддерживает и управляет ею. Хотя драйверы NVidia устанавливаются по умолчанию на узлах с поддержкой GPU, необходимо установить подключаемый модуль устройства.
Установка подключаемого модуля устройства NVIDIA
Установка подключаемого модуля устройства NVIDIA требуется при использовании GPU в AKS. В некоторых случаях установка обрабатывается автоматически, например при использовании оператора GPU NVIDIA или образа GPU AKS (предварительная версия). Кроме того, можно вручную установить подключаемый модуль устройства NVIDIA.
Установка подключаемого модуля устройства NVIDIA вручную
Вы можете развернуть daemonSet для подключаемого модуля устройства NVIDIA, который запускает модуль pod на каждом узле, чтобы предоставить необходимые драйверы для gpu. Это рекомендуемый подход при использовании пулов узлов с поддержкой GPU для Azure Linux.
Чтобы использовать номер SKU ОС по умолчанию, создайте пул узлов без указания номера SKU ОС. Пул узлов настроен для операционной системы по умолчанию на основе версии Kubernetes кластера.
Добавьте пул узлов в кластер с помощью
az aks nodepool add
команды.az aks nodepool add \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --name gpunp \ --node-count 1 \ --node-vm-size Standard_NC6s_v3 \ --node-taints sku=gpu:NoSchedule \ --enable-cluster-autoscaler \ --min-count 1 \ --max-count 3
Эта команда добавляет пул узлов с именем gpunp в myAKSCluster в myResourceGroup и использует параметры для настройки следующих параметров пула узлов:
--node-vm-size
: задает размер виртуальной машины для узла в пуле узлов Standard_NC6s_v3.--node-taints
: указывает sku=gpu:NoSchedule taint в пуле узлов.--enable-cluster-autoscaler
: включает автомасштабирование кластера.--min-count
: настраивает автомасштабирование кластера для поддержания минимум одного узла в пуле узлов.--max-count
: настраивает автомасштабирование кластера для поддержания не более трех узлов в пуле узлов.
Примечание.
Размеры и размеры виртуальных машин могут быть заданы только для пулов узлов во время создания пула узлов, но вы можете обновлять параметры автомасштабирования в любое время.
Создайте пространство имен с помощью
kubectl create namespace
команды.kubectl create namespace gpu-resources
Создайте файл с именем nvidia-device-plugin-ds.yaml и вставьте следующий манифест YAML, предоставленный в составе подключаемого модуля устройства NVIDIA для проекта Kubernetes:
apiVersion: apps/v1 kind: DaemonSet metadata: name: nvidia-device-plugin-daemonset namespace: kube-system spec: selector: matchLabels: name: nvidia-device-plugin-ds updateStrategy: type: RollingUpdate template: metadata: labels: name: nvidia-device-plugin-ds spec: tolerations: - key: "sku" operator: "Equal" value: "gpu" effect: "NoSchedule" # Mark this pod as a critical add-on; when enabled, the critical add-on # scheduler reserves resources for critical add-on pods so that they can # be rescheduled after a failure. # See https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/ priorityClassName: "system-node-critical" containers: - image: nvcr.io/nvidia/k8s-device-plugin:v0.15.0 name: nvidia-device-plugin-ctr env: - name: FAIL_ON_INIT_ERROR value: "false" securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] volumeMounts: - name: device-plugin mountPath: /var/lib/kubelet/device-plugins volumes: - name: device-plugin hostPath: path: /var/lib/kubelet/device-plugins
Создайте daemonSet и убедитесь, что подключаемый модуль устройства NVIDIA успешно создан с помощью
kubectl apply
команды.kubectl apply -f nvidia-device-plugin-ds.yaml
Теперь, когда вы успешно установили подключаемый модуль устройства NVIDIA, вы можете проверить, что графические процессоры являются schedulable и запускают рабочую нагрузку GPU.
Пропуск установки драйвера GPU (предварительная версия)
Если вы хотите контролировать установку драйверов NVidia или использовать оператор GPU NVIDIA, можно пропустить установку драйвера GPU по умолчанию. Корпорация Майкрософт не поддерживает или не управляет обслуживанием и совместимостью драйверов NVidia в процессе развертывания образа узла.
Внимание
Предварительные версии функций AKS доступны на уровне самообслуживания. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии AKS предоставляются с частичной клиентской поддержкой по мере возможности. Следовательно, эти функции не предназначены для использования в рабочей среде. Дополнительные сведения доступны в следующих статьях поддержки.
Зарегистрируйте или обновите расширение aks-preview с помощью
az extension add
команды илиaz extension update
команды.# Register the aks-preview extension az extension add --name aks-preview # Update the aks-preview extension az extension update --name aks-preview
Создайте пул узлов с помощью
az aks nodepool add
команды с флагом--skip-gpu-driver-install
, чтобы пропустить автоматическую установку драйвера GPU.az aks nodepool add \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --name gpunp \ --node-count 1 \ --skip-gpu-driver-install \ --node-vm-size Standard_NC6s_v3 \ --enable-cluster-autoscaler \ --min-count 1 \ --max-count 3
Добавление флага
--skip-gpu-driver-install
во время создания пула узлов пропускает автоматическую установку драйвера GPU. Существующие узлы не изменяются. Пул узлов можно масштабировать до нуля, а затем создать резервную копию, чтобы внести изменения в силу.
Использование оператора GPU NVIDIA с AKS
Оператор GPU NVIDIA автоматизирует управление всеми компонентами программного обеспечения NVIDIA, необходимыми для подготовки GPU, включая установку драйверов, подключаемый модуль устройства NVIDIA для Kubernetes, среду выполнения контейнера NVIDIA и многое другое. Так как оператор GPU обрабатывает эти компоненты, не требуется вручную устанавливать подключаемый модуль устройства NVIDIA. Это также означает, что автоматическая установка драйвера GPU в AKS больше не требуется.
Пропустите автоматическую установку драйвера GPU, создав пул узлов с помощью
az aks nodepool add
команды--skip-gpu-driver-install
. Добавление флага--skip-gpu-driver-install
во время создания пула узлов пропускает автоматическую установку драйвера GPU. Существующие узлы не изменяются. Пул узлов можно масштабировать до нуля, а затем создать резервную копию, чтобы внести изменения в силу.Следуйте документации NVIDIA, чтобы установить оператор GPU.
Теперь, когда вы успешно установили оператор GPU, вы можете проверить, что графические процессоры являются шутябельными и выполняют рабочую нагрузку GPU.
Предупреждение
Мы не рекомендуем вручную устанавливать управляющая программа подключаемого модуля NVIDIA с кластерами с помощью образа GPU AKS.
Примечание.
При использовании оператора GPU NVIDIA и развертывания на экземплярах SPOT могут потребоваться дополнительные рекомендации. См. https://github.com/NVIDIA/gpu-operator/issues/577
Использование образа GPU AKS (предварительная версия)
Примечание.
Образ GPU AKS (предварительная версия) будет прекращен 10 января 2025 г. Пользовательский заголовок, используемый ниже, больше не будет доступен, то есть вы не сможете создавать пулы узлов с поддержкой GPU с помощью образа GPU AKS. Рекомендуется перенести или использовать конфигурацию GPU по умолчанию, а не выделенный образ GPU, так как выделенный образ GPU больше не поддерживается. Дополнительные сведения см . в заметках о выпуске AKS или просмотрите это объявление о выходе на пенсию в нашей общедоступной стратегии AKS.
AKS предоставляет полностью настроенный образ AKS, содержащий подключаемый модуль устройства NVIDIA для Kubernetes. В настоящее время образ GPU AKS доступен только в Ubuntu 18.04.
Внимание
Предварительные версии функций AKS доступны на уровне самообслуживания. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии AKS предоставляются с частичной клиентской поддержкой по мере возможности. Следовательно, эти функции не предназначены для использования в рабочей среде. Дополнительные сведения доступны в следующих статьях поддержки.
aks-preview
Установите расширение Azure CLI с помощьюaz extension add
команды.az extension add --name aks-preview
Обновите до последней версии расширения с помощью
az extension update
команды.az extension update --name aks-preview
GPUDedicatedVHDPreview
Зарегистрируйте флаг компонента с помощьюaz feature register
команды.az feature register --namespace "Microsoft.ContainerService" --name "GPUDedicatedVHDPreview"
Через несколько минут отобразится состояние Registered (Зарегистрировано).
Проверьте состояние регистрации с помощью
az feature show
команды.az feature show --namespace "Microsoft.ContainerService" --name "GPUDedicatedVHDPreview"
Когда состояние отражает зарегистрировано, обновите регистрацию поставщика ресурсов Microsoft.ContainerService с помощью
az provider register
команды.az provider register --namespace Microsoft.ContainerService
Теперь, когда вы обновили кластер для использования образа GPU AKS, вы можете добавить пул узлов для узлов GPU в кластер.
Добавьте пул узлов с помощью
az aks nodepool add
команды.az aks nodepool add \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --name gpunp \ --node-count 1 \ --node-vm-size Standard_NC6s_v3 \ --node-taints sku=gpu:NoSchedule \ --aks-custom-headers UseGPUDedicatedVHD=true \ --enable-cluster-autoscaler \ --min-count 1 \ --max-count 3
В предыдущем примере команда добавляет пул узлов с именем gpunp в myAKSCluster в myResourceGroup и использует параметры для настройки следующих параметров пула узлов:
--node-vm-size
: задает размер виртуальной машины для узла в пуле узлов Standard_NC6s_v3.--node-taints
: указывает sku=gpu:NoSchedule taint в пуле узлов.--aks-custom-headers
: указывает специализированный образ GPU AKS, UseGPUDedicatedVHD=true. Если для SKU GPU требуется виртуальные машины поколения 2, используйте --aks-custom-headers UseGPUDedicatedVHD=true,usegen2vm=true .--enable-cluster-autoscaler
: включает автомасштабирование кластера.--min-count
: настраивает автомасштабирование кластера для поддержания минимум одного узла в пуле узлов.--max-count
: настраивает автомасштабирование кластера для поддержания не более трех узлов в пуле узлов.
Примечание.
Размеры и размеры виртуальных машин могут быть заданы только для пулов узлов во время создания пула узлов, но вы можете обновлять параметры автомасштабирования в любое время.
Теперь, когда вы успешно создали пул узлов с помощью образа GPU, вы можете проверить, что графические процессоры являются schedulable и запускают рабочую нагрузку GPU.
Подтверждение того, что процессоры GPU доступны для планирования
После создания кластера убедитесь, что графические процессоры являются неуклюжными в Kubernetes.
Вывод списка узлов в кластере
kubectl get nodes
с помощью команды.kubectl get nodes
Выходные данные должны выглядеть примерно так:
NAME STATUS ROLES AGE VERSION aks-gpunp-28993262-0 Ready agent 13m v1.20.7
Убедитесь, что графические процессоры являются schedulable с помощью
kubectl describe node
команды.kubectl describe node aks-gpunp-28993262-0
В разделе Емкость PU должен отображаться как
nvidia.com/gpu: 1
. Выходные данные должны выглядеть примерно так:Name: aks-gpunp-28993262-0 Roles: agent Labels: accelerator=nvidia [...] Capacity: [...] nvidia.com/gpu: 1 [...]
Запуск рабочей нагрузки с поддержкой GPU
Чтобы просмотреть GPU в действии, можно запланировать рабочую нагрузку с поддержкой GPU с соответствующим запросом ресурсов. В этом примере мы будем запускать задание Tensorflow в наборе данных MNIST.
Создайте файл с именем samples-tf-mnist-demo.yaml и вставьте следующий манифест YAML, включающий ограничение
nvidia.com/gpu: 1
ресурсов:Примечание.
Если при вызове драйверов возникает ошибка несоответствия версий, например "Версия драйвера CUDA недостаточно для версии среды выполнения CUDA", просмотрите диаграмму совместимости матрицы драйверов NVIDIA.
apiVersion: batch/v1 kind: Job metadata: labels: app: samples-tf-mnist-demo name: samples-tf-mnist-demo spec: template: metadata: labels: app: samples-tf-mnist-demo spec: containers: - name: samples-tf-mnist-demo image: mcr.microsoft.com/azuredocs/samples-tf-mnist-demo:gpu args: ["--max_steps", "500"] imagePullPolicy: IfNotPresent resources: limits: nvidia.com/gpu: 1 restartPolicy: OnFailure tolerations: - key: "sku" operator: "Equal" value: "gpu" effect: "NoSchedule"
Запустите задание с помощью
kubectl apply
команды, которая анализирует файл манифеста и создает определенные объекты Kubernetes.kubectl apply -f samples-tf-mnist-demo.yaml
Просмотр состояния рабочей нагрузки с поддержкой GPU
Отслеживайте ход выполнения задания с помощью
kubectl get jobs
команды с флагом--watch
. Извлечение изображения и последующая обработка набора данных может занять несколько минут.kubectl get jobs samples-tf-mnist-demo --watch
Когда в столбце COMPLETIONS отображается 1/1, задание успешно завершено, как показано в следующем примере выходных данных:
NAME COMPLETIONS DURATION AGE samples-tf-mnist-demo 0/1 3m29s 3m29s samples-tf-mnist-demo 1/1 3m10s 3m36s
Завершите
kubectl --watch
процесс с помощью CTRL-C.Получите имя pod с помощью
kubectl get pods
команды.kubectl get pods --selector app=samples-tf-mnist-demo
Просмотрите выходные данные рабочей нагрузки с поддержкой GPU с помощью
kubectl logs
команды.kubectl logs samples-tf-mnist-demo-smnr6
В следующем сжатом примере выходных данных журналов pod подтверждается, что обнаружено соответствующее устройство
Tesla K80
GPU:2019-05-16 16:08:31.258328: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA 2019-05-16 16:08:31.396846: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties: name: Tesla K80 major: 3 minor: 7 memoryClockRate(GHz): 0.8235 pciBusID: 2fd7:00:00.0 totalMemory: 11.17GiB freeMemory: 11.10GiB 2019-05-16 16:08:31.396886: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: Tesla K80, pci bus id: 2fd7:00:00.0, compute capability: 3.7) 2019-05-16 16:08:36.076962: I tensorflow/stream_executor/dso_loader.cc:139] successfully opened CUDA library libcupti.so.8.0 locally Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes. Extracting /tmp/tensorflow/input_data/train-images-idx3-ubyte.gz Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes. Extracting /tmp/tensorflow/input_data/train-labels-idx1-ubyte.gz Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes. Extracting /tmp/tensorflow/input_data/t10k-images-idx3-ubyte.gz Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes. Extracting /tmp/tensorflow/input_data/t10k-labels-idx1-ubyte.gz Accuracy at step 0: 0.1081 Accuracy at step 10: 0.7457 Accuracy at step 20: 0.8233 Accuracy at step 30: 0.8644 Accuracy at step 40: 0.8848 Accuracy at step 50: 0.8889 Accuracy at step 60: 0.8898 Accuracy at step 70: 0.8979 Accuracy at step 80: 0.9087 Accuracy at step 90: 0.9099 Adding run metadata for 99 Accuracy at step 100: 0.9125 Accuracy at step 110: 0.9184 Accuracy at step 120: 0.922 Accuracy at step 130: 0.9161 Accuracy at step 140: 0.9219 Accuracy at step 150: 0.9151 Accuracy at step 160: 0.9199 Accuracy at step 170: 0.9305 Accuracy at step 180: 0.9251 Accuracy at step 190: 0.9258 Adding run metadata for 199 [...] Adding run metadata for 499
Мониторинг использования GPU с помощью аналитики контейнеров
Аналитика контейнеров с AKS отслеживает следующие метрики использования GPU:
Имя метрики | Измерение метрики (теги) | Description |
---|---|---|
containerGpuDutyCycle | container.azm.ms/clusterId , , container.azm.ms/clusterName gpuId containerName gpuModel ,gpuVendor |
Процент времени за последний период повторения (60 секунд), в течение которого графический процессор был занят или активно обрабатывал данные для контейнера. Рабочий цикл указывается как число в диапазоне от 1 до 100. |
containerGpuLimits | container.azm.ms/clusterId , , container.azm.ms/clusterName containerName |
Для каждого контейнера можно задавать ограничения, касающиеся одного GPU или нескольких GPU. Невозможно запросить или ограничить долю GPU. |
containerGpuRequests | container.azm.ms/clusterId , , container.azm.ms/clusterName containerName |
Каждый контейнер может запрашивать один GPU или несколько GPU. Невозможно запросить или ограничить долю GPU. |
containerGpumemoryTotalBytes | container.azm.ms/clusterId , , container.azm.ms/clusterName gpuId containerName gpuModel ,gpuVendor |
Объем памяти GPU в байтах, доступной для определенного контейнера. |
containerGpumemoryUsedBytes | container.azm.ms/clusterId , , container.azm.ms/clusterName gpuId containerName gpuModel ,gpuVendor |
Объем памяти GPU в байтах, используемой определенным контейнером. |
nodeGpuAllocatable | container.azm.ms/clusterId , , container.azm.ms/clusterName gpuVendor |
Количество GPU в узле, которые могут использоваться Kubernetes. |
nodeGpuCapacity | container.azm.ms/clusterId , , container.azm.ms/clusterName gpuVendor |
Общее количество GPU в узле. |
Очистка ресурсов
Удалите связанные объекты Kubernetes, созданные в этой статье, с помощью
kubectl delete job
команды.kubectl delete jobs samples-tf-mnist-demo
Следующие шаги
- Чтобы выполнять задания Apache Spark, ознакомьтесь с разделом Запуск заданий Apache Spark в AKS.
- Дополнительные сведения о функциях планировщика Kubernetes см. в рекомендациях по расширенным функциям планировщика в AKS.
- Дополнительные сведения о Служба Azure Kubernetes и Машинное обучение Azure см. в следующем разделе:
Azure Kubernetes Service