Copyright 2018 The TensorFlow Authors.
Este guia demonstra como realizar treinamento básico em Unidades de Processamento de Tensores (TPUs) e TPU Pods, uma coleção de dispositivos de TPU conectados por interfaces de rede de alta velocidade dedicadas, com tf.keras
e loops de treinamento personalizados.
TPUs são circuitos integrados de aplicação específica (ASICs) desenvolvidos sob medida pelo Google e usados para acelerar as cargas de trabalho de aprendizado de máquina. Eles estão disponíveis no Google Colab, TPU Research Cloud e Cloud TPU.
Configuração
Antes de executar este notebook do Colab, confira se o acelerador de hardware é um TPU ao verificar as configurações do seu notebook: Runtime > Change runtime type > Hardware accelerator > TPU.
Importe algumas bibliotecas necessárias, incluindo o TensorFlow Datasets:
Inicialização da TPU
TPUs são tipicamente workers da Cloud TPU, que são diferentes do processo local que executa o programa Python do usuário. Portanto, você precisa fazer algum trabalho de inicialização para conectar-se ao cluster remoto e inicializar as TPUs. Observe que o argumento tpu
recebido por tf.distribute.cluster_resolver.TPUClusterResolver
é um endereço especial apenas para o Colab. Se você estiver executando seu código no Google Compute Engine (GCE), deverá passar o nome do Cloud TPU.
Observação: O código de inicialização da TPU deve estar no início do seu programa.
Posicionamento manual dos dispositivos
Depois que a TPU for inicializada, você poderá usar o posicionamento manual do dispositivo para colocar a computação num único dispositivo de TPU:
Estratégias de distribuição
Geralmente você executará seu modelo em múltiplas TPUs de maneira paralela aos dados. Para distribuir seu modelo em múltiplas TPUs (assim como em múltiplas GPUs ou em múltiplas máquinas), o TensorFlow oferece a API tf.distribute.Strategy
. Você pode substituir sua estratégia de distribuição e o modelo será executado em qualquer dispositivo (TPU). Saiba mais no guia Treinamento distribuído com TensorFlow.
O uso da opção tf.distribute.TPUStrategy
implementa treinamento distribuído síncrono. As TPUs fornecem sua própria implementação de operações all-reduce eficientes e outras operações coletivas em múltiplos cores de TPU, que são usados na TPUStrategy
.
Para demonstrar isso, crie um objeto tf.distribute.TPUStrategy
:
Para replicar uma computação para que ela possa ser executada em todos os cores da TPU, você pode passá-la para a API Strategy.run
. Abaixo está um exemplo que mostra todos os cores recebendo as mesmas entradas (a, b)
e realizando multiplicação matricial em cada core de forma independente. As saídas serão os valores obtidos de todas as réplicas.
Classificação em TPUs
Tendo coberto os conceitos básicos, considere um exemplo mais concreto. Esta seção demonstra como usar a estratégia de distribuição (tf.distribute.TPUStrategy
) para treinar um modelo Keras numa Cloud TPU.
Defina um modelo Keras
Comece com uma definição de um modelo Sequential
Keras para classificação de imagens no dataset MNIST. Não é diferente do que você usaria se estivesse treinando em CPUs ou GPUs. Observe que a criação do modelo Keras precisa estar dentro do Strategy.scope
, para que as variáveis possam ser criadas em cada dispositivo TPU. Outras partes do código não são necessárias para estarem dentro do escopo de Strategy
.
Este modelo coloca os termos de regularização L2 nos pesos de cada camada, para que o loop de treinamento personalizado abaixo possa mostrar como obtê-los de Model.losses
.
Carregue o dataset
O uso eficiente da API tf.data.Dataset
é fundamental ao usar uma Cloud TPU. Você pode saber mais sobre o desempenho do dataset no Guia de desempenho do pipeline de entrada.
Se você estiver usando TPU Nodes, precisará armazenar todos os arquivos de dados lidos pelo Dataset
do TensorFlow nos buckets do Google Cloud Storage (GCS). Se você estiver usando TPU VMs, poderá armazenar dados onde quiser. Para mais informações sobre TPU Nodes e TPU VMs, consulte a documentação da Arquitetura do Sistema TPU.
Para a maioria dos casos de uso, é recomendado converter seus dados para o formato TFRecord
e usar tf.data.TFRecordDataset
para lê-los. Verifique o tutorial sobre TFRecord e tf.Example para detalhes sobre como fazer isso. Não é um requisito difícil e você pode usar outros leitores de dataset, como tf.data.FixedLengthRecordDataset
ou tf.data.TextLineDataset
.
Você pode carregar pequenos datasets inteiros na memória usando tf.data.Dataset.cache
.
Independentemente do formato de dados utilizado, é altamente recomendável usar arquivos grandes, da ordem de 100 MB. Isto é especialmente importante neste ambiente de rede, pois o overhead na abertura de um arquivo é significativamente maior.
Conforme mostrado no código abaixo, você deve usar o módulo tfds.load
do Tensorflow Datasets para obter uma cópia dos dados de treinamento e teste do MNIST. Observe que try_gcs
é especificado para usar uma cópia que está disponível num bucket público do GCS. Se você não especificar isso, a TPU não poderá acessar os dados baixados.
Treine o modelo usando APIs de alto nível do Keras
Você pode treinar seu modelo com APIs Keras Model.fit
e Model.compile
. Não há nada específico de TPU nesta etapa – você escreve o código como se estivesse usando múltiplas GPUs e uma MirroredStrategy
em vez de TPUStrategy
. Você pode aprender mais no tutorial Treinamento distribuído com Keras.
Para reduzir o overhead do Python e maximizar o desempenho da sua TPU, passe o argumento steps_per_execution
para o Keras Model.compile
. Neste exemplo, isto aumenta o rendimento em cerca de 50%:
Treine o modelo usando um loop de treinamento personalizado
Você também pode criar e treinar seu modelo usando as APIs tf.function
e tf.distribute
diretamente. Você pode usar a API Strategy.experimental_distribute_datasets_from_function
para distribuir o tf.data.Dataset
dada uma função de dataset. Observe que no exemplo abaixo o tamanho do lote passado para o Dataset
é o tamanho do lote por réplica em vez do tamanho do lote global. Para saber mais, confira o tutorial Treinamento personalizado com tf.distribute.Strategy
.
Primeiro, crie o modelo, os datasets e as tf.function
:
Em seguida, execute o loop de treinamento:
Melhorando o desempenho com múltiplos passos dentro de tf.function
Você pode melhorar o desempenho executando múltiplos passos numa tf.function
. Isso é conseguido empacotando a chamada Strategy.run
com um tf.range
dentro de tf.function
, e o AutoGraph irá convertê-la num tf.while_loop
no worker TPU. Você pode aprender mais sobre tf.function
no guia Melhor desempenho com tf.function
.
Apesar do desempenho aprimorado, há vantagens e desvantagens nesse método em comparação com a execução de um único passo dentro de um tf.function
. Executar vários passos em uma tf.function
é menos flexível – você não pode executar coisas de forma eager ou código Python arbitrário dentro dos passos.
Próximos passos
Para saber mais sobre as Cloud TPUs e como usá-las, consulte:
Google Cloud TPU: a página principal da Google Cloud TPU.
Documentação da Google Cloud TPU documentation: toda a documentação da Google Cloud TPU, que inclui:
Introdução à Cloud TPU: uma visão geral de como trabalhar com Cloud TPUs.
Guias de início rápido do Cloud TPU: guias introdutórios de como trabalhar com VMs da Cloud TPU usando o TensorFlow e outros frameworks de machine learning.
Notebooks Colab do Google Cloud TPU: exemplos de treinamento completo.
Guia de desempenho do Google Cloud TPU: melhore ainda mais o desempenho do Cloud TPU ajustando os parâmetros de configuração do Cloud TPU para seu aplicativo
Treinamento distribuído com TensorFlow: como usar estratégias de distribuição, incluindo
tf.distribute.TPUStrategy
, com exemplos que mostram as práticas recomendadas.Embeddings de TPU: o TensorFlow inclui suporte especializado para treinamento de embeddings em TPUs por meio de
tf.tpu.experimental.embedding
. Além disso, o TensorFlow Tecommenders possuitfrs.layers.embedding.TPUEmbedding
. Os embeddings fornecem representações eficientes e densas, capturando similaridades e relacionamentos complexos entre características. O suporte a embeddings específicos para TPU do TensorFlow permite treinar embeddings maiores que a memória de um único dispositivo TPU e usar entradas esparsas e irregulares em TPUs.TPU Research Cloud (TRC): o TRC permite que pesquisadores solicitem acesso a um cluster de mais de 1.000 dispositivos Cloud TPU.