Implantar instâncias de contêiner que usam recursos de GPU

Para executar determinadas cargas de trabalho de computação intensiva em Instâncias de Contêiner do Azure, implante seus grupos de contêineres com recursos de GPU. As instâncias de contêiner no grupo podem acessar uma ou mais GPUs NVIDIA Tesla enquanto executam cargas de trabalho de contêiner, como CUDA e aplicativos de aprendizado profundo.

Este artigo mostra como adicionar recursos de GPU quando você implanta um grupo de contêineres usando um arquivo YAML ou modelo do Gerenciador de Recursos. Você também pode especificar recursos de GPU ao implantar uma instância de contêiner usando o portal do Azure.

Importante

Os SKUs de GPU K80 e P100 serão aposentados até 31 de agosto de 2023. Isso se deve à desativação das VMs subjacentes usadas: Série NC e Série NCv2 Embora as SKUs V100 estejam disponíveis, recomenda-se usar o Serviço Kubernetes do Azure. Os recursos da GPU não são totalmente suportados e não devem ser usados para cargas de trabalho de produção. Use os seguintes recursos para migrar para o AKS hoje: Como migrar para o AKS.

Importante

Este recurso está atualmente em pré-visualização e algumas limitações se aplicam. As pré-visualizações são disponibilizadas a si na condição de concordar com os termos suplementares de utilização. Alguns aspetos desta funcionalidade podem alterar-se após a disponibilidade geral (GA).

Pré-requisitos

Nota

Devido a algumas limitações atuais, nem todos os pedidos de aumento de limite têm a garantia de serem aprovados.

  • Se você quiser usar essa sku para suas implantações de contêiner de produção, crie uma solicitação de Suporte do Azure para aumentar o limite.

Limitações de pré-visualização

Na visualização, as limitações a seguir se aplicam ao usar recursos de GPU em grupos de contêineres.

Disponibilidade da região

Regiões SO SKUs de GPU disponíveis
Leste dos EUA, Europa Ocidental, Oeste dos EUA 2, Sudeste Asiático, Índia Central Linux V100

O suporte será adicionado para outras regiões ao longo do tempo.

Tipos de SO suportados: apenas Linux

Limitações adicionais: os recursos da GPU não podem ser usados ao implantar um grupo de contêineres em uma rede virtual.

Sobre os recursos da GPU

Contagem e SKU

Para usar GPUs em uma instância de contêiner, especifique um recurso de GPU com as seguintes informações:

  • Contagem - O número de GPUs: 1, 2 ou 4.

  • SKU - O SKU DA GPU: V100. Cada SKU mapeia para a GPU Tesla da NVIDIA em uma das seguintes famílias de VM habilitadas para GPU do Azure:

    SKU Família VM
    V100 NCv3

Máximo de recursos por SKU

SO GPU SKU Contagem de GPU CPU Máxima Memória máxima (GB) Armazenamento (GB)
Linux V100 1 6 112 50
Linux V100 2 12 224 50
Linux V100 4 24 448 50

Ao implantar recursos de GPU, defina os recursos de CPU e memória apropriados para a carga de trabalho, até os valores máximos mostrados na tabela anterior. Atualmente, esses valores são maiores do que os recursos de CPU e memória disponíveis em grupos de contêineres sem recursos de GPU.

Importante

Os limites de assinatura padrão (cotas) para recursos de GPU diferem de acordo com a SKU. Os limites de CPU padrão para SKUs V100 são inicialmente definidos como 0. Para solicitar um aumento em uma região disponível, envie uma solicitação de suporte do Azure.

