GPUs

Nesta página, mostramos como usar os aceleradores de hardware da unidade de processamento gráfico (GPU, na sigla em inglês) NVIDIA® nos nós dos clusters do Google Kubernetes Engine (GKE).

Visão geral

Usando o GKE, é possível criar pools de nós equipados com as GPUs NVIDIA Tesla® K80, P100, P4, V100 e T4. As GPUs oferecem computação avançada para realizar tarefas de aprendizado profundo, como reconhecimento de imagem, processamento de linguagem natural, e outras tarefas que exigem computação intensiva, como transcodificação de vídeo e processamento de imagens.

Também é possível usar GPUs com VMs preemptivas caso as cargas de trabalho consigam tolerar interrupções frequentes de nós. O uso de VMs preemptivas reduz o preço de GPUs em execução. Para saber mais, consulte GPUs em instâncias preemptivas.

Requisitos

As GPUs no GKE têm os seguintes requisitos:

Versão do Kubernetes
Para pools de nós que usam a imagem de nó Container-Optimized OS, os nós da GPU estão disponíveis na versão 1.9 ou superior do GKE. Para os pools de nós que usam a imagem de nó Ubuntu, os nós da GPU estão disponíveis na versão 1.11.3 ou superior do GKE.
Cota de GPU

Você precisa ter uma cota de GPU do Compute Engine na zona pretendida para criar nós de GPU. Para garantir que você tenha cota de GPU suficiente em seu projeto, consulte Cotas no Console do Google Cloud.

Se precisar de mais cota de GPU, solicite no Console do Cloud. Se o projeto tiver uma conta de faturamento estabelecida, ele receberá a cota automaticamente depois que você enviar a solicitação.

Drivers de GPU NVIDIA

É preciso instalar manualmente os drivers da GPU NVIDIA nos nós. Nesta página, explicamos como instalar os drivers.

Limitações

Antes de usar as GPUs no GKE, tenha em mente as seguintes limitações:

  • Não é possível adicionar GPUs a pools de nós existentes.
  • Os nós da GPU não podem ser migrados em tempo real durante os eventos de manutenção.

Disponibilidade

As GPUs estão disponíveis em regiões e zonas específicas. Ao solicitar a cota de GPU, pense nas regiões em que você pretende executar os clusters.

Para uma lista completa de regiões e zonas aplicáveis, consulte GPUs no Compute Engine.

Também é possível ver GPUs disponíveis em sua zona com a ferramenta de linha de comando gcloud.

gcloud

Para ver uma lista de todos os tipos de aceleradores de GPU aceitos em cada zona, execute o seguinte comando:

gcloud compute accelerator-types list

Preço

Para informações sobre preços de GPUs, consulte a tabela de preços na página GPU do GCP.

Cota de GPU

A cota de GPU é o número total de GPUs que podem ser executadas no projeto do GCP. Para criar clusters com GPUs, é preciso que o projeto tenha cota suficiente.

A cota precisa ser pelo menos equivalente ao número total de GPUs que você pretende executar no cluster. Se ativar o escalonamento automático de cluster, você precisará solicitar uma cota de GPU pelo menos equivalente ao número máximo de nós do cluster multiplicado pelo número de GPUs por nó.

Por exemplo, se você criar um cluster com três nós que executem duas GPUs por nó, o projeto precisará de pelo menos seis cotas de GPUs.

Como solicitar cotas de GPU

Para solicitar uma cota de GPU, use o Console do Cloud. Para mais informações sobre como solicitar cotas, consulte Como solicitar cota adicional na documentação do Compute Engine.

Console

Siga as etapas abaixo:

  1. Acesse o menu "Cotas" do Cloud Identity and Access Management (Cloud IAM) no Console do Cloud.

    Acessar o menu "Cotas"

  2. No menu suspenso Métricas, clique em Nenhuma e digite "gpus" no campo de pesquisa.

  3. Nos resultados da pesquisa, selecione as GPUs desejadas:

    Uma captura de tela do menu suspenso

  4. Feche o menu suspenso Métricas.

Como enviar a solicitação de cota

Console

Siga as etapas abaixo:

  1. Na lista de cotas de GPU, selecione as cotas das regiões pretendidas, como us-central1.
  2. Clique em Editar cotas. Um formulário de solicitação é aberto no lado direito do Console do Cloud.
  3. Preencha o campo Novo limite de cota para cada solicitação de cota.
  4. Preencha o campo Descrição da solicitação com detalhes sobre a solicitação.
  5. Clique em Concluído.
  6. Clique em Enviar solicitação.

Como executar GPUs

