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 e T4 (links em inglês). 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 VMs preemptivas se as cargas de trabalho conseguem tolerar interrupções frequentes de nó. O uso de VMs preemptivas reduz o preço da execução de GPUs. 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ó do SO otimizado para contêineres, 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.

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.

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 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 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 o menu "Cotas" do Identity and Access Management (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

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 com escalonamento automático

Para aproveitar o melhor custo-benefício das 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 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.

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]

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 ou nvidia-tesla-t4.
  • amount: o número de GPUs que serão 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. É preciso que o cluster já esteja em execução na zona especificada.
  • cluster-name: o nome do cluster em que 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.

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

  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. Clique em Adicionar pool de nós.

  5. Como opção, marque a caixa de seleção Ativar escalonamento automático.

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

  7. No painel esquerdo, selecione Nós e expanda Plataforma de CPU e GPU.

  8. Clique em Adicionar GPU.

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

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

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

  12. 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

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 ou nvidia-tesla-t4.
  • 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.

  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 compute-region \
  --node-locations compute-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 ou nvidia-tesla-t4.
  • amount: o número de GPUs que serão executadas por nó.
  • compute-region: a região do cluster, como us-central1.
  • compute-zone: uma zona do Compute na 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 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, escolha Regional. Em Região, selecione a região desejada.

  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 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 instala os drivers automaticamente.

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

  • 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 você quiser usar vários tipos de aceleradores de GPU por cluster, 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 (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 ou nvidia-tesla-t4

Para se concentrar em determinados tipos de GPU, adicione um 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: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

A plataforma de computação paralela CUDA® é 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 é 10.0 no COS (1.11.5 ou superior) e no Ubuntu (1.11.8-gke.4/1.12.6-gke.6 e superiores).

Como monitorar os nós da GPU

O GKE publica 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 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 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