Развертывание экземпляров контейнеров, использующих ресурсы GPU

Чтобы выполнить определенные ресурсоемкие рабочие нагрузки в Экземплярах контейнеров Azure, разверните группы контейнеров с ресурсами GPU. Экземпляры контейнеров в группе могут получить доступ к одному графическому процессору NVIDIA Tesla или нескольким при выполнении рабочих нагрузок контейнеров, таких как CUDA и приложения глубокого обучения.

В этой статье показано, как добавить ресурсы GPU при развертывании группы контейнеров с помощью файла YAML или шаблона Resource Manager. Ресурсы GPU можно также указать при развертывании экземпляра контейнера с помощью портала Azure.

Важно!

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

Предварительные требования

Примечание

Из-за некоторых текущих ограничений не все запросы на увеличение лимита гарантированно утверждаются.

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

Ограничения предварительной версии

В режиме предварительной версии при использовании ресурсов GPU в группах контейнеров применяются следующие ограничения.

Доступность по регионам

Регионы ОС Доступные номера SKU для GPU
Восточная часть США, Западная Европа, восточная часть США 2 Linux K80, P100, V100
Юго-Восточная Азия Linux P100, V100
Центральная Индия Linux V100
Северная Европа Linux K80

Со временем будут поддерживаться другие регионы.

Поддерживаемые типы ОС: только Linux

Дополнительные ограничения: ресурсы GPU нельзя использовать при развертывании группы контейнеров в виртуальной сети.

Сведения о ресурсах GPU

Количество и номер SKU

Чтобы использовать GPU в экземпляре контейнера, укажите ресурс GPU со следующими сведениями:

  • Количество — количество графических процессоров: 1, 2 или 4.

  • SKU — номер SKU для GPU: K80, P100 или V100. Каждый номер SKU сопоставляется с графическим процессором NVIDIA Tesla в одном из следующих семейств виртуальных машин с поддержкой GPU Azure:

    SKU Семейство виртуальных машин
    K80 NC
    P100 NCv2
    V100 NCv3

Максимальное количество ресурсов на номер SKU

ОС Номер SKU GPU Количество ЦП максимальная загрузка ЦП; Максимум памяти (ГБ) Хранилище (ГБ)
Linux K80 1 6 56 50
Linux K80 2 12 112 50
Linux K80 4 24 224 50
Linux P100 1 6 112 50
Linux P100 2 12 224 50
Linux P100 4 24 448 50
Linux V100 1 6 112 50
Linux V100 2 12 224 50
Linux V100 4 24 448 50

При развертывании ресурсов GPU установите соответствующие рабочей нагрузке значения для ресурсов ЦП и памяти, но не выше максимальных значений, указанных в предыдущей таблице. В настоящее время эти значения превышают ресурсы ЦП и памяти, доступные в группах контейнеров без ресурсов GPU.

Важно!

Заданные по умолчанию ограничения подписки (квоты) для ресурсов GPU отличаются в зависимости от номера SKU. По умолчанию для номеров SKU P100 и V100 изначально устанавливаются ограничения ЦП, равные 0. Чтобы запросить увеличение в доступном регионе, отправьте запрос в службу поддержки Azure.

Полезная информация

  • Время развертывания. Создание группы контейнеров, содержащей ресурсы GPU, занимает 8–10 минут. Это связано с затратой времени на подготовку и настройку виртуальной машины с поддержкой GPU в Azure.

  • Цены. Аналогично группам контейнеров без ресурсов GPU, Azure выставляет счета за ресурсы, потребляемые в течение длительности использования группы контейнеров с ресурсами GPU. Длительность использования рассчитывается с момента извлечения первого образа контейнера до момента завершения работы группы контейнеров. Она не включает время, затрачиваемое на развертывание группы контейнеров.

    См. сведения о ценах.

  • Драйверы CUDA. Экземпляры контейнеров с ресурсами GPU предварительно снабжены драйверами NVIDIA CUDA и средами выполнения контейнеров, поэтому вы можете использовать образы контейнеров, разработанные для рабочих нагрузок CUDA.

    На этом этапе поддерживается CUDA 11. Например, можно использовать следующие базовые образы для файла Docker:

    Примечание

    Чтобы повысить надежность при использовании общедоступного образа контейнера из Docker Hub, импортируйте образ и управляйте им в частном реестре контейнеров Azure, а также обновите Dockerfile для использования базового образа, управляемого в частном режиме. Узнайте больше о работе с общедоступными образами.

Пример YAML