Nas seções a seguir, explicamos como executar GPUs em clusters do GKE.

Como criar um pool de nós de GPU com escalonamento automático

Para aproveitar o melhor custo-benefício de GPUs no GKE e o escalonamento automático de cluster, recomendamos a criação de pools de nós de GPU separados nos clusters.

Quando você adiciona um pool de nós de GPU a um cluster atual que já executa um pool de nós não GPU, o GKE faz um taint automaticamente de nós com o seguinte taint de nós:

  • Chave: nvidia.com/gpu
  • Efeito: NoSchedule

Além disso, o GKE aplica automaticamente as tolerâncias correspondentes aos pods que solicitam GPUs durante a execução do controlador de admissão ExtendedResourceToleration.

Isso faz apenas pods que solicitam GPUs sejam programados em nós GPU, o que permite um escalonamento automático mais eficiente: seus nós GPU poderão ser reduzidos rapidamente se não houver pods suficientes exigindo GPUs.

Crie um pool de nós GPU em um cluster atual usando o Console do Cloud ou a ferramenta de linha de comando gcloud.

gcloud

Para criar um pool de nós com GPUs, execute o seguinte comando:

    gcloud container node-pools create [POOL_NAME] \
    --accelerator type=[GPU_TYPE],count=[AMOUNT] --zone [COMPUTE_ZONE] \
    --cluster [CLUSTER_NAME] [--num-nodes 3 --min-nodes 0 --max-nodes 5 \
    --enable-autoscaling]
    

em que:

  • [POOL_NAME] é o nome escolhido para o pool de nós;
  • [GPU_TYPE] é o tipo de GPU: nvidia-tesla-k80, nvidia-tesla-p100, nvidia-tesla-p4, nvidia-tesla-v100 ou nvidia-tesla-t4;
  • [AMOUNT] é o número de GPUs a serem anexadas aos nós no pool de nós;
  • [COMPUTE_ZONE] é a zona do Compute em que o pool de nós será criado, como us-central1-c. o cluster já precisa estar em execução na zona especificada;
  • [CLUSTER_NAME] é o nome do cluster em que o pool de nós será criado;
  • --num-nodes especifica o número inicial de nós a serem criados;
  • --min-nodes especifica o número mínimo de nós a serem executados em um determinado momento;
  • --max-nodes especifica o número máximo de nós que podem ser executados;
  • --enable-autoscaling permite que o pool de nós faça escalonamento automático quando a demanda da carga de trabalho é alterada.

Por exemplo, o seguinte comando cria um pool de nós de escalonamento automático, p100, com duas GPUs P100, no cluster p100-cluster:

gcloud container node-pools create p100 \
    --accelerator type=nvidia-tesla-p100,count=2 \
    --zone us-central1-c --cluster p100-cluster \
    --num-nodes 3 --min-nodes 0 --max-nodes 5 --enable-autoscaling

Console

  1. Acesse o menu do Google Kubernetes Engine no Console do Cloud.

    Acessar o menu do Google Kubernetes Engine

  2. Selecione o cluster pretendido.

  3. Clique em Editar.

  4. Em Pools de nós, clique em Adicionar pool de nós.

  5. Como opção, na lista suspensa Escalonamento automático, selecione Ativado.

  6. Configure o pool de nós como quiser. Em seguida, em Tipo de máquina, clique em Personalizar.

  7. Na lista suspensa Número de GPUs, selecione o número pretendido de GPUs a serem executadas por nó.

  8. Na lista suspensa Tipo de GPU, selecione o tipo de GPU pretendido.

  9. Confirme o alerta marcando a caixa de seleção Entendo as limitações.

  10. Clique em Salvar.

Como criar um novo cluster zonal com GPUs

Crie um cluster zonal que execute GPUs usando o Console do Cloud ou a ferramenta de linha de comando gcloud.

gcloud

Para criar um cluster zonal com GPUs em execução no pool de nós padrão, execute o seguinte comando:

    gcloud container clusters create [CLUSTER_NAME] \
    --accelerator type=[GPU_TYPE],count=[AMOUNT] \
    --zone [COMPUTE_ZONE]
    

em que:

  • [CLUSTER_NAME] é o nome que você escolheu para o cluster.
  • [GPU_TYPE] é o tipo de GPU: nvidia-tesla-k80, nvidia-tesla-p100, nvidia-tesla-p4, nvidia-tesla-v100 ou nvidia-tesla-t4;
  • [AMOUNT] é o número de GPUs a serem executadas no pool de nós padrão;
  • [COMPUTE_ZONE] é a zona do Compute do cluster, como us-central1-c.

