Como treinar no Transformer no Cloud TPU (TF 2.x)


Se você não conhece o Cloud TPU, é altamente recomendável consultar o quickstart para aprender a criar uma VM de TPU.

Neste tutorial, mostramos como treinar um modelo do Transformer no Cloud TPU. O Transformer é uma arquitetura de rede neural que resolve problemas de sequência usando mecanismos de atenção. Ao contrário dos modelos neurais tradicionais seq2seq, o Transformer não envolve conexões recorrentes. O mecanismo de atenção aprende as dependências entre tokens em duas sequências. Como os pesos de atenção se aplicam a todos os tokens nas sequências, o modelo Transformer pode facilmente capturar dependências de longa distância.

A estrutura geral do Transformer segue o padrão de codificador-decodificador. O codificador usa a atenção própria para calcular uma representação da sequência de entrada. O decodificador gera a sequência de saída um token por vez, tomando como entradas a saída do codificador e os tokens anteriores dessa saída.

O modelo também aplica embeddings aos tokens de entrada e saída e adiciona uma codificação posicional constante. A codificação posicional adiciona informações sobre a posição de cada token.

Objetivos

  • Criar um bucket do Cloud Storage para armazenar o conjunto de dados e a saída do modelo.
  • Faça o download e pré-processe o conjunto de dados usado para treinar o modelo.
  • Executar o job de treinamento.
  • Verificar os resultados da saída.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

  • Compute Engine
  • Cloud TPU

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

Antes de começar o tutorial, verifique se o projeto do Google Cloud foi configurado corretamente.

  1. 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.
  2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  5. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  6. Este tutorial usa componentes faturáveis do Google Cloud. Consulte a página de preços da Cloud TPU para fazer uma estimativa dos custos. Para evitar cobranças desnecessárias, não se esqueça de apagar os recursos criados ao terminar de usá-los.

Treinar com um único dispositivo do Cloud TPU

Nesta seção, você verá como configurar um bucket do Cloud Storage e uma VM da TPU para treinamento em um único dispositivo.

  1. Abra uma janela do Cloud Shell.

    Abrir o Cloud Shell

  2. Crie uma variável de ambiente para o ID do projeto.

    export PROJECT_ID=project-id
    
  3. Configure a CLI do Google Cloud para usar o projeto do Google Cloud em que você quer criar um Cloud TPU.

    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 em Authorize na parte inferior da página para permitir que gcloud faça chamadas de API do Google Cloud com suas credenciais.

  4. Crie uma conta de serviço para o projeto da Cloud TPU.

    As contas de serviço permitem que o serviço do Cloud TPU acesse outros serviços do Google Cloud.

    $ 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
    

  5. Crie um bucket do Cloud Storage usando o seguinte comando:

    $ gsutil mb -p ${PROJECT_ID} -c standard -l us-central2 gs://bucket-name
    

    Esse bucket do Cloud Storage armazena os dados usados para treinar o modelo e os resultados do treinamento. O comando gcloud usado neste tutorial para configurar a TPU também configura permissões padrão para a conta de serviço do Cloud TPU configurada na etapa anterior. Caso queira permissões mais específicas, consulte as permissões de nível de acesso.

