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


Se você não estiver familiarizado com o Cloud TPU, consulte os guias de introdução ao Cloud 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, considerando a saída do codificador e os tokens anteriores do decodificador-saída como entradas.

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. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  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 Cloud TPU

Nesta seção, você encontra informações sobre como configurar um bucket do Cloud Storage e uma VM de 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. Configurar a CLI do Google Cloud para usar o projeto do Google Cloud em que 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 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 Google Cloud serviços.

    $ 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:

    $ gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=us-central2

    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 um único 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.17.0-pjrt

    Descrições de sinalizações de comando

    zone
    A zona em que você planeja criar a 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, consulte versões de TPU.
    version
    A versão do software do Cloud TPU.
  2. Conecte-se à VM da TPU usando SSH. Quando você estiver conectado para a 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. 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 pré-processar o 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. Copiar o conjunto de dados para o bucket do Cloud Storage

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

    (vm)$ cd /usr/share/tpu/models/
  9. Executar 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 existente para carregar pontos de verificação gerados em uma TPU do mesmo tamanho Versão do TensorFlow.
    params_override
    Defina os parâmetros do modelo.

    Por padrão, o modelo é avaliado a cada 10.000 etapas. Você pode aumentar o número de etapas de treinamento ou especificar a frequência de execução de 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 modelo v4-8 Cloud TPU: 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 onde o Cloud TPU residiu.

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

Escalone seu modelo com os pods do Cloud TPU

O treinamento do modelo em pods da Cloud TPU pode exigir algumas alterações para seu script de treinamento. Para mais informações, consulte Treinamento 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:

    gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=us-central1

    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. Para mais informações sobre permissões mais específicas, consulte 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. Isso especifica um pod v4-32. Para outras opções de pod, consulte a página Tipos de TPU disponíveis.

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

    Descrições de sinalizações de comando

    zone
    A zona em que você planeja criar a 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, consulte versões de TPU.
    version
    A versão do software do Cloud TPU.
  2. Conecte-se à instância do Compute Engine usando SSH. Quando você estiver conectado para a 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. Copiar o conjunto de dados para o bucket do Cloud Storage

    (vm)$ gcloud storage cp ${SENTENCEPIECE_MODEL}.model ${STORAGE_BUCKET}
    (vm)$ gcloud storage cp ${SENTENCEPIECE_MODEL}.vocab ${STORAGE_BUCKET}
    (vm)$ gcloud storage cp tensorflow_datasets/wmt14_translate ${TFDS_DIR}/wmt14_translate --recursive
  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"

    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 existente para carregar pontos de verificação gerados em uma TPU do mesmo tamanho Versão do TensorFlow.
    params_override
    Definir os parâmetros do modelo.

Por padrão, o modelo será avaliado a cada 10.000 etapas. Para treinar para convergência, mude 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 um modelo v4-32 Cloud TPU: 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 20.000 etapas e executa uma avaliação a cada 2.000 etapas. 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 a CLI gcloud conforme mostrado, substituindo bucket-name por o nome do bucket do Cloud Storage criado para este tutorial:

    $ gcloud storage rm gs://bucket-name --recursive

A seguir

Geralmente, os tutoriais do Cloud TPU do TensorFlow treinam o modelo usando um conjunto de dados de amostra. Os resultados desse treinamento não são utilizáveis para inferência. Para usar um modelo para inferência, é possível treinar 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 imagem no formato TFRecord. Se você não estiver usando uma imagem modelo de classificação, você terá que converter seu conjunto de dados para Formato do TFRecord você mesmo. Para mais informações, consulte TFRecord e tf.Example.

Ajuste de hiperparâmetros

Para melhorar o desempenho do modelo com o conjunto de dados, é possível ajustar a e ajustar os hiperparâmetros. É possível encontrar informações sobre hiperparâmetros comuns a todos Modelos com suporte a TPU em GitHub. As informações sobre hiperparâmetros específicos do modelo podem ser encontradas na fonte para cada um modelo de machine learning. Para mais informações sobre o ajuste de hiperparâmetros, consulte a Visão geral do ajuste de hiperparâmetros e Ajuste e ajustar os hiperparâmetros.

Inferência

Depois de treinar o modelo, você pode usá-lo para inferência (também chamado de previsão). Use o conversor de inferência do Cloud TPU ferramenta para preparar e otimizar Modelo do TensorFlow para inferência no Cloud TPU v5e. Para mais informações sobre inferência no Cloud TPU v5e, consulte Inferência do Cloud TPU v5e introdução.