Por exemplo, o seguinte comando cria um cluster, p100, com três nós (o padrão quando --num-nodes é omitido) e duas GPUs P100 por nó:

gcloud container clusters create p100 \
    --accelerator type=nvidia-tesla-p100,count=2 \
    --zone us-central1-c

Console

  1. Acesse o modelo de cluster Computação acelerada por GPU.

    Acessar o modelo de computação acelerada por GPU

  2. Configure o cluster como quiser. Em seguida, personalize o pool de nós da GPU ou adicione outros.

  3. Marque Entendo as limitações no aviso que será exibido.

  4. Clique em Criar.

Como criar um novo cluster regional com GPUs

Por padrão, os clusters regionais criam nós em três zonas de uma região. No entanto, nenhuma região do Google Cloud tem GPUs em todas as três zonas. Ao criar um cluster regional com GPUs, você precisa especificar zonas usando o comando --node-locations. Também será possível usar esse comando depois que você tiver criado o cluster. Para saber quais zonas têm GPUs, consulte Disponibilidade.

Você cria um cluster GPU regional usando a ferramenta de linha de comando gcloud ou o Console do Cloud.

gcloud

Para criar um cluster regional com GPUs, execute o seguinte comando:

    gcloud container clusters create [CLUSTER_NAME] \
    --accelerator type=[GPU_TYPE],count=[AMOUNT] \
    --region [REGION] --node-locations [ZONE],[ZONE]
    

em que:

  • [CLUSTER_NAME] é o nome escolhido para o cluster;
  • [GPU_TYPE] é o tipo de GPU: nvidia-tesla-k80, nvidia-tesla-p100, nvidia-tesla-p4, nvidia-tesla-v100 ou nvidia-tesla-t4;
  • [AMOUNT] é o número de GPUs a serem executadas por nó;
  • [REGION] é a região do cluster, como us-central1;
  • [ZONE] é uma zona de computação dentro da região, como us-central1-c. As zonas precisam ter os tipos de GPU que você especificar.

Por exemplo, o comando a seguir cria um cluster, p100, com três nós (o padrão quando --num-nodes é omitido) e duas GPUs P100 por nó, em duas zonas dentro de us-central1:

gcloud container clusters create p100 \
    --accelerator type=nvidia-tesla-p100,count=2 \
    --region us-central1 \ --node-locations us-central1-a,us-central1-c

Console

  1. Acesse o modelo de cluster Computação acelerada por GPU.

    Acessar o modelo de computação acelerada por GPU

  2. Em tipo de local, escolha Regional. Em Região, selecione a região pretendida.

  3. Configure o cluster como quiser. Em seguida, personalize o pool de nós da GPU ou adicione outros.

  4. Marque Entendo as limitações no aviso que será exibido.

  5. Clique em Criar.

Como instalar drivers de dispositivo GPU NVIDIA

Depois de adicionar nós GPU ao cluster, você precisará instalar drivers de dispositivo da NVIDIA nesses nós. O Google fornece um DaemonSet que instala automaticamente os drivers.

Consulte a seção abaixo para instruções de instalação dos nós do Container-Optimized OS (COS) e do Ubuntu.

COS

Para implantar o DaemonSet de instalação (em inglês), execute o seguinte comando:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml

A instalação leva alguns minutos para ser concluída. Depois de instalado, o plug-in do dispositivo GPU NVIDIA mostrará a capacidade da GPU por meio das APIs do Kubernetes.

Na tabela a seguir, listamos a versão do GKE em que cada versão do driver NVIDIA é compatível:

Versão GKE Driver NVIDIA
1.14.2-gke.3 e superior 418.67
1.14.2-gke.2 e inferior 418.67
1.13.6-gke.6 e superior 418.67
1.13.6-gke.5 e inferior 410.79
1.12.x 410.79
1.11.5 e superior 410.79
1.10.5-gke.4 e superior 396.46
1.10.2-gke.3 e superior 390.46

Ubuntu

O suporte à GPU requer v1.11.3 ou superior para os nós do Ubuntu.

Para implantar o DaemonSet de instalação (em inglês), execute o seguinte comando:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/ubuntu/daemonset-preloaded.yaml

A instalação leva alguns segundos para ser concluída. Depois de instalado, o plug-in do dispositivo GPU NVIDIA mostrará a capacidade da GPU por meio das APIs do Kubernetes.

Na tabela a seguir, listamos a versão do GKE em que cada versão do driver NVIDIA é compatível:

