Como executar 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

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

Também é possível usar GPUs com Spot VMs (Visualização) se as cargas de trabalho conseguem tolerar interrupções frequentes de nó. O uso de Spot VMs reduz o preço da execução de GPUs. Para saber mais, consulte Como usar Spot VMs com pools de nós do GPU.

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ó do 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 do nó do 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 desejada antes de criar nós de GPU. Para garantir que você tenha uma cota de GPU suficiente no seu projeto, consulte a página de cotas no Console do Google Cloud.

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

  • Drivers da GPU NVIDIA: é preciso instalar manualmente os drivers da GPU NVIDIA nos nós. Mais abaixo nesta página, explicamos como instalar os drivers.

  • GPUs A100: as GPUs A100 são compatíveis apenas com tipos de máquina A2 e exigem a versão 1.18.6-gke.3504 ou superior do GKE.

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 nodes da GPU não podem ser migrados ao vivo durante os eventos de manutenção.
  • As GPUs são compatíveis apenas com tipos de máquinas N1 de uso geral.
  • As GPUs não são compatíveis com os pools de nós do Windows Server.

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 pretende executar os clusters.

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

Também é possível ver as GPUs disponíveis em sua zona usando a ferramenta de linha de comando 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ços

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

Cota de GPU

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

A cota de GPU precisa ser pelo menos equivalente ao número total de GPUs que você pretende executar no cluster. Se você ativar o dimensionamento automático de cluster, será necessário solicitar uma cota de GPU equivalente pelo menos 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.

Para pesquisar a cota de GPU, execute as seguintes etapas no Console do Cloud:

  1. Acesse a página Cotas em "IAM e Admin" no Console do Cloud.

    Acessar "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 "Métricas" com as métricas das GPUs selecionadas.

  4. Feche o menu suspenso Métricas.

Como enviar a solicitação de cota

Para enviar uma solicitação de cota, execute as seguintes etapas no Console do Cloud:

  1. Na lista de cotas de GPU, selecione as cotas para as regiões desejadas, como us-central1.
  2. Clique em Editar cotas. Um formulário de solicitação é exibido 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 de dimensionamento automático

Para aproveitar o melhor custo-benefício das GPUs no GKE e o dimensionamento 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 não baseado em GPU, o GKE faz um taint automaticamente dos nós com o seguinte código:

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

Além disso, o GKE aplica automaticamente as tolerâncias correspondentes aos pods que solicitam GPUs ao executar o controlador de admissão ExtendedResourceToleration (em inglês).

Isso faz com que apenas os pods que solicitam GPUs sejam programados para os nós da GPU. Esse processo permite um escalonamento automático mais eficiente, porque os nós podem ser reduzidos rapidamente se não houver pods suficientes que requerem GPUs.

Crie um pool de nós de 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
  --machine-type a2-highgpu-1g]

Substitua:

  • 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, nvidia-tesla-t4 ou nvidia-tesla-a100.
  • AMOUNT: o número de GPUs que serão anexadas aos nós no pool de nós.
  • COMPUTE_ZONE: a zona do Compute onde o pool de nós será criado, como us-central1-c. É preciso que o cluster já esteja em execução na zona especificada.
  • CLUSTER_NAME: o nome do cluster no qual o pool de nós será criado.

As opções adicionais são as seguintes:

  • --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 de carga de trabalho for alterada.
  • --machine-type especifica o tipo de máquina para os nós. Obrigatório para GPUs nvidia-tesla-a100, que só podem ser executadas em tipos de máquina A2.

Por exemplo, o comando a seguir 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

Para criar um pool de nós com GPUs:

  1. Acesse a página do Google Kubernetes Engine no Console do Cloud.

    Acessar o Google Kubernetes Engine

  2. Na lista de clusters, clique no nome do cluster que você quer modificar.

  3. Clique em Adicionar pool de nós.

  4. Opcionalmente, na página Detalhes do pool de nós, marque a caixa de seleção Ativar escalonamento automático.

  5. Configure o pool de nós como quiser.

  6. No painel de navegação, selecione Nós.

  7. Em Família de máquinas, clique em GPU.

  8. Selecione um Tipo de GPU e o Número de GPUs para serem executados em cada nó.

  9. Leia o aviso e selecione Entendo as limitações.

  10. Configure a máquina como quiser.

  11. Clique em Criar.

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

