Использование процессоров 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, автоматические исправления безопасности не применяются, а поведение по умолчанию для кластера неуправляемо. Дополнительные сведения см. в статье об автоматическом обновлении.
  • 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 и многое другое.

Пропуск установки драйвера GPU (предварительная версия)

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

Внимание

Предварительные версии функций AKS доступны на уровне самообслуживания. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии AKS предоставляются с частичной клиентской поддержкой по мере возможности. Следовательно, эти функции не предназначены для использования в рабочей среде. Дополнительные сведения доступны в следующих статьях поддержки.

  1. Зарегистрируйте или обновите расширение 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
    
  2. Создайте пул узлов с помощью 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. Существующие узлы не изменяются. Пул узлов можно масштабировать до нуля, а затем создать резервную копию, чтобы внести изменения в силу.

Установка подключаемого модуля устройства NVIDIA

Установка подключаемого модуля устройства NVIDIA требуется при использовании GPU в AKS. В некоторых случаях установка обрабатывается автоматически, например при использовании оператора GPU NVIDIA или образа GPU AKS (предварительная версия). Кроме того, можно вручную установить подключаемый модуль устройства NVIDIA.

Установка подключаемого модуля устройства NVIDIA вручную

Вы можете развернуть daemonSet для подключаемого модуля устройства NVIDIA, который запускает модуль pod на каждом узле, чтобы предоставить необходимые драйверы для gpu. Это рекомендуемый подход при использовании пулов узлов с поддержкой GPU для Azure Linux.

Чтобы использовать номер SKU ОС по умолчанию, создайте пул узлов без указания номера SKU ОС. Пул узлов настроен для операционной системы по умолчанию на основе версии Kubernetes кластера.

  1. Добавьте пул узлов в кластер с помощью 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 для проекта 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:
          # 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.  This annotation works in tandem with the toleration below.
          annotations:
            scheduler.alpha.kubernetes.io/critical-pod: ""
          labels:
            name: nvidia-device-plugin-ds
        spec:
          tolerations:
          # Allow this pod to be rescheduled while the node is in "critical add-ons only" mode.
          # This, along with the annotation above marks this pod as a critical add-on.
          - key: CriticalAddonsOnly
            operator: Exists
          - key: nvidia.com/gpu
            operator: Exists
            effect: NoSchedule
          - key: "sku"
            operator: "Equal"
            value: "gpu"
            effect: "NoSchedule"
          containers:
          - image: mcr.microsoft.com/oss/nvidia/k8s-device-plugin:v0.14.1
            name: nvidia-device-plugin-ctr
            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, вы можете проверка, что графические процессоры являются schedulable и запускают рабочую нагрузку GPU.

Использование оператора GPU NVIDIA с AKS

Оператор GPU NVIDIA автоматизирует управление всеми компонентами программного обеспечения NVIDIA, необходимыми для подготовки GPU, включая установку драйверов, подключаемый модуль устройства NVIDIA для Kubernetes, среду выполнения контейнера NVIDIA и многое другое. Так как оператор GPU обрабатывает эти компоненты, не требуется вручную устанавливать подключаемый модуль устройства NVIDIA. Это также означает, что автоматическая установка драйвера GPU в AKS больше не требуется.

  1. Пропустите автоматическую установку драйвера GPU, создав пул узлов с помощью az aks nodepool add команды --skip-gpu-driver-install. Добавление флага --skip-gpu-driver-install во время создания пула узлов пропускает автоматическую установку драйвера GPU. Существующие узлы не изменяются. Пул узлов можно масштабировать до нуля, а затем создать резервную копию, чтобы внести изменения в силу.

  2. Следуйте документации NVIDIA, чтобы установить оператор GPU.

  3. Теперь, когда вы успешно установили оператор GPU, вы можете проверка, что графические процессоры являются schedulable и запускают рабочую нагрузку GPU.

Предупреждение

Мы не рекомендуем вручную устанавливать управляющая программа подключаемого модуля NVIDIA с кластерами с помощью образа GPU AKS.

Использование образа GPU AKS (предварительная версия)

AKS предоставляет полностью настроенный образ AKS, содержащий подключаемый модуль устройства NVIDIA для Kubernetes. В настоящее время образ GPU AKS поддерживается только для Ubuntu 18.04.

Внимание

Предварительные версии функций AKS доступны на уровне самообслуживания. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии AKS предоставляются с частичной клиентской поддержкой по мере возможности. Следовательно, эти функции не предназначены для использования в рабочей среде. Дополнительные сведения доступны в следующих статьях поддержки.

  1. aks-preview Установите расширение Azure CLI с помощью az extension add команды.

    az extension add --name aks-preview
    
  2. Обновите до последней версии расширения с помощью az extension update команды.

    az extension update --name aks-preview
    
  3. GPUDedicatedVHDPreview Зарегистрируйте флаг компонента с помощью az feature register команды.

    az feature register --namespace "Microsoft.ContainerService" --name "GPUDedicatedVHDPreview"
    

    Через несколько минут отобразится состояние Registered (Зарегистрировано).

  4. Проверьте состояние регистрации с помощью az feature show команды.

    az feature show --namespace "Microsoft.ContainerService" --name "GPUDedicatedVHDPreview"
    
  5. Когда состояние отражает зарегистрировано, обновите регистрацию поставщика ресурсов Microsoft.ContainerService с помощью az provider register команды.

    az provider register --namespace Microsoft.ContainerService
    

    Теперь, когда вы обновили кластер для использования образа GPU AKS, вы можете добавить пул узлов для узлов GPU в кластер.

  6. Добавьте пул узлов с помощью 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: настраивает автомасштабирование кластера для поддержания не более трех узлов в пуле узлов.

    Примечание.

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

  7. Теперь, когда вы успешно создали пул узлов с помощью образа GPU, вы можете проверка, что графические процессоры являются schedulable и запускают рабочую нагрузку GPU.

Подтверждение того, что процессоры 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. Убедитесь, что графические процессоры являются 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.

  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
    

    В следующем сжатом примере выходных данных журналов pod подтверждается, что обнаружено соответствующее устройство Tesla K80GPU:

    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/clusterNamegpuIdcontainerNamegpuModel,gpuVendor Процент времени за последний период повторения (60 секунд), в течение которого графический процессор был занят или активно обрабатывал данные для контейнера. Рабочий цикл указывается как число в диапазоне от 1 до 100.
containerGpuLimits container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName Для каждого контейнера можно задавать ограничения, касающиеся одного GPU или нескольких GPU. Невозможно запросить или ограничить долю GPU.
containerGpuRequests container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName Каждый контейнер может запрашивать один GPU или несколько GPU. Невозможно запросить или ограничить долю GPU.
containerGpumemoryTotalBytes container.azm.ms/clusterId, , container.azm.ms/clusterNamegpuIdcontainerNamegpuModel,gpuVendor Объем памяти GPU в байтах, доступной для определенного контейнера.
containerGpumemoryUsedBytes container.azm.ms/clusterId, , container.azm.ms/clusterNamegpuIdcontainerNamegpuModel,gpuVendor Объем памяти GPU в байтах, используемой определенным контейнером.
nodeGpuAllocatable container.azm.ms/clusterId, , container.azm.ms/clusterNamegpuVendor Количество GPU в узле, которые могут использоваться Kubernetes.
nodeGpuCapacity container.azm.ms/clusterId, , container.azm.ms/clusterNamegpuVendor Общее количество GPU в узле.

Очистка ресурсов

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

    kubectl delete jobs samples-tf-mnist-demo
    

Следующие шаги