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 cotas 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 (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 o comando
gcloud components update. Talvez as versões anteriores da gcloud CLI não sejam compatíveis com a execução dos comandos neste documento.
- 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 TPUs preemptivas nos locais dos nós.
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 padrão, use a CLI gcloud.
Criar um pool de nós de fração de TPU de host único
É possível criar um pool de nós de fração de TPU de host único com início flexível:
Crie um pool de nós com início flexível:
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --node-locations=NODE_ZONES \ --machine-type=MACHINE_TYPE \ --reservation-affinity=none \ --enable-autoscaling \ --flex-start \ --num-nodes 0 \ --min-nodes=0 \ --max-nodes=1Substitua:
NODE_POOL_NAME: o nome escolhido para o pool de nós.CLUSTER_NAME: o nome do cluster.CONTROL_PLANE_LOCATION: a região de computação do plano de controle do cluster.NODE_ZONES: a lista separada por vírgulas de uma ou mais zonas em que o GKE cria o pool de nós.MACHINE_TYPE: o tipo de máquina a ser usado para nós. Para mais informações sobre os tipos de máquinas compatíveis com TPU, use a tabela em Escolher a versão da TPU.Por exemplo, o comando de criação do pool de nós pode incluir os seguintes parâmetros:
... --machine-type=ct6e-standard-4t \ --tpu-topology=4x4 \ --enable-autoscaling \ --num-nodes=0 \ --max-nodes=4 \Esse comando define o campo
--max-nodescomo4porque uma topologia4x4consiste em 16 chips e cada VMct6e-standard-4ttem 4 chips.O escalonador automático de cluster aumenta a escala até o número de nós que sua carga de trabalho exige. Depois que a carga de trabalho for concluída, o escalonador automático de cluster vai reduzir a escala vertical para zero nós.
--reservation-affinity=none:o início flexível não usa nem exige reservas.
Criar um pool de nós de fração de TPU com vários hosts
As etapas para criar um pool de nós de fração de TPU de vários hosts variam dependendo se você usa o Ironwood (TPU7x) ou uma versão anterior da TPU.Ironwood (TPU7x)
É possível criar um pool de nós de fração de TPU de vários hosts na versão Ironwood (TPU7x) usando a Google Cloud CLI ou o Terraform:
gcloud
Para criar um pool de nós de fração de TPU de vários hosts com Ironwood (TPU7x), primeiro crie uma política de carga de trabalho.
Crie uma política de carga de trabalho:
gcloud compute resource-policies create workload-policy WORKLOAD_POLICY_NAME \ --type=HIGH_THROUGHPUT \ --accelerator-topology=TPU_TOPOLOGY \ --project=PROJECT_ID \ --region=REGIONSubstitua:
WORKLOAD_POLICY_NAME: um nome para a política de carga de trabalho.TPU_TOPOLOGY: a topologia da TPU Ironwood (TPU7x). Por exemplo,2x2x2. Para conferir todas as topologias do Ironwood (TPU7x) compatíveis, consulte a seção de topologia.PROJECT_ID: o ID do projeto Google Cloud .REGION: a região da política de carga de trabalho. Uma política de carga de trabalho é um recurso regional e pode ser reutilizada em pools de nós que compartilham a mesma topologia.
Crie o pool de nós com a política de carga de trabalho:
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=us-central1 \ --node-locations=us-central1-c \ --machine-type=tpu7x-standard-4t \ --reservation-affinity=none \ --enable-autoscaling \ --num-nodes=0 --min-nodes=0 --max-nodes=MAX_NODES \ --flex-start \ --placement-policy=WORKLOAD_POLICYSubstitua:
NODE_POOL_NAME: o nome do novo pool de nós.WORKLOAD_POLICY: o nome da política de carga de trabalho que você criou.MAX_NODES: o tamanho máximo do pool de nós. A flag--max-nodesserá obrigatória se--enable-autoscalingfor fornecido e precisar ser igual ao produto dos valores definidos emTPU_TOPOLOGY({A}x{B}x{C}) dividido pelo número de ícones para cada VM. Por exemplo, seTPU_TOPOLOGYfor2x2x2, o produto será 8. Como cada VM emtpu7x-standard-4ttem quatro chips, o número de nós é dois.
Esse comando cria um pool de nós chamado NODE_POOL_NAME com as seguintes características:
--machine-type=tpu7x-standard-4tespecifica o tipo de máquina Ironwood (TPU7x).- O
--flex-startativa o início flexível.
Terraform
- Use a versão 4.84.0 ou mais recente do
provedor
google. Crie uma política de carga de trabalho:
resource "google_compute_resource_policy" { name = "WORKLOAD_POLICY_NAME" region = CLUSTER_LOCATION workload_policy { type = "HIGH_THROUGHPUT" accelerator_topology = "TPU_TOPOLOGY" } }Substitua:
WORKLOAD_POLICY_NAME: um nome para a política de carga de trabalho.CLUSTER_LOCATION: local do Compute do cluster. Recomendamos ter um cluster regional para aumentar a confiabilidade do plano de controle do Kubernetes. Também é possível usar um cluster zonal. Para mais informações, consulte Selecionar uma versão e uma topologia de TPU.TPU_TOPOLOGY: a topologia da TPU Ironwood (TPU7x). Por exemplo,2x2x2. Para conferir todas as topologias do Ironwood (TPU7x) compatíveis, consulte Planejar TPUs.
Para mais informações sobre a referência
google_compute_resource_policy, consulte Provedor do Terraform.Na configuração do Terraform, adicione o seguinte bloco:
resource "google_container_node_pool" "NODE_POOL_RESOURCE_NAME" { provider = google project = PROJECT_ID cluster = CLUSTER_NAME name = POOL_NAME location = CLUSTER_LOCATION node_locations = [NODE_ZONES] initial_node_count = NUM_NODES autoscaling { max_node_count = MAX_NODES location_policy = "ANY" } node_config { machine_type = MACHINE_TYPE reservation_affinity { consume_reservation_type = "SPECIFIC_RESERVATION" key = "compute.googleapis.com/reservation-name" values = [RESERVATION_LABEL_VALUES] } flex_start = true } placement_policy { policy_name = WORKLOAD_POLICY_NAME } }Substitua:
NODE_POOL_RESOURCE_NAME: o nome do recurso do pool de nós no modelo do Terraform.PROJECT_ID: o ID do projeto.CLUSTER_NAME: o nome do cluster atual ao qual o pool de nós será adicionado.POOL_NAME: o nome do pool de nós a ser criado;NODE_ZONES: a lista separada por vírgulas de uma ou mais zonas em que o GKE cria o pool de nós.NUM_NODES: o número de nós no pool de nós. Esse valor precisa ser zero ou o produto do número de chips de TPU dividido por quatro. Isso acontece porque, nas frações da TPU de vários hosts, cada nó de fração da TPU tem quatro chips. Por exemplo, seTPU_TOPOLOGYfor4x8, haverá 32 chips, o que significa queNUM_NODESprecisa ser 8. Para saber mais sobre topologias de TPU, use a tabela em Escolher a versão de TPU.TPU_TOPOLOGY: indica a topologia física selecionada para a fração de TPU. O formato da topologia depende da versão da TPU usada. Para saber mais sobre topologias de TPU, use a tabela em Escolher uma topologia.
Também é possível usar as seguintes variáveis:
RESERVATION_NAME: se você usar uma reserva de TPU, forneça uma lista de rótulos de recursos de reserva a serem usados ao criar o pool de nós. Para saber como preencher oRESERVATION_LABEL_VALUESno camporeservation_affinity, consulte Provedor do Terraform.autoscaling: crie um pool de nós com o escalonamento automático ativado. Quando o GKE escalona um pool de nós de uma fração da TPU de vários hosts, ele escalona horizontalmente e de maneira atomizada esse pool de nós de zero até o tamanho máximo.MAX_NODES: o tamanho máximo do pool de nós. O valor precisa ser igual ao produto dos valores definidos emTPU_TOPOLOGY({A}x{B}x{C}) dividido pelo número de chips em cada VM. Por exemplo, seTPU_TOPOLOGYfor2x2x2, o produto será 8. Como cada VM emtpu7x-standard-4ttem quatro chips, o número de nós é dois.
spot: o pool de nós que vai usar VMs spot para os nós de fração de TPU. Não é possível mudar essa configuração depois que o pool de nós é criado. Para mais informações, consulte VMs spot.flex_start: o pool de nós que vai usar a opção de consumo flex-start. Essa configuração não pode ser definida comotruesespotestiver ativado.
Outras versões de TPU
É possível criar um pool de nós de fração da TPU de vários hosts nas versões v3, v4, v5p, v5e e Trillium (v6e) usando a Google Cloud CLI, o Terraform ou o console Google Cloud .
gcloud
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--node-locations=NODE_ZONES \
--machine-type=MACHINE_TYPE \
--tpu-topology=TPU_TOPOLOGY \
--reservation-affinity=none \
--enable-autoscaling \
--num-nodes=0 --min-nodes=0 --max-nodes=MAX_NODES \
--flex-start
Substitua:
NODE_POOL_NAME: o nome do novo pool de nós.CLUSTER_NAME: o nome do cluster.CONTROL_PLANE_LOCATION: o nome da zona com base na versão da TPU que você quer usar. Para identificar um local disponível, consulte Disponibilidade da TPU no GKE.NODE_ZONES: a lista separada por vírgulas de uma ou mais zonas em que o GKE cria o pool de nós.MACHINE_TYPE: o tipo de máquina a ser usado para nós. Para mais informações sobre os tipos de máquinas compatíveis com TPU, use a tabela em Escolher a versão da TPU.TPU_TOPOLOGY: a topologia da TPU. Por exemplo,2x2x2. Para conferir todas as topologias de TPU compatíveis, consulte a seção de topologia.MAX_NODES: o tamanho máximo do pool de nós. A flag--max-nodesserá obrigatória se--enable-autoscalingfor fornecido e precisar ser igual ao produto dos valores definidos emTPU_TOPOLOGY({A}x{B}x{C}) dividido pelo número de ícones para cada VM.Esse comando cria um pool de nós chamado NODE_POOL_NAME com o flex-start ativado.
Terraform
- Use a versão 4.84.0 ou mais recente do
provedor
google. Adicione o seguinte bloco à configuração do Terraform:
resource "google_container_node_pool" "NODE_POOL_RESOURCE_NAME" { provider = google project = PROJECT_ID cluster = CLUSTER_NAME name = POOL_NAME location = CLUSTER_LOCATION node_locations = [NODE_ZONES] initial_node_count = NUM_NODES autoscaling { max_node_count = MAX_NODES location_policy = "ANY" } node_config { machine_type = MACHINE_TYPE reservation_affinity { consume_reservation_type = "SPECIFIC_RESERVATION" key = "compute.googleapis.com/reservation-name" values = [RESERVATION_LABEL_VALUES] } flex_start = true } placement_policy { type = "COMPACT" tpu_topology = TPU_TOPOLOGY } }Substitua:
NODE_POOL_RESOURCE_NAME: o nome do recurso do pool de nós no modelo do Terraform.PROJECT_ID: o ID do projeto.CLUSTER_NAME: o nome do cluster atual ao qual o pool de nós será adicionado.POOL_NAME: o nome do pool de nós a ser criado;CLUSTER_LOCATION: local de computação do cluster. Recomendamos ter um cluster regional para aumentar a confiabilidade do plano de controle do Kubernetes. Também é possível usar um cluster zonal. Para saber mais, consulte Selecionar uma versão de TPU e topologia.NODE_ZONES: a lista separada por vírgulas de uma ou mais zonas em que o GKE cria o pool de nós.NUM_NODES: o número de nós no pool de nós. Esse valor precisa ser zero ou o produto do número de chips de TPU dividido por quatro. Isso acontece porque, nas frações da TPU de vários hosts, cada nó de TPU de fração tem quatro chips. Por exemplo, seTPU_TOPOLOGYfor4x8, haverá 32 chips, o que significa queNUM_NODESprecisa ser 8. Para saber mais sobre topologias de TPU, use a tabela em Escolher a versão de TPU.TPU_TOPOLOGY: indica a topologia física da fração de TPU. O formato da topologia depende da versão da TPU usada. Para saber mais sobre topologias de TPU, use a tabela em Escolher uma topologia.
Também é possível usar as seguintes variáveis:
RESERVATION_NAME: se você usar a reserva de TPU, esta será a lista de rótulos dos recursos de reserva a serem usados ao criar o pool de nós. Para saber como preencher oRESERVATION_LABEL_VALUESno camporeservation_affinity, consulte Provedor do Terraform.autoscaling: adicionar um pool de nós com escalonamento automático ativado. Quando o GKE escalona um pool de nós de uma fração da TPU de vários hosts, ele escalona horizontalmente e de maneira atomizada esse pool de nós de zero até o tamanho máximo.MAX_NODES: o tamanho máximo do pool de nós. Ele precisa ser igual ao produto dos valores definidos emTPU_TOPOLOGY({A}x{B}x{C}) dividido pelo número de chips em cada VM.
spot: permite que o pool de nós use VMs spot para os nós de fração de TPU. Isso não pode ser alterado após a criação do pool de nós. Para mais informações, consulte VMs spot.flex_start: define o pool de nós para usar a opção de consumo flex-start. Não pode ser definido comotruesespotestiver ativado.
Console
Para criar um pool de nós com TPUs:
Acesse a página do Google Kubernetes Engine no console do Google Cloud .
Na lista de clusters, clique no nome do cluster que você quer modificar.
Clique em add_box Adicionar pool de nós.
Na seção Detalhes do pool de nós, marque a caixa Especificar locais do nó.
Selecione o nome da zona com base na versão da TPU que você quer usar. Para identificar um local disponível, consulte Disponibilidade da TPU no GKE.
No painel de navegação, clique em Nós.
Na seção Configuração da máquina, selecione TPUs.
No menu suspenso Série, selecione uma das seguintes opções:
- CT3: TPU v3, dispositivo de host único
- CT3P: TPU v3, fração de pod de vários hosts
- CT4P: TPU v4.
- CT5LP: TPU v5e
- CT5P: TPU v5p
- CT6E: TPU Trillium (v6e)
No menu suspenso Tipo de máquina, selecione o nome da máquina que será usada para os nós. Use a tabela Escolher a versão da TPU para saber como definir o tipo de máquina e a topologia de TPU que criam um pool de nós de fração de TPU de vários hosts.
No menu suspenso Topologia da TPU, selecione a topologia física para a fatia da TPU.
Na caixa de diálogo Alterações necessárias, clique em Fazer alterações.
Certifique-se de que o Tipo de disco de inicialização seja Disco permanente padrão ou Disco permanente SSD.
Como opção, marque a caixa de seleção Ativar nós em VMs do Spot para usar VMs do Spot nos nós do pool de nós.
Clique em Criar.
Verificar o status do flex-start no pool de nós
Execute este comando:
gcloud container node-pools describe NODE_POOL_NAME \
--cluster CLUSTER_NAME \
--location CONTROL_PLANE_LOCATION \
--format="get(config.flexStart)"
Se o início flexível estiver ativado no pool de nós, o campo flexStart será definido como True.
Executar uma carga de trabalho em lote
Nesta seção, você vai criar um job que programa um nó de TPU com VMs de início flexível. 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:Host único
Use o seguinte manifesto para o arquivo
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-tpu-accelerator: ACCELERATOR_TYPE cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY containers: - name: container-1 image: gcr.io/k8s-staging-perf-tests/sleep:latest args: ["3600s"] # Sleep for 1 hour resources: requests: google.com/tpu: NUM_CHIPS limits: google.com/tpu: NUM_CHIPS restartPolicy: OnFailureVários hosts
Use o seguinte manifesto para o arquivo
dws-flex-start.yaml:apiVersion: v1 kind: Service metadata: name: headless-svc spec: clusterIP: None selector: job-name: job-1 --- apiVersion: batch/v1 kind: Job metadata: name: job-1 spec: backoffLimit: 0 completions: 2 parallelism: 2 completionMode: Indexed template: spec: subdomain: headless-svc restartPolicy: Never nodeSelector: cloud.google.com/gke-flex-start: "true" cloud.google.com/gke-tpu-accelerator: ACCELERATOR_TYPE cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY containers: - name: tpu-job image: us-docker.pkg.dev/cloud-tpu-images/jax-ai-image/tpu:latest ports: - containerPort: 8471 # Default port using which TPU VMs communicate - containerPort: 8431 # Port to export TPU runtime metrics, if supported. securityContext: privileged: true command: - bash - -c - | python -c 'import jax; print("TPU cores:", jax.device_count())' resources: requests: google.com/tpu: NUM_CHIPS limits: google.com/tpu: NUM_CHIPSSubstitua:
ACCELERATOR_TYPE: o tipo de acelerador de TPU que você usou ao criar os pools de nós. Por exemplo,tpu-v4-podsliceoutpu-v5-lite-podslice.TPU_TOPOLOGY: a topologia física da fração de TPU. Por exemplo, o valor pode ser4x4x4ou2x2, dependendo da versão da TPU.NUM_CHIPS: o número de chips de TPU em cada VM é um, quatro ou oito. Para saber mais, consulte Versões de TPU.
Aplique o manifesto
dws-flex-start.yaml:kubectl apply -f dws-flex-start.yamlVerifique se os jobs estão sendo executados no mesmo nó:
kubectl get podsO resultado será o seguinte:
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>
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 CONTROL_PLANE_LOCATIONExclua o cluster:
gcloud container clusters delete CLUSTER_NAME
A seguir
- Saiba mais sobre TPUs 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.