Treinar o modelo do Transformer em uma única Cloud TPU

  1. Inicie uma VM do Cloud TPU usando o comando gcloud.

      $ gcloud compute tpus tpu-vm create transformer-tutorial \
         --zone=us-central2-b \
         --accelerator-type=v4-8 \
         --version=tpu-vm-tf-2.16.1-pjrt
    

    Descrições de sinalizações de comando

    zone
    A zona em que você planeja criar o Cloud TPU.
    accelerator-type
    O tipo de acelerador especifica a versão e o tamanho do Cloud TPU que você quer criar. Para mais informações sobre os tipos de aceleradores compatíveis com cada versão de TPU, acesse Versões de TPU.
    version
    A versão do software do Cloud TPU.
  2. Conecte-se à VM do Cloud TPU executando o comando ssh a seguir.

    gcloud compute tpus tpu-vm ssh transformer-tutorial --zone=us-central2-b
    
  3. Exporte as variáveis de ambiente.

      (vm)$ export STORAGE_BUCKET=gs://bucket-name
      (vm)$ export SENTENCEPIECE_MODEL=sentencepiece
      (vm)$ export SENTENCEPIECE_MODEL_PATH=${STORAGE_BUCKET}/${SENTENCEPIECE_MODEL}.model
      (vm)$ export TFDS_DIR=${STORAGE_BUCKET}/tfds
      (vm)$ export PARAM_SET=big
      (vm)$ export TPU_NAME=local
      (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/transformer/model_${PARAM_SET}
      (vm)$  export PYTHONPATH="/usr/share/tpu/models:$PYTHONPATH"
    
  4. Ao criar sua TPU, se você definir o parâmetro --version como uma versão que termina com -pjrt, defina as seguintes variáveis de ambiente para ativar o ambiente de execução PJRT:

      (vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
      (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
    
  5. Instale os requisitos do TensorFlow.

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
    
  6. Fazer o download e o pré-processamento do conjunto de dados

      (vm)$ python3 -c "import tensorflow_datasets as tfds; tfds.load('wmt14_translate/de-en', split='train+validation', shuffle_files=True, download=True)"
      (vm)$ python3 /usr/share/tpu/models/official/nlp/data/train_sentencepiece.py --output_model_path=${SENTENCEPIECE_MODEL}
    
  7. Copie o conjunto de dados para o bucket do Cloud Storage

      (vm)$ gsutil -m cp ${SENTENCEPIECE_MODEL}.model ${STORAGE_BUCKET}
      (vm)$ gsutil -m cp ${SENTENCEPIECE_MODEL}.vocab ${STORAGE_BUCKET}
      (vm)$ gsutil -m cp -r tensorflow_datasets/wmt14_translate ${TFDS_DIR}/wmt14_translate
    
  8. Navegue até o diretório de treinamento.

    (vm)$ cd /usr/share/tpu/models/
    
  9. execute o script de treinamento

    (vm)$ python3 official/nlp/train.py \
      --tpu=${TPU_NAME} \
      --experiment=wmt_transformer/large \
      --mode=train_and_eval \
      --model_dir=${MODEL_DIR} \
      --params_override="runtime.distribution_strategy=tpu, task.train_data.tfds_data_dir=${TFDS_DIR}, task.validation_data.tfds_data_dir=${TFDS_DIR}, task.sentencepiece_model_path=${SENTENCEPIECE_MODEL_PATH}, trainer.train_steps=10000, trainer.validation_interval=10000"
    

    Descrições de sinalizações de comando

    tpu
    O nome da Cloud TPU. Para isso, especifique a variável de ambiente (TPU_NAME).
    experiment
    O modelo a ser treinado.
    mode
    O modo de execução do script.
    model_dir
    O bucket do Cloud Storage em que os checkpoints e os resumos são armazenados durante o treinamento. É possível usar uma pasta atual para carregar checkpoints gerados anteriormente criados em uma TPU de mesmo tamanho e versão do TensorFlow.
    params_override
    Defina os parâmetros do modelo.

    Por padrão, o modelo é avaliado a cada 10.000 etapas. É possível aumentar o número de etapas de treinamento ou especificar a frequência de execução das avaliações definindo estes parâmetros:

    • train.train_steps: o número total de etapas de treinamento a serem executadas.
    • trainer.validation_interval: o número de etapas de treinamento a serem executadas entre as avaliações.

    O treinamento e a avaliação levam aproximadamente 20 minutos em um Cloud TPU v4-8. Quando o treinamento e a avaliação forem concluídos, uma mensagem semelhante a esta será exibida:

    I0208 20:57:19.309512 140039467895872 controller.py:310]  eval | step:  10000 | eval time:   69.2 sec | output:
    {'bleu_score': 19.204771518707275,
     'sacrebleu_score': 18.307039308307356,
     'validation_loss': 2.0654342}
     eval | step:  10000 | eval time:   69.2 sec | output:
    {'bleu_score': 19.204771518707275,
     'sacrebleu_score': 18.307039308307356,
     'validation_loss': 2.0654342}
    

    Você concluiu o treinamento para dispositivos únicos. Use as etapas a seguir para excluir os recursos da TPU de dispositivo único.

  10. Desconecte-se da instância do Compute Engine:

    (vm)$ exit
    

    Agora, o prompt será username@projectname, mostrando que você está no Cloud Shell.

  11. Exclua o recurso da TPU.

      $ gcloud compute tpus tpu-vm delete transformer-tutorial \
        --zone=us-central2-b
      

    Descrições de sinalizações de comando

    zone
    A zona em que o Cloud TPU reside.

Neste ponto, é possível concluir este tutorial e limpar ou continuar executando o modelo nos Pods do Cloud TPU.

Escalonar seu modelo com pods do Cloud TPU

O treinamento do modelo em pods do Cloud TPU pode exigir algumas alterações no script de treinamento. Para mais informações, consulte Como treinar em pods de TPU.

Treinamento do Pod de TPU

  1. Abra uma janela do Cloud Shell.

    Abrir o Cloud Shell

  2. Crie uma variável para o ID do projeto.

    export PROJECT_ID=project-id
    
  3. Configure a CLI do Google Cloud para usar o projeto em que você quer criar um Cloud TPU.

    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 em Authorize na parte de baixo da página para permitir que gcloud faça chamadas de API com suas credenciais.

  4. 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
    

  5. Crie um bucket do Cloud Storage usando o comando a seguir ou use um bucket criado anteriormente para o projeto:

    gsutil mb -p ${PROJECT_ID} -c standard -l us-central1 gs://bucket-name
    

    Esse bucket do Cloud Storage armazena os dados usados para treinar o modelo e os resultados do treinamento. O comando gcloud usado neste tutorial configura permissões padrão para a conta de serviço do Cloud TPU configurada na etapa anterior. Caso queira permissões mais específicas, consulte as permissões de nível de acesso.

Iniciar os recursos de VM da TPU

  1. Inicie um pod de VM de TPU usando o comando gcloud. Este tutorial especifica um pod v4-32. Para outras opções de pod, consulte a página sobre tipos de TPU disponíveis Tipos de TPU.

    $ gcloud compute tpus tpu-vm create transformer-tutorial \
      --zone=us-central2-b \
      --accelerator-type=v3-32 \
      --version=tpu-vm-tf-2.16.1-pod-pjrt
    

    Descrições de sinalizações de comando

    zone
    A zona em que você planeja criar o Cloud TPU.
    accelerator-type
    O tipo de acelerador especifica a versão e o tamanho do Cloud TPU que você quer criar. Para mais informações sobre os tipos de aceleradores compatíveis com cada versão de TPU, acesse Versões de TPU.
    version
    A versão do software do Cloud TPU.
  2. Conecte-se à VM da TPU executando o comando ssh a seguir. Quando você faz login na VM, o prompt do shell muda de username@projectname para username@vm-name:

    gcloud compute tpus tpu-vm ssh transformer-tutorial --zone=us-central2-b
    
  3. Instale os requisitos do TensorFlow.

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
    

Configurar e iniciar o treinamento do pod

  1. Exporte as variáveis de configuração do Cloud TPU:

    (vm)$ export PYTHONPATH="/usr/share/tpu/models:$PYTHONPATH"
    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    (vm)$ export SENTENCEPIECE_MODEL=sentencepiece
    (vm)$ export SENTENCEPIECE_MODEL_PATH=${STORAGE_BUCKET}/${SENTENCEPIECE_MODEL}.model
    (vm)$ export TFDS_DIR=${STORAGE_BUCKET}/tfds
    (vm)$ export TPU_NAME=transformer-tutorial
    (vm)$ export PARAM_SET=big
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/transformer/model_${PARAM_SET}
    (vm)$ export TPU_LOAD_LIBRARY=0
    
  2. Fazer o download do conjunto de dados

    (vm)$ python3 -c "import tensorflow_datasets as tfds; tfds.load('wmt14_translate/de-en', split='train+validation', shuffle_files=True, download=True)"
    (vm)$ python3 /usr/share/tpu/models/official/nlp/data/train_sentencepiece.py --output_model_path=${SENTENCEPIECE_MODEL}

  3. Copie o conjunto de dados para o bucket do Cloud Storage

    (vm)$ gsutil -m cp ${SENTENCEPIECE_MODEL}.model ${STORAGE_BUCKET}
    (vm)$ gsutil -m cp ${SENTENCEPIECE_MODEL}.vocab ${STORAGE_BUCKET}
    (vm)$ gsutil -m cp -r tensorflow_datasets/wmt14_translate ${TFDS_DIR}/wmt14_translate
    
  4. Mude para o diretório de treinamento:

    (vm)$ cd /usr/share/tpu/models/
  5. Execute o script de treinamento:

    (vm)$ python3 official/nlp/train.py 
    --tpu=${TPU_NAME}
    --experiment=wmt_transformer/large
    --mode=train_and_eval
    --model_dir=${MODEL_DIR}
    --params_override="runtime.distribution_strategy=tpu, task.train_data.tfds_data_dir=${TFDS_DIR}, task.validation_data.tfds_data_dir=${TFDS_DIR}, task.sentencepiece_model_path=${SENTENCEPIECE_MODEL_PATH}, trainer.train_steps=10000, trainer.validation_interval=10000"

    Command flag descriptions

    tpu
    The name of the Cloud TPU. This is set by specifying the environment variable (TPU_NAME).
    experiment
    The model to train.
    mode
    The mode in which to run the script.
    model_dir
    The Cloud Storage bucket where checkpoints and summaries are stored during training. You can use an existing folder to load previously generated checkpoints created on a TPU of the same size and TensorFlow version.
    params_override
    Set model parameters.

Por padrão, o modelo é avaliado a cada 10 mil etapas. Para treinar para a conversão, altere train_steps para 200.000. Você pode aumentar o número de etapas de treinamento ou especificar com que frequência executar avaliações definindo estes parâmetros:

  • trainer.train_steps: define o número total de etapas de treinamento a serem executadas.
  • trainer.validation_interval: define o número de etapas de treinamento a serem executadas entre as avaliações.

O treinamento e a avaliação levam aproximadamente 14 minutos em uma Cloud TPU v4-32. Quando o treinamento e a avaliação forem concluídos, mensagens semelhantes às seguintes serão exibidas:

I0209 22:19:49.143219 139751309618240 controller.py:310]  eval | step:  10000 | eval time:   73.6 sec | output:
    {'bleu_score': 19.401752948760986,
     'sacrebleu_score': 18.442741330886378,
     'validation_loss': 2.0558002}
 eval | step:  10000 | eval time:   73.6 sec | output:
    {'bleu_score': 19.401752948760986,
     'sacrebleu_score': 18.442741330886378,
     'validation_loss': 2.0558002}

Este script de treinamento treina por 20 mil etapas e executa uma avaliação a cada 2 mil. Esse treinamento e avaliação específicos levam aproximadamente oito minutos em um pod do Cloud TPU v3-32. Quando o treinamento e a avaliação forem concluídos, uma mensagem semelhante a esta será exibida:

INFO:tensorflow:Writing to file /tmp/tmpdmlanxcf
I0218 21:09:19.100718 140509661046592 translate.py:184] Writing to file /tmp/tmpdmlanxcf
I0218 21:09:28.043537 140509661046592 transformer_main.py:118] Bleu score (uncased): 1.799112930893898
I0218 21:09:28.043911 140509661046592 transformer_main.py:119] Bleu score (cased): 1.730366237461567