Substitua:

  • 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, nvidia-tesla-t4 ou nvidia-tesla-a100.
  • AMOUNT: o número de GPUs que serão executadas no pool de nós padrão.
  • COMPUTE_ZONE: a zona do Compute do cluster, como us-central1-c.

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ó:

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 pools de nós de GPU.

  3. Leia o aviso e selecione Entendo as limitações.

  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 COMPUTE_REGION \
  --node-locations COMPUTE_ZONE,COMPUTE_ZONE1

Substitua:

  • 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, nvidia-tesla-t4 or nvidia-tesla-a100).
  • AMOUNT: o número de GPUs que serão executadas por nó.
  • COMPUTE_REGION: a região do cluster, como us-central1.
  • COMPUTE_ZONE,COMPUTE_ZONE1,[...]: as zonas em que os nós serão criados. As zonas precisam estar no mesmo COMPUTE_REGION que os planos de controle do cluster, especificados pela sinalização --region. Essas 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 for 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, selecione Regional.

  3. Na lista suspensa Região, selecione a região que você quer.

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

  5. Leia o aviso e selecione Entendo as limitações.

  6. Clique em Criar.

Como instalar drivers de dispositivo da GPU NVIDIA

Depois de adicionar nós da GPU ao seu cluster, você precisa instalar os drivers de dispositivo da NVIDIA nesses nós. O Google fornece um DaemonSet que pode ser aplicado para instalar os drivers.

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

COS

Para implantar o DaemonSet de instalação, 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 segundos para ser concluída. Depois que é instalado, o plug-in do dispositivo GPU NVIDIA mostra a capacidade da GPU por meio das APIs do Kubernetes.

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

Versão do GKE Driver NVIDIA
1.18 e posterior 450.119.04
1.14 e posterior 418.67

Ubuntu

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

Para implantar o DaemonSet de instalação, 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 que é instalado, o plug-in do dispositivo GPU NVIDIA mostra a capacidade da GPU por meio das APIs do Kubernetes.

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

Versão do GKE Driver NVIDIA
1.19.8-gke.1200 e superior 450.102.04
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

Como usar o provisionamento automático de nós com GPUs

Ao usar o provisionamento automático de nós com GPUs, os pools de nós provisionados automaticamente não têm escopos suficientes para executar o DaemonSet de instalação. É necessário alterar manualmente os escopos de provisionamento automático padrão para ativar isso.

gcloud container clusters update CLUSTER_NAME --enable-autoprovisioning \
    --autoprovisioning-scopes=https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring,https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/compute

Para saber mais sobre o provisionamento automático, consulte a página de provisionamento automático.

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 (em inglês) usando o par de chave-valor a seguir:

  • Chave: nvidia.com/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:11.0.3-runtime-ubuntu20.04
    command: ["/bin/bash", "-c", "--"]
    args: ["while true; do sleep 600; done;"]
    resources:
      limits:
       nvidia.com/gpu: 2

Como consumir vários tipos de GPU

Se você quiser usar vários tipos de aceleradores de GPU por cluster, precisará criar vários pools de nós, cada um com seu próprio tipo de acelerador. O GKE anexa um seletor de nós (em inglês) exclusivo aos nós da GPU para alocar as cargas de trabalho nos 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, nvidia-tesla-t4 ou nvidia-tesla-a100.

Para segmentar determinados tipos de GPU, adicione esse seletor de nó à 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:11.0.3-runtime-ubuntu20.04
    command: ["/bin/bash", "-c", "--"]
    args: ["while true; do sleep 600; done;"]
    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 or nvidia-tesla-a100

Sobre as bibliotecas CUDA

O CUDA® é a plataforma de computação paralela e o modelo de programação da NVIDIA para GPUs. Os drivers de dispositivo da NVIDIA que você instala no cluster incluem as bibliotecas CUDA (links em inglês).

Os utilitários de depuração e as 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 nos 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 (em inglês) nos aplicativos CUDA no GKE. LD_LIBRARY_PATH já está definido corretamente. A versão compatível do CUDA mais recente é 11.0 no COS (1.18.6-gke.3504 ou superior) e no Ubuntu (1.19.8-gke.1200 ou superior).

Como monitorar os nós da GPU

O GKE publica as métricas do Stackdriver Monitoring a seguir para contêineres que usam 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 também estão disponíveis no Cloud Monitoring.

Para mais informações sobre o monitoramento dos seus clusters e os recursos deles, consulte a seção 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.

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

  1. Acesse a página Cargas de trabalho no Console do Cloud.

    Acesse "Cargas de trabalho"

  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