Como usar TPUs preemptivas

Um nó da TPU preemptiva é um nó da Cloud TPU que é executado a um preço muito mais baixo que os nós comuns. No entanto, o Cloud TPU poderá finalizar (forçar a interrupção) esses nós a qualquer momento se precisar de acesso aos recursos para outra finalidade.

Como criar uma TPU preemptiva

Para criar um nó de TPU preemptiva, basta usar o Console do GCP, a ferramenta de linha de comando da gcloud ou o utilitário ctpu.

Console

  1. Acesse a página "TPUs" na página principal do Compute Engine.
  2. Clique em CRIAR NÓ DE TPU para abrir a página de criação de nó da TPU.
  3. Na parte inferior da página "Criar uma Cloud TPU", clique em Rótulos e descrição para mostrar a opção de preempção.
  4. Clique na opção de preempção para tornar este novo nó da TPU preemptivo.
  5. Especifique os atributos restantes para esse nó da TPU.
  6. Na parte inferior da página, clique em Criar para gerar o nó da TPU.

gcloud

Caso precise de uma configuração personalizada, use o comando gcloud em vez do ctpu para criar e gerenciar os recursos da TPU. Para saber mais sobre configurações personalizadas, consulte a página Como criar e excluir TPUs. Para criar uma TPU preemptiva, use o mesmo comando gcloud compute tpus create usado ao criar a TPU normal, mas adicione a sinalização --preemptible:

$ gcloud compute tpus create demo-tpu \
  --range=10.240.1.0 \
  --version=1.14 \
  --preemptible
  

em que:

  • demo-tpu é o nome de identificação da TPU que está sendo criada;
  • --range especifica o endereço do recurso da Cloud TPU criado, podendo ser qualquer valor em 10.240.*.*. Neste exemplo, use 10.240.1.0;
  • --version especifica a versão do TensorFlow a ser usada com a TPU;
  • --preemptible permite que a Cloud TPU force a interrupção da TPU.

ctpu

Para criar uma TPU preemptiva, use o mesmo comando ctpu up usado ao criar a TPU normal, mas adicione a sinalização --preemptible:

$ ctpu up --preemptible

É preciso especificar a sinalização --preemptible cada vez que você executar ctpu up para a TPU preemptiva. As sinalizações de linha de comando e os respectivos valores padrão se aplicam a cada invocação de comando individualmente.

O status preemptivo da TPU independe do status preemptivo da instância de VM. Veja abaixo mais detalhes sobre VMs e TPUs preemptivas.

Preços e cotas para TPUs preemptivas

O preço das TPUs preemptivas é significativamente menor do que o das TPUs normais. Para detalhes, consulte a página de preços. Não haverá cobranças pelas TPUs caso elas sejam interrompidas no primeiro minuto após a criação.

Geralmente, a cota para TPUs preemptivas é maior e contabilizada separadamente da cota para TPUs normais. Consulte a página de cotas.

VMs e TPUs preemptivas

Conforme descrito no guia de início rápido, é necessário uma máquina virtual (VM, na sigla em inglês) do Compute Engine para se conectar a uma TPU. Observe que o status preemptivo da TPU é independente do status preemptivo da VM. É possível definir a TPU como preemptiva e a VM como não preemptiva ou vice-versa. Outra opção é definir ambas como preemptivas.

A combinação mais provável é uma TPU preemptiva e uma VM não preemptiva. Observe os seguintes detalhes:

  • As cobranças pela VM provavelmente serão baixas em comparação às cobranças pela TPU. As cobranças pela VM dependem do tipo de máquina usado. Consulte a página de preços para ver um exemplo simples dos custos relativos.
  • O Cloud TPU não coordena a preempção da VM com a da TPU. Se você definir ambas como preemptivas, elas poderão ser interrompidas em momentos diferentes.
  • Se o Compute Engine forçar a interrupção da VM, você ainda será cobrado pela TPU, a menos que ela também seja interrompida. Observe que a TPU permanece inativa enquanto a VM é interrompida.

É possível usar o comando ctpu ou gcloud para definir uma VM preemptiva:

ctpu