Para treinar para a convergência, altere train_steps para 200.000. Você pode aumentar o número de etapas de treinamento ou especificar com que frequência executar avaliações definindo estes parâmetros:

  • --train_steps: define o número total de etapas de treinamento a serem executadas.
  • --steps_between_evals: número de etapas de treinamento a serem executadas entre as avaliações.

Quando o treinamento e a avaliação forem concluídos, uma mensagem semelhante à seguinte será exibida:

0509 00:27:59.984464 140553148962624 translate.py:184] Writing to file /tmp/tmp_rk3m8jp
I0509 00:28:11.189308 140553148962624 transformer_main.py:119] Bleu score (uncased): 1.3239131309092045
I0509 00:28:11.189623 140553148962624 transformer_main.py:120] Bleu score (cased): 1.2855342589318752

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

  1. Desconecte-se da instância do Compute Engine, caso ainda não tenha feito isso:

    (vm)$ exit
    

    Agora, o prompt precisa ser username@projectname, mostrando que você está no Cloud Shell.

  2. Exclua os recursos do Cloud TPU e do Compute Engine.

    $ gcloud compute tpus tpu-vm delete transformer-tutorial \
      --zone=us-central2-b
    
  3. Execute gsutil conforme mostrado. Substitua bucket-name pelo nome do bucket do Cloud Storage criado para este tutorial:

    $ gsutil rm -r gs://bucket-name
    
    

