Neste guia, mostramos como otimizar o provisionamento de GPU para cargas de trabalho de treinamento de pequena e média escala usando o modo de provisionamento de início flexível. Neste guia, você usa flex-start para implantar uma carga de trabalho que consiste em dois jobs do Kubernetes. Cada job requer uma GPU. O GKE provisiona automaticamente um único nó com duas GPUs A100 para executar os dois jobs.
Se a carga de trabalho exigir processamento distribuído em vários nós, use o flex-start com provisionamento em fila. Para mais informações, consulte Executar uma carga de trabalho em grande escala com início flexível e provisionamento em fila.
Este guia é destinado a engenheiros de machine learning (ML), administradores e operadores de plataforma e especialistas em dados e IA interessados em usar os recursos de orquestração de contêineres do Kubernetes para executar cargas de trabalho em lote. Para mais informações sobre papéis comuns e tarefas de exemplo que referenciamos no conteúdo do Google Cloud , consulte Funções e tarefas comuns do usuário do GKE.
Preços de início flexível
O início flexível é recomendado se a carga de trabalho exigir recursos provisionados dinamicamente conforme necessário, por até sete dias com reservas de curto prazo, sem gerenciamento complexo de cota e acesso econômico. O início flexível é alimentado pelo Programador dinâmico de cargas de trabalho e é faturado usando os preços do Programador dinâmico de cargas de trabalho:
- Desconto de até 53% para vCPUs, GPUs e TPUs.
- Você paga conforme a utilização.
Antes de começar
Antes de começar, verifique se você realizou as tarefas a seguir:
- Ativar a API Google Kubernetes Engine. Ativar a API Google Kubernetes Engine
- Se você quiser usar a CLI do Google Cloud para essa tarefa,
instale e inicialize a
gcloud CLI. Se você instalou a gcloud CLI anteriormente, instale a versão
mais recente executando
gcloud components update
.
- Verifique se você tem um cluster do Autopilot ou um cluster Standard que esteja executando a versão 1.33.0-gke.1712000 ou mais recente.
- Confira se você conhece as limitações do flex-start.
- Ao usar um cluster padrão, verifique se você mantém pelo menos um pool de nós sem o início flexível ativado para que o cluster funcione corretamente.
- Verifique se você tem cota para GPUs preemptivas nos locais dos nós.
Se você não tiver um cluster ou se ele não atender aos requisitos, crie um cluster regional padrão usando a CLI gcloud. Adicione as seguintes flags para aprender sobre flex-start:
--location=us-central1 \
--node-locations=us-central1-a,us-central1-b \
--machine-type=g2-standard-8
Ao criar um pool de nós flex-start, use as flags mencionadas anteriormente e --accelerator type=nvidia-l4,count=1
.
Se você tiver um cluster padrão que atenda aos requisitos, as próximas seções vão orientar você na seleção de um tipo de acelerador de GPU e um tipo de máquina para seu cluster.
Escolher um tipo de acelerador de GPU
Se você usa um cluster no modo Autopilot, pule esta seção e vá para Executar uma carga de trabalho em lote.
A disponibilidade de GPU é específica para cada zona. Você precisa encontrar um tipo de acelerador de GPU disponível em uma zona em que o cluster Standard está. Se você tiver um cluster Standard regional, a zona em que o tipo de acelerador de GPU está disponível precisa estar na mesma região do cluster. Ao criar o pool de nós, especifique o tipo de acelerador e as zonas dos nós. Se você especificar um tipo de acelerador que não está disponível no local do cluster, a criação do pool de nós vai falhar.
Execute os comandos a seguir para receber o local do cluster e um tipo de acelerador de GPU compatível.
Confira o local em que o cluster está:
gcloud container clusters list
O resultado será assim:
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS STACK_TYPE example-cluster-1 us-west2 1.33.2-gke.1111000 34.102.3.122 e2-medium 1.33.2-gke.1111000 9 RUNNING IPV4
Liste os tipos de aceleradores de GPU disponíveis, exceto as estações de trabalho virtuais no local:
gcloud compute accelerator-types list | grep LOCATION_NAME | grep -v "Workstation"
Substitua
LOCATION_NAME
pelo local do cluster.Por exemplo, para receber uma lista de tipos de aceleradores de GPU na região
us-west2
, execute o seguinte comando:gcloud compute accelerator-types list | grep us-west2 | grep -v "Workstation"
O resultado será assim:
nvidia-b200 us-west2-c NVIDIA B200 180GB nvidia-tesla-p4 us-west2-c NVIDIA Tesla P4 nvidia-tesla-t4 us-west2-c NVIDIA T4 nvidia-tesla-p4 us-west2-b NVIDIA Tesla P4 nvidia-tesla-t4 us-west2-b NVIDIA T4
Escolher um tipo de máquina compatível
Se você usa um cluster no modo Autopilot, pule esta seção e vá para Executar uma carga de trabalho em lote.
Depois de saber quais GPUs estão disponíveis no local do cluster, você pode determinar os tipos de máquinas compatíveis.O Google Cloud restringe as GPUs a séries de máquinas específicas. Siga estas etapas para encontrar um tipo de máquina:
- Consulte a tabela Modelos de GPU disponíveis.
- Localize a linha do tipo de acelerador de GPU escolhido.
- Confira a coluna "Série da máquina" dessa linha. Essa coluna informa qual série de máquinas você precisa usar.
- Para conferir os nomes de tipo de máquina que podem ser especificados, clique no link na série de máquinas.
A única exceção é a série de máquinas N1, que oferece mais orientações sobre quais tipos de máquinas N1 podem ser usados com o tipo de acelerador escolhido.
Antes de usar uma máquina otimizada para aceleradores, verifique se ela é compatível com o modo de provisionamento de início flexível, conforme mostrado em Disponibilidade de opções de consumo por tipo de máquina.
Determinar a contagem de aceleradores
Se você usa um cluster no modo Autopilot, pule esta seção e vá para Executar uma carga de trabalho em lote.
Para criar um pool de nós, é necessário determinar o número de aceleradores a serem
anexados a cada nó no pool. Os valores válidos dependem do tipo de acelerador e de tipo de máquina. Cada tipo de máquina tem um limite de quantas GPUs ela pode
suportar. Para determinar qual valor usar (além do padrão 1
):
- Consulte os tipos de máquina de GPU.
- Na tabela, procure o tipo de acelerador para o tipo de série da máquina.
- Use o valor na coluna "Contagem de GPU".
Criar um pool de nós com início flexível
Se você usa um cluster no modo Autopilot, pule esta seção e vá para Executar uma carga de trabalho em lote.
Para criar um pool de nós com o início flexível ativado em um cluster Standard, use a CLI gcloud ou o Terraform.
gcloud
Crie um pool de nós com flex-start:
gcloud container node-pools create NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --location LOCATION_NAME \ --project PROJECT_ID \ --accelerator type=ACCELERATOR_TYPE,count=COUNT \ --machine-type MACHINE_TYPE \ --max-run-duration MAX_RUN_DURATION \ --flex-start \ --node-locations NODE_ZONES \ --num-nodes 0 \ --enable-autoscaling \ --total-min-nodes 0 \ --total-max-nodes 5 \ --location-policy ANY \ --reservation-affinity none \ --no-enable-autorepair
Substitua:
NODE_POOL_NAME
: o nome escolhido para o pool de nós.CLUSTER_NAME
: o nome do cluster padrão que você quer modificar.LOCATION_NAME
: a região de computação do plano de controle do cluster.PROJECT_ID
: o ID do projeto.ACCELERATOR_TYPE
: o tipo específico de acelerador (por exemplo,nvidia-tesla-t4
para NVIDIA T4) a ser anexado às instâncias.COUNT
: o número de aceleradores a serem anexados às instâncias. O valor padrão é1
.MACHINE_TYPE
: o tipo de máquina a ser usado para nós.MAX_RUN_DURATION
: opcional. O tempo de execução máximo de um nó em segundos, até o padrão de sete dias. O número inserido precisa terminar ems
. Por exemplo, para especificar um dia, insira86400s
.NODE_ZONES
: uma lista separada por vírgulas de uma ou mais zonas em que o GKE cria o pool de nós.
Neste comando, a flag
--flex-start
instruigcloud
a criar um pool de nós com o início flexível ativado.O GKE cria um pool de nós com nós que contêm duas instâncias do tipo de acelerador especificado. Inicialmente, o pool de nós tem zero nós, e o escalonamento automático está ativado.
Verifique o status do flex-start no pool de nós:
gcloud container node-pools describe NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --location LOCATION_NAME \ --format="get(config.flexStart)"
Se o flex-start estiver ativado no pool de nós, o campo
flexStart
será definido comoTrue
.
Terraform
É possível usar o flex-start com GPUs usando um módulo do Terraform.
- Adicione o seguinte bloco à configuração do Terraform:
resource "google_container_node_pool" " "gpu_dws_pool" {
name = "gpu-dws-pool"
queued_provisioning {
enabled = false
}
}
node_config {
machine_type = "MACHINE_TYPE"
accelerator_type = "ACCELERATOR_TYPE"
accelerator_count = COUNT
node_locations = ["NODE_ZONES"]
flex_start = true
}
Substitua:
MACHINE_TYPE
: o tipo de máquina a ser usado para nós.ACCELERATOR_TYPE
: o tipo específico de acelerador (por exemplo,nvidia-tesla-t4
para NVIDIA T4) a ser anexado às instâncias.COUNT
: o número de aceleradores a serem anexados às instâncias. O valor padrão é1
.NODE_ZONES
: a lista separada por vírgulas de uma ou mais zonas em que o GKE cria o pool de nós.
O Terraform chama APIs do Google Cloud para criar um cluster com um pool de nós que usa início flexível com GPUs. Inicialmente, o pool de nós não tem nós, e o escalonamento automático está ativado. Para saber mais sobre o Terraform, consulte as
especificações de recursos do google_container_node_pool
em terraform.io.
Executar uma carga de trabalho em lote
Nesta seção, você vai criar dois jobs do Kubernetes que exigem uma GPU cada. Um controlador de job no Kubernetes cria um ou mais pods e garante que eles executem uma tarefa específica com sucesso.No Google Cloud console, inicie uma sessão do Cloud Shell clicando em
Ativar o Cloud Shell. Uma sessão é aberta no painel inferior do console Google Cloud .
Crie um arquivo chamado
dws-flex-start.yaml
:apiVersion: batch/v1 kind: Job metadata: name: job-1 spec: template: spec: nodeSelector: cloud.google.com/gke-flex-start: "true" cloud.google.com/gke-accelerator: ACCELERATOR_TYPE containers: - name: container-1 image: gcr.io/k8s-staging-perf-tests/sleep:latest args: ["10s"] # Sleep for 10 seconds resources: requests: nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1 restartPolicy: OnFailure --- apiVersion: batch/v1 kind: Job metadata: name: job-2 spec: template: spec: nodeSelector: cloud.google.com/gke-flex-start: "true" cloud.google.com/gke-accelerator: ACCELERATOR_TYPE containers: - name: container-2 image: gcr.io/k8s-staging-perf-tests/sleep:latest args: ["10s"] # Sleep for 10 seconds resources: requests: nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1 restartPolicy: OnFailure
Aplique o manifesto
dws-flex-start.yaml
:kubectl apply -f dws-flex-start.yaml
Verifique se os jobs estão sendo executados no mesmo nó:
kubectl get pods -l "job-name in (job-1,job-2)" -o wide
O resultado será assim:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES job-1 0/1 Completed 0 19m 10.(...) gke-flex-zonal-a2 <none> <none> job-2 0/1 Completed 0 19m 10.(...) gke-flex-zonal-a2 <none> <none>
Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados nesta página, exclua o projeto que contém os recursos ou mantenha o projeto e exclua os recursos individuais.
Excluir o projeto
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Excluir o recurso individual
Exclua os jobs:
kubectl delete job -l "job-name in (job-1,job-2)"
Exclua o pool de nós:
gcloud container node-pools delete NODE_POOL_NAME \ --location LOCATION_NAME
Exclua o cluster:
gcloud container clusters delete CLUSTER_NAME
A seguir
- Saiba mais sobre GPUs no GKE.
- Saiba mais sobre o provisionamento automático de nós.
- Saiba mais sobre as práticas recomendadas para executar cargas de trabalho em lote no GKE.