Para criar uma VM preemptiva, use o mesmo comando ctpu up usado na criação de uma TPU com uma VM normal, mas adicione a sinalização --preemptible-vm:

$ ctpu up --preemptible-vm

É preciso especificar a sinalização --preemptible-vm cada vez que você executar ctpu up para a TPU preemptiva. As sinalizações de linha de comando e os respectivos valores padrão se aplicam a cada invocação de comando individualmente.

gcloud

Caso precise de uma configuração personalizada, use o comando gcloud em vez do ctpu para criar e gerenciar os recursos da TPU. Para saber mais sobre configurações personalizadas, consulte a página Como criar e excluir TPUs. Para criar uma VM preemptiva, use o mesmo comando gcloud compute instances create usado na criação de uma VM normal, mas adicione a sinalização --preemptible:

$ gcloud compute instances create tpu-demo-vm \
  --machine-type=n1-standard-2 \
  --image-project=ml-images \
  --image-family=tf-1-14 \
  --scopes=cloud-platform \
  --preemptible

em que:

  • tpu-demo-vm é o nome de identificação da instância de VM que está sendo criada;
  • --machine-type=n1-standard-2 é um tipo de máquina padrão com 4 CPUs virtuais e 15 GB de memória. Consulte os tipos de máquina disponíveis;
  • --image-project=ml-images é uma coleção compartilhada de imagens que disponibiliza a imagem tf-1-14para uso;
  • --image-family=tf-1-14 é uma imagem com o pacote pip exigido para o TensorFlow;
  • --scopes=cloud-platform permite que a VM acesse as APIs do GCP;
  • --preemptible permite que o Compute Engine force a interrupção da instância da VM.

Consulte a documentação do Compute Engine sobre criação de instâncias de VM preemptivas.

Como descobrir se uma TPU foi interrompida

É possível usar o comando ctpu ou gcloud para verificar se o serviço da Cloud TPU substituiu sua TPU:

ctpu

Verifique o status das TPUs:

$ ctpu status

O comando acima imprime os detalhes das TPUs criadas. O valor impresso de TPU preemptiva indica se a TPU é preemptiva ou não. Se o Estado da TPU impresso for READY, a TPU não terá sido interrompida. Se ela tiver sido interrompida, o estado mudará de READY para outro.

gcloud

Liste as TPUs disponíveis:

(vm)$ gcloud compute tpus list

O comando acima imprime os detalhes das TPUs criadas. Se o STATUS impresso for READY, a TPU não será interrompida. Se ela tiver sido interrompido, o status mudará de READY para outro. Por exemplo:

NAME       ZONE           ACCELERATOR_TYPE  NETWORK_ENDPOINT   NETWORK  RANGE          STATUS
demo-tpu   us-central1-b  v2-8              10.240.1.2:8470    default  10.240.1.0/29  STOPPING

Se a TPU tiver sido interrompida, use o seguinte comando para reiniciá-la:

(vm)$ gcloud compute tpus start YOUR-TPU-NAME --zone=YOUR-ZONE

Como descobrir se uma instância de VM foi interrompida

Para verificar se a instância da VM foi interrompida, use o comando gcloud compute operations list para conseguir uma lista de operações recentes do sistema:

$ gcloud compute operations list

Um tipo de operação compute.instances.preempted indica que a instância da VM foi interrompida. Para saber mais, consulte o guia do Compute Engine.

Como projetar um aplicativo de aprendizado de máquina executável em TPUs preemptivas

Seu aplicativo precisa ser resiliente a reinicializações da VM e da TPU. Para isso, salve regularmente os checkpoints do modelo e configure o aplicativo para restaurar o checkpoint mais recente ao reiniciar.

A API TPUEstimator do TensorFlow (em inglês) salva e restaura os checkpoints do modelo para você. Se você usa o TPUEstimator, não precisa se preocupar em salvar ou restaurar os checkpoints das TPUs ou VMs. Leia mais sobre Como usar a TPUEstimator com a Cloud TPU.

A prática recomendada é usá-la com a Cloud TPU, conforme descrito acima. No entanto, se você quiser investigar como gravar a função de salvamento e restauração de checkpoints no seu próprio modelo, consulte os seguintes recursos no módulo tf.train do TensorFlow:

A seguir