A seguir

Geralmente, os tutoriais do Cloud TPU do TensorFlow treinam o modelo usando um conjunto de dados de amostra. Os resultados deste treinamento não podem ser usados para inferência. Para usar um modelo para inferência, treine os dados em um conjunto de dados disponível publicamente ou no seu próprio conjunto de dados. Os modelos do TensorFlow treinados em Cloud TPUs geralmente exigem que os conjuntos de dados estejam no formato TFRecord.

Use a amostra da ferramenta de conversão de conjunto de dados para converter um conjunto de dados de classificação de imagens no formato TFRecord. Se você não estiver usando um modelo de classificação de imagens, será necessário converter seu conjunto de dados para o formato TFRecord. Para mais informações, consulte TFRecord e tf.Example.

Ajuste de hiperparâmetros

Para melhorar o desempenho do modelo com seu conjunto de dados, é possível ajustar os hiperparâmetros do modelo. Veja informações sobre hiperparâmetros comuns a todos os modelos compatíveis com TPU no GitHub. As informações sobre hiperparâmetros específicos do modelo estão disponíveis no código-fonte de cada modelo. Para mais informações sobre o ajuste de hiperparâmetros, consulte Visão geral do ajuste de hiperparâmetros e Ajustar hiperparâmetros.

Inferência

Depois de treinar o modelo, é possível usá-lo para inferência (também chamada de previsão). É possível usar a ferramenta de conversão de inferência do Cloud TPU para preparar e otimizar um modelo do TensorFlow para inferência no Cloud TPU v5e. Para mais informações sobre inferência no Cloud TPU v5e, consulte Introdução à inferência no Cloud TPU v5e.