Implantar instâncias de contêiner que usam recursos 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 GPU. As instâncias de contêiner no grupo podem acessar um ou mais GPUs NVIDIA Tesla ao executar cargas de trabalho de contêiner, como CUDA e aplicativos de aprendizado profundo.

Este artigo mostra como adicionar recursos GPU quando implanta um grupo de contêineres usando um arquivo YAML ou modelo do Resource Manager. Também é possível especificar recursos GPU ao implantar uma instância de contêiner usando o portal do Azure.

Importante

Esse recurso está na versão prévia no momento; algumas limitações se aplicam. As versões prévias são disponibilizadas com a condição de que você concorde com os termos de uso complementares. Alguns aspectos desse recurso podem alterar antes da GA (disponibilidade geral).

Limitações de visualização

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

Disponibilidade de região

Regiões Sistema operacional SKUs de GPU disponíveis
Leste dos EUA, Oeste da Europa, Oeste dos EUA 2 Linux K80, P100, V100
Sudeste Asiático Linux P100, V100
Índia Central Linux V100
Norte da Europa Linux K80

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

Tipos de sistema operacional com suporte: somente Linux

Limitações adicionais: não é possível usar os recursos GPU durante a implantação de um grupo de contêineres em uma rede virtual.

Sobre os recursos de GPU

Contagem e SKU

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

  • Contagem – o número de GPUs: 1, 2 ou 4.

  • SKU – SKU de GPU: K80, P100 ou V100. Cada SKU é mapeado para o GPU de NVIDIA Tesla em uma das seguintes famílias VM habilitada para GPU do Azure:

    SKU Família da VM
    K80 NC
    P100 NCv2
    V100 NCv3

Máximo de recursos por SKU

Sistema operacional GPU SKU Contagem de GPU CPU máxima Memória máxima (GB) Armazenamento (GB)
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

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

Importante

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

Observações importantes

  • Tempo de implantação - criação de um grupo de contêineres que contém recursos GPU que leva até 8 a 10 minutos. Isso é devido ao tempo adicional para provisionar e configurar uma VM de GPU no Azure.

  • Preços – semelhante aos grupos de contêiner sem recursos GPU, as cobranças do Azure para recursos consumidos ao longo da duração de um grupo de contêiner com recursos GPU. A duração é calculada desde o momento para efetuar pull de sua primeira imagem do contêiner até que o grupo de contêineres termina. Não inclui o tempo de implantação do grupo de contêiner.

    Consulte detalhes de preço.

  • Drivers CUDA - instâncias de contêiner com os recursos GPU são previamente provisionadas com drivers NVIDIA CUDA e runtimes do contêiner, portanto, você pode usar imagens de contêiner desenvolvido para cargas de trabalho do CUDA.

    Damos suporte apenas a CUDA 9.0 neste estágio. Por exemplo, é possível usar as seguintes imagens base para o Dockerfile:

    Observação

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

Exemplo YAML

Uma maneira de adicionar recursos GPU é implantar um grupo de contêineres usando um arquivo YAML. Copie o YAML a seguir para um novo arquivo chamado aci.yaml implantar gpu, em seguida, salve o arquivo. Esse YAML cria um grupo de contêiner chamado gpucontainergroup especificando uma instância de contêiner com uma GPU K80. A instância é executada em um aplicativo de adição de vetor CUDA de exemplo. As solicitações de recurso são suficientes para executar a carga de trabalho.

Observação

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 do Azure privado e atualize o YAML para usar a imagem de base gerenciada de forma privada. Saiba mais sobre como trabalhar com imagens públicas.

additional_properties: {}
apiVersion: '2019-12-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

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

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

A implantação leva vários minutos para ser concluída. 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 script:

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

Saída:

[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 GPU é usando um modelo do Resource Manager. Crie um arquivo chamado gpudeploy.json e copie o seguinte JSON para ele. Este exemplo implanta uma instância de contêiner com um GPU V100 que executa um trabalho de treinamento TensorFlow em relação a conjunto de dados MNIST. As solicitações de recurso 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": "2019-12-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 é compatível com os recursos GPU.

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

A implantação leva vários minutos para ser concluída. Em seguida, o contêiner inicia e executa o trabalho de TensorFlow. Execute o comando az container logs para exibir a saída do script:

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

Saída:

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

Limpar os recursos

Como usar recursos GPU pode ser caro, certifique-se de que os contêineres não são executados inesperadamente por longos períodos. Monitore seus contêineres no portal do Azure, ou verifique o status de um grupo de contêiner com o comando do 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 que criou, exclua-as com os comandos a seguir:

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

Próximas etapas