Чтобы добавить группы GPU, можно развернуть группу контейнеров с помощью YAML-файла. Скопируйте следующий YAML-файл в новый файл с именем gpu-deploy-aci.yaml, а затем сохраните его. Этот YAML-файл создает группу контейнеров с именем gpucontainergroup, в которой указывается экземпляр контейнера с графическим процессором K80. Экземпляр запускает пример приложения сложения векторов CUDA. Запросов ресурсов достаточно для запуска рабочей нагрузки.

Примечание

В следующем примере используется общедоступный образ контейнера. Чтобы повысить надежность, импортируйте образ и управляйте им в частном реестре контейнеров Azure, а также обновите YAML для использования базового образа, управляемого в частном режиме. Узнайте больше о работе с общедоступными образами.

additional_properties: {}
apiVersion: '2021-09-01'
name: gpucontainergroup
properties:
  containers:
  - name: gpucontainer
    properties:
      image: k8s-gcrio.azureedge.net/cuda-vector-add:v0.1
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
          gpu:
            count: 1
            sku: K80
  osType: Linux
  restartPolicy: OnFailure

Разверните группу контейнеров с помощью команды az container create, указав имя YAML-файла для значения параметра --file. Необходимо указать имя группы ресурсов и расположение группы контейнеров, которое поддерживает ресурсы GPU, например eastus.

az container create --resource-group myResourceGroup --file gpu-deploy-aci.yaml --location eastus

Развертывание занимает несколько минут. Затем контейнер запускается и выполняет операцию сложения векторов CUDA. Для просмотра выходных данных журнала выполните команду az container logs:

az container logs --resource-group myResourceGroup --name gpucontainergroup --container-name gpucontainer

Выходные данные:

[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done

Пример шаблона Resource Manager

Чтобы развернуть группу контейнеров с ресурсами GPU, также можно воспользоваться шаблоном Resource Manager. Начните с создания файла с именем gpudeploy.json и скопируйте в него приведенный ниже код JSON. В этом примере развертывается экземпляр контейнера с графическим процессором V100, который выполняет задание обучения TensorFlow для набора данных MNIST. Запросов ресурсов достаточно для запуска рабочей нагрузки.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      "containerGroupName": {
        "type": "string",
        "defaultValue": "gpucontainergrouprm",
        "metadata": {
          "description": "Container Group name."
        }
      }
    },
    "variables": {
      "containername": "gpucontainer",
      "containerimage": "mcr.microsoft.com/azuredocs/samples-tf-mnist-demo:gpu"
    },
    "resources": [
      {
        "name": "[parameters('containerGroupName')]",
        "type": "Microsoft.ContainerInstance/containerGroups",
        "apiVersion": "2021-09-01",
        "location": "[resourceGroup().location]",
        "properties": {
            "containers": [
            {
              "name": "[variables('containername')]",
              "properties": {
                "image": "[variables('containerimage')]",
                "resources": {
                  "requests": {
                    "cpu": 4.0,
                    "memoryInGb": 12.0,
                    "gpu": {
                        "count": 1,
                        "sku": "V100"
                  }
                }
              }
            }
          }
        ],
        "osType": "Linux",
        "restartPolicy": "OnFailure"
        }
      }
    ]
}

Разверните шаблон с помощью команды az deployment group create. Необходимо указать имя группы ресурсов, созданной в регионе с поддержкой ресурсов GPU, например eastus.

az deployment group create --resource-group myResourceGroup --template-file gpudeploy.json

Развертывание занимает несколько минут. Затем контейнер запустится и выполнит задание TensorFlow. Для просмотра выходных данных журнала выполните команду az container logs:

az container logs --resource-group myResourceGroup --name gpucontainergrouprm --container-name gpucontainer

Выходные данные:

2018-10-25 18:31:10.155010: 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
2018-10-25 18:31:10.305937: 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: ccb6:00:00.0
totalMemory: 11.92GiB freeMemory: 11.85GiB
2018-10-25 18:31:10.305981: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: Tesla K80, pci bus id: ccb6:00:00.0, compute capability: 3.7)
2018-10-25 18:31:14.941723: 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.097
Accuracy at step 10: 0.6993
Accuracy at step 20: 0.8208
Accuracy at step 30: 0.8594
...
Accuracy at step 990: 0.969
Adding run metadata for 999

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

Так как использование ресурсов GPU может быть дорогостоящим, следите, чтобы ваши контейнеры не работали в течение длительного времени. Отслеживайте свои контейнеры на портале Azure или проверяйте состояние группы контейнеров с помощью команды az container show. Пример:

az container show --resource-group myResourceGroup --name gpucontainergroup --output table

Когда завершите работу с созданными экземплярами контейнеров, удалите их с помощью следующих команд:

az container delete --resource-group myResourceGroup --name gpucontainergroup -y
az container delete --resource-group myResourceGroup --name gpucontainergrouprm -y

Дальнейшие действия