Поделиться через


Используйте графические процессоры для вычислительно-ёмких задач в Azure Kubernetes Service (AKS)

Графические процессоры (GPU) часто используются для вычислительно интенсивных рабочих нагрузок, таких как графические и визуализационные рабочие нагрузки. AKS поддерживает Linux-пулы узлов с поддержкой GPU для выполнения вычислительно интенсивных рабочих нагрузок Kubernetes.

Эта статья поможет вам настроить узлы с назначаемыми GPU в новых и существующих кластерах AKS.

Это важно

Начиная с 30 ноября 2025 г. служба Azure Kubernetes (AKS) больше не поддерживает или предоставляет обновления безопасности для Azure Linux 2.0. Образ узла Linux 2.0 Azure заморожен в выпуске 202512.06.0. Начиная с 31 марта 2026 г. образы узлов будут удалены, и вы не сможете масштабировать пулы узлов. Выполните миграцию в поддерживаемую версию Linux Azure, обновив пулы узлов до поддерживаемой версии Kubernetes или переключив ее на osSku AzureLinux3. Дополнительные сведения см. в вопросе о прекращении поддержки на GitHub и объявлении об устаревании обновлений Azure. Чтобы оставаться в курсе объявлений и обновлений, следуйте заметкам о выпуске AKS.

ВМ с поддержкой GPU

Сведения о доступных виртуальных машинах с поддержкой GPU см. в статье о размерах виртуальных машин с поддержкой GPU в Azure. Если размер виртуальной машины GPU отсутствует в списке поддерживаемых размеров виртуальных машин, AKS не устанавливает необходимые компоненты программного обеспечения GPU или обеспечивает поддержку. AKS позволяет использовать неподдерживаемые размеры виртуальных машин GPU после пропуска автоматической установки драйвера GPU.

Проверьте доступные и поддерживаемые размеры виртуальных машин с помощью az vm list-skus команды.

az vm list-skus --location <your-location> --output table

Для пулов узлов AKS мы рекомендуем минимальный размер Standard_NC6s_v3. Серия NVv4 (на основе AMD GPUs) не поддерживается в AKS.

Замечание

ВМ с поддержкой GPU содержат специализированное оборудование, что обуславливает их более высокие цены и доступность в регионе. Дополнительные сведения см. в инструменте ценообразования и доступности региона.

Ограничения

  • Если вы используете пул узлов Azure Linux с поддержкой GPU, автоматические обновления безопасности не применяются. Обратитесь к текущей версии AKS API, чтобы узнать о стандартном поведении канала обновления ОС узла.
  • Flatcar Container Linux для AKS не поддерживается на AKS с GPU NVIDIA.
  • Azure Linux с OS Guard для AKS не поддерживается с GPU NVIDIA в AKS.

Замечание

Для версии AKS API 2023-06-01 или более поздней, каналом по умолчанию для обновления ОС узла является NodeImage. Для предыдущих версий канал по умолчанию — это None. Чтобы узнать больше, см. автоматическое обновление.

  • Обновление существующего пула узлов для добавления размера виртуальной машины с GPU не поддерживается в AKS.

Перед тем как начать

  • В данной статье предполагается, что у вас уже есть существующий кластер AKS. Если у вас нет кластера, создайте его с помощью Azure CLI, Azure PowerShell или портала Azure.
  • Чтобы задать --gpu-driver поле, необходимо установить Azure CLI версии 2.72.2 или более поздней версии. Чтобы узнать версию, выполните команду az --version. Если вам нужно установить или обновить, см. статью "Установка Azure CLI".
  • Если у вас установлено расширение Azure CLI, обновите его до версии 18.0.0b2 или более поздней.

Получите учетные данные для вашего кластера

Получите учетные данные для вашего кластера AKS, используя команду az aks get-credentials. Ниже приведённый пример команды получает учетные данные для myAKSCluster в группе ресурсов myResourceGroup.

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

Варианты использования графических процессоров NVIDIA

Использование графических процессоров NVIDIA предполагает установку различных компонентов программного обеспечения NVIDIA, таких как плагин устройства NVIDIA для Kubernetes, драйвер графического процессора и другие.

Замечание

По умолчанию корпорация Майкрософт автоматически поддерживает версию драйверов NVIDIA в рамках развертывания образа узла, а AKS поддерживает и управляет ею . Хотя драйверы NVIDIA устанавливаются по умолчанию на узлах с поддержкой GPU, необходимо установить подключаемый модуль устройства.

Установка плагина устройства NVIDIA

Для использования графических процессоров (GPU) на AKS требуется установка плагина для устройств NVIDIA. В некоторых случаях установка осуществляется автоматически, например, при использовании NVIDIA GPU Operator. В качестве альтернативы, вы можете вручную установить плагин для устройства 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: настраивает автомасштабирование кластера для поддержания не более трех узлов в пуле узлов.

Замечание

