Neste tutorial, mostramos como treinar o modelo Mask RCNN no Cloud TPU e no GKE.
Objetivos
- Criar um bucket do Cloud Storage para armazenar o conjunto de dados e a saída do modelo.
- Criar um cluster do GKE para gerenciar os recursos do Cloud TPU.
- Fazer o download de uma especificação de job do Kubernetes que descreva os recursos necessários para treinar o modelo Mask RCNN com o TensorFlow em um Cloud TPU.
- Executar o job no cluster do GKE para começar a treinar o modelo.
- Verificar os registros e a saída do modelo.
Custos
Neste tutorial, há componentes faturáveis do Google Cloud, entre eles:- Compute Engine
- Cloud TPU
- Cloud Storage
Use a calculadora de preços para gerar uma estimativa de custos baseada na projeção de uso. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.
Antes de começar
- Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
-
No Console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.
-
Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como confirmar se o faturamento está ativado para o projeto.
-
Ative as APIs necessárias para este tutorial abrindo os seguintes links no Console do 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.
Criar um bucket do Cloud Storage
É preciso um bucket do Cloud Storage para armazenar os dados usados para treinar o modelo e os resultados do treinamento. A ferramenta ctpu up
usada neste tutorial
configura permissões padrão para a conta de serviço da Cloud TPU. Caso queira permissões mais específicas, consulte as permissões de nível de acesso.
Acesse a página do Cloud Storage no Console do Cloud.
Crie um novo bucket especificando as opções a seguir:
- Um nome exclusivo à sua escolha
- Classe de armazenamento padrão:
Regional
- Escolha onde armazenar seus dados:
region
Local:us-central1
- Escolha uma classe de armazenamento padrão para seus dados: Padrão
- Escolha como controlar o acesso a objetos: defina permissões no nível do objeto e do bucket
Crie um cluster no GKE
Siga as instruções abaixo para configurar o ambiente e criar um cluster do GKE compatível com o Cloud TPU usando a ferramenta de linha de comando gcloud
.
Abra uma janela do Cloud Shell.
Configure a ferramenta de linha de comando
gcloud
para usar o projeto em que a Cloud TPU será criada.gcloud config set project ${PROJECT_ID}
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 inferior da página para permitir quegcloud
faça chamadas de API do GCP com suas credenciais.Crie uma conta de serviço para o projeto da Cloud TPU.
gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
O comando retorna uma conta de serviço do Cloud TPU com o formato a seguir:
service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
Autorize o acesso da Cloud TPU ao bucket do Cloud Storage
É necessário conceder à Cloud TPU acesso de leitura/gravação aos objetos do Cloud Storage. Para isso, conceda o acesso necessário à conta de serviço usada pela Cloud TPU. Siga as instruções do guia conceder acesso ao bucket de armazenamento.
Especifique a zona em que você planeja usar um recurso da Cloud TPU. Para este exemplo, use a zona
us-central1-b
:$ gcloud config set compute/zone us-central1-b
Use o comando
gcloud container clusters
para criar um cluster no GKE com suporte para o Cloud TPU. Observe que o cluster do GKE e os pools de nós precisam ser criados em uma zona em que o Cloud TPU esteja disponível, conforme descrito na seção sobre variáveis de ambiente acima. O comando a seguir cria um cluster chamadotpu-models-cluster
:$ gcloud container clusters create tpu-models-cluster \ --cluster-version=1.13 \ --scopes=cloud-platform \ --enable-ip-alias \ --enable-tpu \ --machine-type=n1-standard-4
No comando acima:
--cluster-version=1.13
indica que o cluster usará a versão mais recente do Kubernetes 1.16. Use a versão1.13.4-gke.5
ou posterior.--scopes=cloud-platform
garante que todos os nós no cluster tenham acesso ao bucket do Cloud Storage no Google Cloud definido como project-name acima. O cluster e o bucket de armazenamento precisam estar no mesmo projeto. Por padrão, os pods herdam os escopos dos nós em que são implantados. Essa sinalização fornece a todos os pods em execução no cluster o escopocloud-platform
. Para limitar o acesso por pod, veja como autenticar com contas de serviço no guia do GKE.--enable-ip-alias
indica que o cluster usa intervalos de IP do alias. Isso é necessário para usar a Cloud TPU no GKE.--enable-tpu
indica que o cluster precisa ser compatível com o Cloud TPU.machine-type=n1-standard-4
é necessário para executar este job.
Quando o comando terminar a execução, será exibida uma mensagem de confirmação semelhante a esta:
kubeconfig entry generated for tpu-models-cluster. NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS tpu-models-cluster us-central1-b 1.13.6-gke.5 35.232.204.86 n1-standard-4 1.13.6-gke.5 3 RUNNING
Processar os dados de treinamento
A próxima tarefa é criar um job. No Google Kubernetes Engine, um job é um objeto controlador que representa uma tarefa finita. O primeiro job que você precisa criar faz os downloads e processa o conjunto de dados COCO usado para treinar o modelo Mask RCNN.
No ambiente shell, crie um arquivo chamado
download_and_preprocess_coco_k8s.yaml
, conforme mostrado abaixo. Como alternativa, é possível fazer o download desse arquivo do GitHub.Localize a variável de ambiente denominada
DATA_BUCKET
. Atualize ovalue
dessa variável para o caminho onde você quer armazenar o conjunto de dados COCO no bucket do Cloud Storage. Por exemplo: "gs://my-maskrcnn-bucket/coco/"Execute o seguinte comando para criar o job no cluster:
kubectl create -f download_and_preprocess_coco_k8s.yaml
Pode levar alguns minutos para os jobs serem iniciados. Visualize o status dos jobs em execução no cluster usando o seguinte comando:
kubectl get pods -w
Esse comando retorna informações sobre todos os jobs em execução no cluster. Exemplo:
NAME READY STATUS RESTARTS AGE download-and-preprocess-coco-xmx9s 0/1 Pending 0 10s
A sinalização -w
-instrui o comando a observar quaisquer alterações no status de um pod.
Depois de alguns minutos, o status do job será atualizado para Running
.
Se você encontrar problemas com o job, exclua-o e tente novamente. Para fazer isso, execute o comando kubectl delete -f download_and_preprocess_coco_k8s.yaml
antes de executar kubectl create
novamente.
Quando o download e o pré-processamento forem concluídos, você poderá executar o modelo.
Executar o modelo Mask RCNN
Agora está tudo pronto para você executar o modelo Mask RCNN usando o Cloud TPU e o GKE.
No ambiente shell, crie um arquivo chamado
mask_rcnn_k8s.yaml
, conforme mostrado abaixo. Como alternativa, é possível fazer o download desse arquivo do GitHub.Localize a variável de ambiente denominada
DATA_BUCKET
. Atualize ovalue
desta variável para o caminho do arquivoDATA_BUCKET
especificado no scriptdownload_and_preprocess_coco_k8s.yaml
.Localize a variável de ambiente denominada
MODEL_BUCKET
. Atualizevalue
esta variável no caminho para o bucket do Cloud Storage. É nesse local que o script salva a saída de treinamento. Se oMODEL_BUCKET
especificado não existir, ele será criado quando você executar o job.Execute o seguinte comando para criar o job no cluster:
kubectl create -f mask_rcnn_k8s.yaml
Ao executar esse comando, a seguinte mensagem de confirmação é exibida:
job "mask-rcnn-gke-tpu" created
Conforme mencionado na seção Processar os dados de treinamento, pode levar alguns minutos para um job ser iniciado. Visualize o status dos jobs em execução no cluster usando o seguinte comando:
kubectl get pods -w
Visualizar o status do treinamento
É possível acompanhar o status do treinamento usando o utilitário de linha de comando kubectl
.
Execute o seguinte comando para ver o status do job:
kubectl get pods
Durante o processo de treinamento, o status do pod precisa ser
RUNNING
.Para mais informações sobre o processo de treinamento, execute o seguinte comando:
$ kubectl logs job name
Em que
job name
é o nome completo do job. Por exemplo,mask-rcnn-gke-tpu-abcd
.Também é possível verificar a saída no painel de cargas de trabalho do GKE no Console do Cloud.
Observe que leva algum tempo para que a primeira entrada apareça nos registros. Você verá algo como isto:
I0622 18:14:31.617954 140178400511808 tf_logging.py:116] Calling model_fn. I0622 18:14:40.449557 140178400511808 tf_logging.py:116] Create CheckpointSaverHook. I0622 18:14:40.697138 140178400511808 tf_logging.py:116] Done calling model_fn. I0622 18:14:44.004508 140178400511808 tf_logging.py:116] TPU job name worker I0622 18:14:45.254548 140178400511808 tf_logging.py:116] Graph was finalized. I0622 18:14:48.346483 140178400511808 tf_logging.py:116] Running local_init_op. I0622 18:14:48.506665 140178400511808 tf_logging.py:116] Done running local_init_op. I0622 18:14:49.135080 140178400511808 tf_logging.py:116] Init TPU system I0622 18:15:00.188153 140178400511808 tf_logging.py:116] Start infeed thread controller I0622 18:15:00.188635 140177578452736 tf_logging.py:116] Starting infeed thread controller. I0622 18:15:00.188838 140178400511808 tf_logging.py:116] Start outfeed thread controller I0622 18:15:00.189151 140177570060032 tf_logging.py:116] Starting outfeed thread controller. I0622 18:15:07.316534 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed. I0622 18:15:07.316904 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed. I0622 18:16:13.881397 140178400511808 tf_logging.py:116] Saving checkpoints for 100 into gs://<bucket-name>/mask_rcnn/model.ckpt. I0622 18:16:21.147114 140178400511808 tf_logging.py:116] loss = 1.589756, step = 0 I0622 18:16:21.148168 140178400511808 tf_logging.py:116] loss = 1.589756, step = 0 I0622 18:16:21.150870 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed. I0622 18:16:21.151168 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed. I0622 18:17:00.739207 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed. I0622 18:17:00.739809 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed. I0622 18:17:36.598773 140178400511808 tf_logging.py:116] global_step/sec: 2.65061 I0622 18:17:37.040504 140178400511808 tf_logging.py:116] examples/sec: 2698.56 I0622 18:17:37.041333 140178400511808 tf_logging.py:116] loss = 2.63023, step = 200 (75.893 sec)
Visualize o modelo treinado em
gs://<bucket-name>/mask-rcnn/model.ckpt
.gsutil ls -r gs://bucket-name/mask-rcnn/model.ckpt
Limpeza
Quando terminar de usar o Cloud TPU no GKE, limpe os recursos para evitar cobranças extras na conta do Cloud Billing.
Caso não tenha definido o projeto e a zona para esta sessão, faça isso agora. Consulte as instruções ensinadas anteriormente neste guia. Depois, siga este procedimento de limpeza:
Execute o seguinte comando para excluir o cluster do GKE,
tpu-models-cluster
, substituindo project-name pelo nome do projeto do Google Cloud:$ gcloud container clusters delete tpu-models-cluster --project=project-name
Ao terminar de examinar os dados, use o comando
gsutil
para excluir o bucket do Cloud Storage criado durante este tutorial. Substitua bucket-name pelo nome do seu bucket no Cloud Storage.$ gsutil rm -r gs://bucket-name
Consulte o guia de preços do Cloud Storage para se informar sobre os limites de armazenamento gratuito e outros preços.
A seguir
- Conheça as ferramentas da TPU no TensorBoard.
Use uma das especificações de job abaixo para executar mais modelos e jobs de recuperação de conjuntos de dados:
- Faça o download e o pré-processamento do conjunto de dados COCO no GKE.
- Faça o download e o pré-processamento do ImageNet no GKE.
- Treine o AmoebaNet-D usando a Cloud TPU e o GKE.
- Treine o Inception v3 usando a Cloud TPU e o GKE.
- Treine o RetinaNet usando a Cloud TPU e o GKE.
Teste mais amostras de TPU.