Executar aplicativos do Cloud TPU no GKE
Neste guia, descrevemos como:
- Definir uma configuração do Cloud TPU como preparação para executá-la no Google Kubernetes Engine
- Crie um cluster do GKE com suporte à Cloud TPU
- Usar o TensorBoard para visualizar as métricas do Cloud TPU e analisar o desempenho
- Criar e conteinerizar o modelo no Docker
Para mais informações sobre arquiteturas de VM de TPU, consulte Arquitetura do sistema. Este guia só pode ser usado com a arquitetura de nós de TPU.
Benefícios da execução de aplicativos do Cloud TPU no GKE
É possível configurar os aplicativos de treinamento do Cloud TPU para serem executados em contêineres do GKE dentro dos pods do GKE. Quando são eles, você tem os seguintes benefícios:
Configuração e gerenciamento de fluxos de trabalho aprimorados:o GKE gerencia o ciclo de vida da TPU. Depois que a inicialização e o treinamento do Cloud TPU forem configurados com o GKE, as cargas de trabalho poderão ser repetidas e gerenciadas pelo GKE, incluindo a recuperação de falhas de jobs.
Custo otimizado: você só paga pela TPU enquanto o job estiver ativo. O GKE cria e exclui automaticamente TPUs de acordo com os requisitos de recursos de um pod.
Uso flexível: basta uma pequena alteração na especificação do pod para solicitar um acelerador de hardware diferente (CPU, GPU ou TPU):
kind: Pod metadata: name: example-tpu annotations: # The Cloud TPUs that will be created for this Job will support # TensorFlow 2.12.1. This version MUST match the # TensorFlow version that your model is built on. tf-version.cloud-tpus.google.com: "2.12.1" spec: containers: - name: example-container resources: limits: cloud-tpus.google.com/v2: 8 # See the line above for TPU, or below for CPU / GPU. # cpu: 2 # nvidia.com/gpu: 1
Escalonabilidade:o GKE oferece APIs (Job e Deployment) que podem ser escalonadas para centenas de pods do GKE e nós de TPU.
Tolerância a falhas:a API Job do GKE e o mecanismo de checkpoint do TensorFlow fornecem a semântica da execução à conclusão. Seus jobs de treinamento são automaticamente executados de novo com o estado mais recente lido no checkpoint se ocorrerem falhas nas instâncias de VM ou nos nós da Cloud TPU.
Requisitos e limitações de configuração da Cloud TPU e do GKE
Ao definir sua configuração do GKE, observe o seguinte:
- O Cloud TPU não é compatível com pools de nós do Windows Server.
- É preciso criar o cluster do GKE e os pools de nós em uma zona em que a Cloud TPU esteja disponível. Também é possível criar os buckets do Cloud Storage para manter seus dados e modelos de treinamento na mesma região que o cluster do GKE. Consulte o documento tipos e zonas para conferir uma lista das zonas disponíveis.
- É necessário usar endereços IP compatíveis com RFC 1918 para seus clusters do GKE. Para mais informações, consulte Redes do GKE.
- Cada contêiner pode solicitar, no máximo, um Cloud TPU. No entanto, é permitido que vários contêineres em um pod solicitem um.
Antes de começar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Ative as seguintes APIs no console do Google Cloud:
Ao usar o Cloud TPU com o GKE, são utilizados componentes faturáveis do Google Cloud Platform no projeto. Para fazer uma estimativa de custos, verifique os preços da Cloud TPU e os preços do GKE. Siga as instruções para limpar os recursos quando não forem mais necessários.
Como criar um cluster compatível com o Cloud TPU
Use as instruções abaixo para configurar o ambiente e criar um cluster do GKE compatível com o Cloud TPU usando a CLI gcloud:
Instale os componentes
gcloud
, necessários para executar o GKE com o Cloud TPU:$ gcloud components install kubectl
Configure
gcloud
om o ID do projeto do Google Cloud:$ gcloud config set project project-name
Substitua
project-name
pelo nome do projeto do Google Cloud.Na primeira vez que você executar esse comando em uma nova VM do Cloud Shell, será exibida uma página
Authorize Cloud Shell
. Clique emAuthorize
na parte de baixo da página para permitir quegcloud
faça chamadas de API do Google Cloud com suas credenciais.Configure
gcloud
com a zona em que você planeja usar um recurso do Cloud TPU. Este exemplo usaus-central1-b
, mas é possível usar uma TPU em qualquer zona com suporte.$ gcloud config set compute/zone us-central1-b
Use o comando
gcloud container clusters create
para criar um cluster no GKE com suporte para o Cloud TPU.$ gcloud container clusters create cluster-name \ --release-channel=stable \ --scopes=cloud-platform \ --enable-ip-alias \ --enable-tpu
Descrições de sinalizações de comando
- release-channel Os
- canais de lançamento oferecem uma maneira de gerenciar upgrades automáticos de clusters. Ao criar um cluster, você pode escolher o canal de lançamento dele. O upgrade do cluster só será feito para as versões oferecidas nesse canal.
- escopos
- Garante que todos os nós no cluster tenham acesso ao bucket do Cloud Storage. O cluster e o bucket de armazenamento precisam estar no mesmo projeto para isso funcionar. Por padrão, os pods do Kubernetes
herdam os escopos dos nós em que são implantados.
Portanto,
scopes=cloud-platform
fornece o escopocloud-platform
a todos os pods do Kubernetes em execução no cluster. Se você quiser limitar o acesso por pod, consulte o guia do GKE sobre como autenticar com contas de serviço. - enable-ip-alias
- Indica que o cluster usa intervalos de IP do alias. Isso é necessário para usar o Cloud TPU no GKE.
- enable-tpu
- Indica que o cluster precisa ser compatível com a Cloud TPU.
- tpu-ipv4-cidr (opcional, não especificado acima)
- Indica o intervalo CIDR a ser usado para o Cloud TPU. Especifique
IP_RANGE
na forma deIP/20
, como10.100.0.0/20
. Se essa flag não for especificada, um intervalo de CIDR de tamanho/20
será alocado e atribuído automaticamente.
Quando o cluster for criado, você verá uma mensagem semelhante a esta:
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS cluster-name us-central1-b 1.16.15-gke.4901 34.71.245.25 n1-standard-1 1.16.15-gke.4901 3 RUNNING
Solicite uma Cloud TPU na especificação do pod do Kubernetes
Na especificação de pod do Kubernetes:
É necessário criar os modelos nos contêineres usando a mesma versão do TensorFlow. Veja as versões compatíveis.
Especifique o recurso do Cloud TPU na seção
limits
, no camporesource
, na especificação do contêiner.Observe que a unidade do recurso da Cloud TPU corresponde ao número de núcleos da Cloud TPU. A tabela a seguir lista exemplos de solicitações de recursos válidas. Consulte Tipos e zonas de TPU para uma lista completa de recursos válidos de TPU.
Se o recurso destinado ao uso for um pod do Cloud TPU, solicite uma cota, porque a cota padrão do pod do Cloud TPU é zero.
Solicitação de recurso Tipo de Cloud TPU cloud-tpus.google.com/v2: 8 Um dispositivo Cloud TPU v2 (8 núcleos) cloud-tpus.google.com/preemptible-v2: 8 Um dispositivo preemptivo da Cloud TPU v2 (8 núcleos) cloud-tpus.google.com/v3: 8 Um dispositivo da Cloud TPU v3 (8 núcleos) cloud-tpus.google.com/preemptible-v3: 8 Um dispositivo preemptivo da Cloud TPU v3 (8 núcleos) cloud-tpus.google.com/v2: 32 Um pod do Cloud TPU v2-32 (32 núcleos) cloud-tpus.google.com/v3: 32 Um pod do Cloud TPU v3-32 (32 núcleos) Para saber mais sobre como especificar recursos e limites na especificação de Pods, consulte a documentação do Kubernetes.
O exemplo de especificação de pod abaixo solicita uma TPU preemptiva do Cloud TPU v2-8 com o TensorFlow 2.12.1.
A vida útil dos nós da Cloud TPU é vinculada aos pods do Kubernetes que os solicitam. A Cloud TPU é criada sob demanda quando o pod do Kubernetes é programado e reciclada quando o pod é excluído.
apiVersion: v1
kind: Pod
metadata:
name: gke-tpu-pod
annotations:
# The Cloud TPUs that will be created for this Job will support
# TensorFlow 2.12.1. This version MUST match the
# TensorFlow version that your model is built on.
tf-version.cloud-tpus.google.com: "2.12.1"
spec:
restartPolicy: Never
containers:
- name: gke-tpu-container
# The official TensorFlow 2.12.1 image.
# https://hub.docker.com/r/tensorflow/tensorflow
image: tensorflow/tensorflow:2.12.1
command:
- python
- -c
- |
import tensorflow as tf
print("Tensorflow version " + tf.__version__)
tpu = tf.distribute.cluster_resolver.TPUClusterResolver('$(KUBE_GOOGLE_CLOUD_TPU_ENDPOINTS)')
print('Running on TPU ', tpu.cluster_spec().as_dict()['worker'])
tf.config.experimental_connect_to_cluster(tpu)
tf.tpu.experimental.initialize_tpu_system(tpu)
strategy = tf.distribute.TPUStrategy(tpu)
@tf.function
def add_fn(x,y):
z = x + y
return z
x = tf.constant(1.)
y = tf.constant(1.)
z = strategy.run(add_fn, args=(x,y))
print(z)
resources:
limits:
# Request a single Preemptible v2-8 Cloud TPU device to train the model.
cloud-tpus.google.com/preemptible-v2: 8
Como criar o job
Siga estas etapas para criar o job no cluster do GKE e instalar o kubectl.
Usando um editor de texto, crie uma especificação de pod,
example-job.yaml
, e copie e cole na especificação de pod mostrada anteriormente.Execute o job:
$ kubectl create -f example-job.yaml
pod "gke-tpu-pod" created
Esse comando cria o job que programa o pod automaticamente.
Verifique se o pod do GKE foi programado e se os nós do Cloud TPU foram provisionados. Um pod do GKE que solicita nós do Cloud TPU pode permanecer pendente por até cinco minutos antes de ser executado. Você vai receber uma saída semelhante à mostrada a seguir até que o pod do GKE seja programado.
$ kubectl get pods -w NAME READY STATUS RESTARTS AGE gke-tpu-pod 0/1 Pending 0 1m
Depois de cerca de cinco minutos, você verá algo semelhante a isto:
NAME READY STATUS RESTARTS AGE gke-tpu-pod 0/1 Pending 0 21s gke-tpu-pod 0/1 Pending 0 2m18s gke-tpu-pod 0/1 Pending 0 2m18s gke-tpu-pod 0/1 ContainerCreating 0 2m18s gke-tpu-pod 1/1 Running 0 2m48s gke-tpu-pod 0/1 Completed 0 3m8s
Você precisa usar Ctrl-C para sair do comando "kubectl get".
É possível imprimir informações de registro e recuperar informações mais detalhadas sobre cada pod do GKE usando os comandos
kubectl
a seguir. Por exemplo, para ver a saída do registro do pod do GKE, use:$ kubectl logs gke-tpu-pod
A resposta será semelhante a esta:
2021-09-24 18:55:25.400699: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags. 2021-09-24 18:55:25.405947: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272] Initialize GrpcChannelCache for job worker -> {0 -> 10.0.16.2:8470} 2021-09-24 18:55:25.406058: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272] Initialize GrpcChannelCache for job localhost -> {0 -> localhost:32769} 2021-09-24 18:55:28.091729: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272] Initialize GrpcChannelCache for job worker -> {0 -> 10.0.16.2:8470} 2021-09-24 18:55:28.091896: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272] Initialize GrpcChannelCache for job localhost -> {0 -> localhost:32769} 2021-09-24 18:55:28.092579: I tensorflow/core/distributed_runtime/rpc/grpc_server_lib.cc:427] Started server with target: grpc://localhost:32769 Tensorflow version 2.12.1 Running on TPU ['10.0.16.2:8470'] PerReplica:{ 0: tf.Tensor(2.0, shape=(), dtype=float32), 1: tf.Tensor(2.0, shape=(), dtype=float32), 2: tf.Tensor(2.0, shape=(), dtype=float32), 3: tf.Tensor(2.0, shape=(), dtype=float32), 4: tf.Tensor(2.0, shape=(), dtype=float32), 5: tf.Tensor(2.0, shape=(), dtype=float32), 6: tf.Tensor(2.0, shape=(), dtype=float32), 7: tf.Tensor(2.0, shape=(), dtype=float32) }
Para ver uma descrição completa do pod do GKE, use:
$ kubectl describe pod gke-tpu-pod
Consulte Introspecção e depuração de aplicativos para mais detalhes.
Crie e coloque o modelo em um contêiner na imagem do Docker
Para detalhes sobre esse processo, consulte compilar e conteinerizar seu próprio modelo.
Ativar o suporte do Cloud TPU em um cluster atual
Para ativar o suporte do Cloud TPU em um cluster atual do GKE, siga estas etapas na Google Cloud CLI:
Ative o suporte do Cloud TPU:
gcloud beta container clusters update cluster-name --enable-tpu
Substitua cluster-name pelo nome do cluster.
Atualize a entrada kubeconfig:
gcloud container clusters get-credentials cluster-name
Como definir um intervalo CIDR personalizado
Por padrão, o GKE aloca um bloco CIDR com o tamanho de /20
para as TPUs provisionadas pelo cluster. Especifique um intervalo CIDR personalizado para
o Cloud TPU executando o seguinte comando:
gcloud beta container clusters update cluster-name \ --enable-tpu \ --tpu-ipv4-cidr 10.100.0.0/20
Substitua:
- cluster-name: o nome do cluster atual.
- 10.100.0.0/20: o intervalo CIDR personalizado.
Como usar intervalos CIDR com a VPC compartilhada
Siga o guia sobre TPU em clusters do GKE usando uma VPC compartilhada para verificar a configuração correta da VPC compartilhada.
Como desativar o Cloud TPU em um cluster
Para desativar o suporte do Cloud TPU em um cluster atual do GKE, siga estas etapas na Google Cloud CLI:
Verifique se nenhuma de suas cargas de trabalho está usando o Cloud TPU:
$ kubectl get tpu
Desative o suporte do Cloud TPU no cluster:
$ gcloud beta container clusters update cluster-name --no-enable-tpu
Substitua cluster-name pelo nome do cluster.
Para clusters zonais, essa operação leva cerca de 5 minutos e, para clusters regionais, ela leva cerca de 15 minutos, dependendo da região do cluster.
Depois que as operações forem concluídas sem erros, será possível verificar se as TPUs provisionadas pelo cluster foram removidas:
$ gcloud compute tpus list
Os nomes das TPUs criadas pelo Cloud TPU têm o seguinte formato:
$ gke-cluster-name-cluster-id-tpu-tpu-id
Substitua:
- cluster-name: o nome do cluster atual.
- cluster-id: o ID do cluster atual.
- tpu-id: ID do Cloud TPU.
Se alguma TPU aparecer, será possível excluí-las manualmente executando:
$ gcloud compute tpus delete gke-cluster-name-cluster-id-tpu-tpu-id
Limpeza
Quando terminar de usar o Cloud TPU no GKE, limpe os recursos para evitar cobranças extras na conta do Cloud Billing.
Execute o seguinte comando para excluir o cluster do GKE, substituindo
cluster-name
pelo nome do cluster eproject-name
pelo nome do projeto do Google Cloud:$ gcloud container clusters delete cluster-name \ --project=project-name --zone=us-central1-b
Ao terminar de examinar os dados, use o comando da CLI gcloud para excluir o bucket do Cloud Storage criado. Substitua
bucket-name
pelo nome do seu intervalo do Cloud Storage:$ gcloud storage rm gs://bucket-name --recursive