Aspetos importantes

  • Tempo de implantação - A criação de um grupo de contêineres contendo recursos da GPU leva de 8 a 10 minutos. Isso se deve ao tempo adicional para provisionar e configurar uma VM de GPU no Azure.

  • Preços - Semelhante aos grupos de contêineres sem recursos de GPU, o Azure fatura os recursos consumidos durante a duração de um grupo de contêineres com recursos de GPU. A duração é calculada a partir do momento em que a imagem do primeiro contêiner é extraída até que o grupo de contêineres seja encerrado. Ele não inclui o tempo para implantar o grupo de contêineres.

    Veja os detalhes dos preços.

  • Drivers CUDA - As instâncias de contêiner com recursos de GPU são pré-provisionadas com drivers CUDA NVIDIA e tempos de execução de contêiner, para que você possa usar imagens de contêiner desenvolvidas para cargas de trabalho CUDA.

    Apoiamos através do CUDA 11 nesta fase. Por exemplo, você pode usar as seguintes imagens base para seu Dockerfile:

    Nota

    Para melhorar a confiabilidade ao usar uma imagem de contêiner público do Docker Hub, importe e gerencie a imagem em um registro de contêiner privado do Azure e atualize seu Dockerfile para usar sua imagem base gerenciada privadamente. Saiba mais sobre como trabalhar com imagens públicas.

Exemplo de YAML

Uma maneira de adicionar recursos de GPU é implantar um grupo de contêineres usando um arquivo YAML. Copie o seguinte YAML em um novo arquivo chamado gpu-deploy-aci.yaml e salve o arquivo. Este YAML cria um grupo de contêineres chamado gpucontainergroup especificando uma instância de contêiner com uma GPU V100. A instância executa um aplicativo de adição de vetor CUDA de exemplo. As solicitações de recursos são suficientes para executar a carga de trabalho.

Nota

O exemplo a seguir usa uma imagem de contêiner público. Para melhorar a confiabilidade, importe e gerencie a imagem em um registro de contêiner privado do Azure e atualize seu YAML para usar sua imagem base gerenciada privadamente. Saiba mais sobre como trabalhar com imagens públicas.

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: V100
  osType: Linux
  restartPolicy: OnFailure

Implante o grupo de contêineres com o comando az container create , especificando o nome do arquivo YAML para o --file parâmetro. Você precisa fornecer o nome de um grupo de recursos e um local para o grupo de contêineres, como o eastus , que suporta recursos de GPU.

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

A conclusão da implementação demora vários minutos. Em seguida, o contêiner inicia e executa uma operação de adição de vetor CUDA. Execute o comando az container logs para exibir a saída do log:

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

Resultado:

[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

Exemplo de modelo do Resource Manager

Outra maneira de implantar um grupo de contêineres com recursos de GPU é usando um modelo do Gerenciador de Recursos. Comece criando um arquivo chamado gpudeploy.jsone, em seguida, copie o JSON a seguir para ele. Este exemplo implanta uma instância de contêiner com uma GPU V100 que executa um trabalho de treinamento do TensorFlow no conjunto de dados MNIST. As solicitações de recursos são suficientes para executar a carga de trabalho.

{
    "$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"
        }
      }
    ]
}

Implante o modelo com o comando az deployment group create . Você precisa fornecer o nome de um grupo de recursos que foi criado em uma região como eastus que suporta recursos de GPU.

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

A conclusão da implementação demora vários minutos. Em seguida, o contêiner inicia e executa o trabalho TensorFlow. Execute o comando az container logs para exibir a saída do log:

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

Resultado:

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 V100 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 V100, 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

Clean up resources (Limpar recursos)

Como o uso de recursos de GPU pode ser caro, certifique-se de que seus contêineres não sejam executados inesperadamente por longos períodos. Monitore seus contêineres no portal do Azure ou verifique o status de um grupo de contêineres com o comando az container show . Por exemplo:

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

Quando terminar de trabalhar com as instâncias de contêiner criadas, exclua-as com os seguintes comandos:

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

Próximos passos

  • Saiba mais sobre como implantar um grupo de contêineres usando um arquivo YAML ou um modelo do Gerenciador de Recursos.
  • Saiba mais sobre tamanhos de VM otimizados para GPU no Azure.