Versão GKE Driver NVIDIA
1.14.6-gke.13 e posterior 418.74
1.14.6-gke.12 e anterior 410.104
1.13.9-gke.11 e posterior 418.74
1.13.9-gke.10 e anterior 410.104
1.12.6-gke.6 e superior 410.104
1.12.6-gke.5 e inferior 384.111
1.11.8-gke.4 e superior 410.104
1.11.8-gke.3 e inferior 384.111

Como configurar pods para consumir GPUs

Use um limite de recurso para configurar os pods para consumir GPUs. Especifique um limite de recurso em uma especificação de pod usando o seguinte par de chave-valor:

  • Chave: nvidia/gpu
  • Valor: número de GPUs a serem consumidas

Veja abaixo um exemplo de especificação de pod em que são consumidas GPUs:

apiVersion: v1
    kind: Pod
    metadata:
      name: my-gpu-pod
    spec:
      containers:
      - name: my-gpu-container
        image: nvidia/cuda:10.0-runtime-ubuntu18.04
        command: ["/bin/bash"]
        resources:
          limits:
           nvidia.com/gpu: 2

Como consumir vários tipos de GPU

Se quiser usar vários tipos de acelerador GPU por cluster, você precisará criar vários pools de nós, cada um com o próprio tipo de acelerador. O GKE anexa um seletor de nós exclusivo aos nós de GPU para ajudar a alocar cargas de trabalho de GPU em nós com tipos de GPU específicos:

  • Chave: cloud.google.com/gke-accelerator
  • Valor: nvidia-tesla-k80, nvidia-tesla-p100, nvidia-tesla-p4, nvidia-tesla-v100 ou nvidia-tesla-t4.

Para se concentrar em determinados tipos de GPU, adicione esse seletor de nós à especificação do pod da carga de trabalho. Exemplo:

apiVersion: v1
    kind: Pod
    metadata:
      name: my-gpu-pod
    spec:
      containers:
      - name: my-gpu-container
        image: nvidia/cuda:10.0-runtime-ubuntu18.04
        command: ["/bin/bash"]
        resources:
          limits:
           nvidia.com/gpu: 2
      nodeSelector:
        cloud.google.com/gke-accelerator: nvidia-tesla-k80 # or nvidia-tesla-p100 or nvidia-tesla-p4 or nvidia-tesla-v100 or nvidia-tesla-t4

Sobre as bibliotecas CUDA

CUDA® é o modelo de programação e plataforma de computação paralela da NVIDIA para GPUs. Os drivers de dispositivo NVIDIA instalados no cluster incluem as bibliotecas CUDA.

Os utilitários de depuração e bibliotecas CUDA são disponibilizados dentro do contêiner em /usr/local/nvidia/bin e /usr/local/nvidia/lib64, respectivamente.

Os aplicativos CUDA em execução em pods que consomem GPUs NVIDIA precisam descobrir dinamicamente as bibliotecas CUDA. Isso requer a inclusão de /usr/local/nvidia/lib64 na variável de ambiente LD_LIBRARY_PATH.

Use as imagens básicas CUDA do Docker baseadas em Ubuntu nos aplicativos CUDA no GKE, em que LD_LIBRARY_PATH já está definido corretamente. A versão compatível do CUDA mais recente é 10.0 em COS (1.11.5+) e Ubuntu (1.11.8-gke.4+, 1.12.6-gke.6+).

Como monitorar os nós da GPU

O GKE expõe as métricas do Stackdriver Monitoring a seguir para contêineres usando GPUs. Use-as para monitorar o desempenho das cargas de trabalho de GPU:

  • Ciclo de trabalho (container/accelerator/duty_cycle): porcentagem de tempo durante o período de amostra anterior (10 segundos) em que o acelerador estava realizando o processamento. Entre 1 e 100.
  • Uso da memória (container/accelerator/memory_used): quantidade de memória do acelerador alocada em bytes.
  • Capacidade de memória (container/accelerator/memory_total): memória total do acelerador em bytes.

Essas métricas são disponibilizadas no Stackdriver.

Para mais informações sobre como monitorar seus clusters e os recursos deles, consulte Monitoramento.

Ver as métricas de uso

Veja as métricas de uso de GPU das cargas de trabalho no painel Cargas de trabalho do Console do Cloud.

Console

Para ver o uso de GPU das cargas de trabalho, execute as seguintes etapas:

  1. Acesse o menu Cargas de trabalho no Console do Cloud.

    Acessar o menu do Google Kubernetes Engine

  2. Selecione a carga de trabalho desejada.

O painel "Cargas de trabalho" exibe gráficos de uso e capacidade de memória da GPU e de ciclo de trabalho da GPU.

A seguir