Path: blob/master/site/pt-br/guide/core/distribution.ipynb
25118 views
Copyright 2022 The TensorFlow Authors.
Treinamento distribuído com Core APIs e DTensor
Introdução
Este notebook usa as APIs de baixo nível do TensorFlow Core e o DTensor para demonstrar um exemplo de treinamento distribuído paralelo de dados. Acesse a visão geral das APIs principais para saber mais sobre o TensorFlow Core e os casos de uso pretendidos. Consulte o guia Visão geral do DTensor e o tutorial Treinamento distribuído com DTensors para saber mais sobre o DTensor.
Este exemplo usa o mesmo modelo e otimizador mostrado no tutorial sobre perceptrons multicamadas. Consulte esse tutorial primeiro para se sentir confortável ao escrever um workflow de aprendizado de máquina completo com as APIs Core.
Observação: o DTensor ainda é uma API experimental do TensorFlow, o que significa que seus recursos estão disponíveis para teste e se destinam ao uso apenas em ambientes de teste.
Visão geral do treinamento paralelo de dados com DTensor
Antes de construir um MLP que suporte distribuição, reserve um momento para explorar os fundamentos do DTensor para treinamento paralelo de dados.
O DTensor permite que você execute treinamento distribuído entre dispositivos para melhorar a eficiência, confiabilidade e escalabilidade. O DTensor distribui o programa e os tensores de acordo com as diretivas de sharding por meio de um procedimento denominado expansão de programa único, dados múltiplos (SPMD - Single Program, Multiple Data). Uma variável de uma camada que reconhece o DTensor
é criada como dtensor.DVariable
, e os construtores dos objetos da camada que reconhece o DTensor
recebem entradas Layout
adicionais, além dos parâmetros usuais da camada.
As principais ideias por trás do treinamento paralelo de dados são as seguintes:
Variáveis do modelo são replicadas em N dispositivos cada.
Um lote global é dividido em N lotes por réplica.
Cada lote por réplica é treinado no dispositivo de réplica.
O gradiente é reduzido antes que os dados de ponderação sejam executados coletivamente em todas as réplicas.
O treinamento paralelo de dados fornece velocidade quase linear em relação ao número de dispositivos
Configuração
O DTensor faz parte da versão 2.9.0 do TensorFlow.
Configure 8 CPUs virtuais para este experimento. O DTensor também pode ser usado com dispositivos GPU ou TPU. Dado que este notebook utiliza dispositivos virtuais, a aceleração obtida com o treinamento distribuído não é perceptível.
O dataset MNIST
O dataset está disponível em TensorFlow Datasets. Divida os dados em datasets de treinamento e teste. Use apenas 5.000 exemplos para treinamento e teste para economizar tempo.
Pré-processamento dos dados
Pré-processe os dados remodelando-os para serem bidimensionais e redimensionando-os para caber no intervalo unitário, [0,1].
Construção do MLP
Construa um modelo MLP com camadas compatíveis com DTensor.
A camada densa
Comece criando um módulo de camada densa que suporte DTensor. A função dtensor.call_with_layout
pode ser usada para chamar uma função que recebe uma entrada do DTensor e produz uma saída do DTensor. Isto é útil para inicializar uma variável DTensor, dtensor.DVariable
, com uma função compatível com TensorFlow.
O modelo sequencial MLP
Agora crie um módulo MLP que execute as camadas densas sequencialmente.
Realizar treinamento "paralelo a dados" com o DTensor é equivalente à estratégia tf.distribute.MirroredStrategy
. Paraisto, cada dispositivo executará o mesmo modelo num fragmento do lote de dados. Então você precisará do seguinte:
Uma malha
dtensor.Mesh
com uma única dimensão de"batch"
Um
dtensor.Layout
para todos os pesos que os replica na malha (usandodtensor.UNSHARDED
para cada eixo)Um
dtensor.Layout
para os dados que dividem a dimensão do lote pela malha
Crie uma malha DTensor que consiste numa única dimensão de lote, onde cada dispositivo se torna uma réplica que recebe um fragmento do lote global. Use esta malha para instanciar um modo MLP com a seguinte arquitetura:
Passo para frente: ReLU (784 x 700) x ReLU (700 x 500) x Softmax (500 x 10)
Métricas de treinamento
Use a função de perda de entropia cruzada e a métrica de exatidão para o treinamento.
Otimizador
O uso de um otimizador pode trazer como resultado uma convergência significativamente mais rápida em comparação com o método do gradiente descendente padrão. O otimizador Adam foi implementado abaixo e configurado para ser compatível com o DTensor. Para usar otimizadores Keras com o DTensor, veja o módulo experimental tf.keras.dtensor.experimental.optimizers
.
Empacotamento de dados
Comece escrevendo uma função helper para transferir dados para o dispositivo. Esta função deve usar dtensor.pack
para enviar (e apenas enviar) o shard do lote global que se pretende usar para uma réplica ao dispositivo que suporta a réplica. Para simplificar, suponha um aplicativo de cliente único.
Em seguida, escreva uma função que use esta função auxiliar para compactar os lotes de dados de treinamento em DTensors fragmentados (sharded) ao longo do (primeiro) eixo do lote. Isto garante que o DTensor distribua uniformemente os dados de treinamento para a dimensão da malha em 'lote'. Observe que no DTensor, o tamanho do lote sempre se refere ao tamanho global do lote; portanto, o tamanho do lote deve ser escolhido de forma que possa ser dividido igualmente pelo tamanho da dimensão da malha do lote. Estão planejadas APIs DTensor adicionais para simplificar a integração tf.data
, portanto, fique atento.
Treinamento
Escreva uma função rastreável que execute uma única etapa de treinamento com base num lote de dados. Esta função não requer nenhuma anotação especial do DTensor. Escreva também uma função que execute uma etapa de teste e retorne as métricas de desempenho apropriadas.
Agora, treine o modelo MLP para 3 épocas com tamanho de lote de 128.
Avaliação de desempenho
Comece escrevendo uma função de plotagem para visualizar a perda e a precisão do modelo durante o treinamento.
Salvando o modelo
A integração de tf.saved_model
e DTensor ainda está em desenvolvimento. A partir do TensorFlow 2.9.0, tf.saved_model aceita apenas modelos DTensor com variáveis totalmente replicadas. Como solução alternativa, você pode converter um modelo DTensor num modelo totalmente replicado recarregando um checkpoint. No entanto, depois que um modelo é salvo, todas as anotações do DTensor são perdidas e as assinaturas salvas só podem ser usadas com Tensores regulares. Este tutorial será atualizado para mostrar a integração assim que ela estiver solidificada.
Conclusão
Este notebook forneceu uma visão geral do treinamento distribuído com DTensor e as APIs TensorFlow Core. Aqui estão mais algumas dicas que podem ajudar:
As APIs do TensorFlow Core podem ser usadas para criar workflows de aprendizado de máquina com altos níveis de configurabilidade
O guia de conceitos do DTensor e o tutorial Treinamento distribuído com DTensors contêm as informações mais atualizadas sobre o DTensor e suas integrações.
Para obter mais exemplos de uso das APIs Core do TensorFlow, confira o guia . Se você quiser saber mais sobre como carregar e preparar dados, consulte os tutoriais sobre carregamento de dados de imagem ou carregamento de dados CSV.