Метки и размеры виртуальных машин могут быть заданы только для пулов узлов во время их создания, но вы можете обновлять параметры автомасштабирования в любое время.

  1. Создайте пространство имен с помощью команды kubectl create namespace.

    kubectl create namespace gpu-resources
    
  2. Создайте файл с именем nvidia-device-plugin-ds.yaml и вставьте следующий YAML-манифест, предоставленный в рамках проекта NVIDIA device plugin for Kubernetes.

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: nvidia-device-plugin-daemonset
      namespace: gpu-resources
    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.18.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
    
  3. Создайте DaemonSet и убедитесь, что плагин устройства NVIDIA успешно создан с помощью команды kubectl apply.

    kubectl apply -f nvidia-device-plugin-ds.yaml
    
  4. Теперь, когда вы успешно установили подключаемый модуль устройства NVIDIA, вы можете проверить, что графические процессоры доступны для планирования и запустить рабочую нагрузку на GPU.

Пропуск установки драйвера GPU

Если вы хотите контролировать установку драйверов NVIDIA или использовать оператор GPU NVIDIA, можно пропустить установку драйвера GPU по умолчанию. Корпорация Майкрософт не поддерживает или не управляет обслуживанием и совместимостью драйверов NVIDIA в процессе развертывания образа узла.

Это важно

Начиная с 14 августа 2025 г. служба Azure Kubernetes (AKS) больше не поддерживает --skip-gpu-driver-install тег пула узлов. После этой даты вы не сможете подготовить пулы узлов с поддержкой GPU с помощью этого тега для обхода автоматической установки драйвера GPU. Вы можете добиться того же поведения, установив для поля --gpu-driver значение none. Дополнительные сведения об этом устаревании см. в вопросе устаревания на GitHub и объявлении об устаревании обновлений Azure. Чтобы оставаться в курсе объявлений и обновлений, следуйте заметкам о выпуске AKS.

  1. Создайте пул узлов с использованием команды az aks nodepool add и установите поле --gpu-driver в none для пропуска установки драйвера GPU по умолчанию.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunp \
        --node-count 1 \
        --gpu-driver none \
        --node-vm-size Standard_NC6s_v3 \
        --enable-cluster-autoscaler \
        --min-count 1 \
        --max-count 3
    

    Во время создания пула узлов, установка поля API на --gpu-driver и none приводит к пропуску автоматической установки драйвера GPU. Существующие узлы не изменяются. Вы можете уменьшить размер пула узлов до нуля, а затем увеличить обратно, чтобы изменения вступили в силу.

    Если вы получите ошибку unrecognized arguments: --gpu-driver none , обновите версию Azure CLI. Дополнительные сведения см. в разделе "Перед началом работы".

  2. При необходимости можно установить оператор GPU NVIDIA, выполнив указанные ниже действия.

Подтвердите, что графические процессоры могут быть запланированы

После создания вашего кластера убедитесь, что GPU можно использовать в Kubernetes.

  1. Перечислите узлы в вашем кластере, используя команду kubectl get nodes.

    kubectl get nodes
    

    Ваш результат должен быть похож на следующий пример результата:

    NAME                   STATUS   ROLES   AGE   VERSION
    aks-gpunp-28993262-0   Ready    agent   13m   v1.20.7
    
  2. Подтвердите, что GPU можно планировать, используя команду kubectl describe node.

    kubectl describe node aks-gpunp-28993262-0
    

    В разделе Ёмкость GPU должен быть указан как nvidia.com/gpu: 1. Ваш результат должен выглядеть аналогично следующему сокращенному образцу.

    Name:               aks-gpunp-28993262-0
    Roles:              agent
    Labels:             accelerator=nvidia
    
    [...]
    
    Capacity:
    [...]
     nvidia.com/gpu:                 1
    [...]
    

Запуск рабочей нагрузки с поддержкой GPU

Чтобы увидеть работу GPU, вы можете запланировать рабочую нагрузку с поддержкой GPU с соответствующим запросом ресурсов. В этом примере мы запустим задачу Tensorflow против набора данных MNIST.

  1. Создайте файл с именем 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"
    
  2. Выполните задачу, используя команду kubectl apply, которая разбирает файл манифеста и создаёт указанные объекты Kubernetes.

    kubectl apply -f samples-tf-mnist-demo.yaml
    

Просмотр статуса рабочей нагрузки с поддержкой GPU

  1. Отслеживайте прогресс задания, используя команду 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
    
  2. Завершите kubectl --watch процесс, нажав Ctrl+C.

  3. Получите имя pod, используя команду kubectl get pods.

    kubectl get pods --selector app=samples-tf-mnist-demo
    
  4. Ознакомьтесь с выводом рабочей нагрузки с поддержкой GPU, используя команду kubectl logs.

    kubectl logs samples-tf-mnist-demo-smnr6
    

    Следующий сокращенный пример вывода логов пода подтверждает, что обнаружено соответствующее устройство GPU, Tesla K80.

    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-driver параметров. При попытке передать параметр может возникнуть ошибка unrecognized arguments: --gpu-driver none . Вызов параметра не требуется, так как значение не влияет на такие операции.

При первом создании пула узлов любой параметр, объявленный вами --gpu-driver, не будет затронут операциями обновления или апгрейда. Если вы не хотите устанавливать драйверы и выбрали --gpu-driver None при создании пула узлов, драйверы не будут установлены в последующих обновлениях и обновлениях до более новой версии ПО.

Очистите ресурсы

Удалите связанные объекты Kubernetes, которые вы создали в этой статье, используя команду kubectl delete job.

kubectl delete jobs samples-tf-mnist-demo

Дальнейшие шаги