Criar perfil do modelo em VMs do Cloud TPU

A criação de perfil permite otimizar o desempenho de treinamento do seu modelo nos Cloud TPUs. Para criar o perfil do modelo, use o TensorBoard e o plug-in do TensorBoard do Cloud TPU.

Para mais informações sobre como usar o TensorBoard com um dos frameworks compatíveis, consulte os seguintes documentos:

Pré-requisitos para criar o perfil de um script de treinamento

Antes de usar as ferramentas de criação de perfil da TPU, é preciso:

  1. Iniciar uma sessão de treinamento de modelo

    1. Configure uma TPU v4-8 para treinar um modelo. O procedimento de criação de perfil descrito neste documento usa um modelo ResNet, mas é possível usar outro modelo, desde que ele seja treinado em uma TPU v4.
    2. Na VM da TPU, adicione uma linha para iniciar o servidor do criador de perfil no script de treinamento.

      Para o treinamento do ResNET, o script de treinamento está em: /usr/share/tpu/tensorflow/resnet50_keras/resnet50.py.

      Insira as linhas destacadas em resnet50.py. Na parte de cima do arquivo, adicione a seguinte importação:

      import tensorflow.compat.v2 as tf2
      

      Logo antes de os scripts iniciarem o loop de treinamento, adicione a linha destacada:

      if name == 'main':
       tf.logging.set_verbosity(tf.logging.INFO)
       tf2.profiler.experimental.server.start(6000)
       app.run(main)
      

      O servidor do criador de perfil do TensorFlow é iniciado na sua VM da TPU quando você executa o script.

    3. Inicie o treinamento de modelo.

      Execute o script de treinamento e aguarde até ver a saída indicando que o modelo está treinando ativamente. A saída depende do seu código e modelo. Procure uma saída como Epoch 1/100. Outra opção é navegar até a página do Cloud TPU no Console do Google Cloud, selecionar a TPU e visualizar o gráfico de utilização da CPU. O gráfico de utilização da CPU não mostra a utilização da TPU, mas é um bom indicador de que ela está treinando o modelo.

Iniciar a criação de perfil do treinamento de modelo

Quando o modelo estiver em treinamento, abra uma janela de terminal separada ou o Cloud Shell. Siga estas etapas para começar a criar o perfil do treinamento de modelo.

  1. Na nova janela ou shell, conecte-se à VM da TPU com o encaminhamento de portas.

    gcloud compute tpus tpu-vm ssh your-vm --zone=us-central2-b --ssh-flag="-4 -L 9001:localhost:9001"
    

    O encaminhamento de portas permite que seu navegador local se comunique com o servidor TensorBoard em execução na VM da TPU.

  2. Instale os requisitos do TensorFlow {: id="install-tensorboard"}.

    Sua VM de TPU tem o TensorBoard instalado por padrão. Também é possível instalar o TensorFlow manualmente. De qualquer forma, talvez sejam necessárias outras dependências. Instale essas dependências na VM da TPU executando:

    pip3 install -r /usr/share/tpu/models/official/requirements.txt
    
  3. Instale o plug-in do TensorBoard do Cloud TPU {: id="install-plugin"}.

    Na VM da TPU, execute os seguintes comandos:

     pip3 install --upgrade "cloud-tpu-profiler>=2.3.0"
     pip3 install tensorflow
     pip3 install tensorboard_plugin_profile
    
  4. Iniciar o servidor do TensorBoard

    Execute o TensorBoard e crie um diretório de registros (logdir) na VM da TPU em que o TensorBoard pode gravar dados de criação de perfil. Especifique o diretório de registros usando a sinalização --logdir. Exemplo:

    mkdir log-directory
    TPU_LOAD_LIBRARY=0 tensorboard --logdir log-directory --port 9001
    

O TensorBoard inicia um servidor da Web e exibe o URL dele:

Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.3.0 at http://localhost:9001 (Press CTRL+C to quit)

Abra um navegador da Web e acesse o URL exibido na saída do TensorBoard. Selecione Perfil no menu suspenso no canto superior direito da página do TensorBoard. A lista de ferramentas de criação de perfil disponíveis é mostrada no menu suspenso tools, na barra lateral esquerda.

imagem

Capturar um perfil em VMs de TPU

  1. Selecione o botão CAPTURE PROFILE.
  2. Selecione o botão de opção Endereço IP.
  3. Digite HOSTNAME:6000 no campo Profile Service URL.
  4. Selecione o botão CAPTURE.

imagem

Ver dados de perfil com o TensorBoard

Depois de capturar um perfil, o TensorBoard exibe a overview_page. A lista de ferramentas de criação de perfil que você pode usar é exibida no painel esquerdo.

imagem

Perfil

A guia Perfil aparece depois que você captura alguns dados do modelo. Talvez seja necessário clicar no botão de atualização na página do TensorBoard. Quando os dados estiverem disponíveis, clicar na guia Perfil vai mostrar uma seleção de ferramentas que ajudam na análise de desempenho. É possível usar qualquer uma das ferramentas a seguir para criar o perfil do modelo.

Página de visão geral do perfil

A página de visão geral (overview_page), disponível na página Perfil, fornece uma visão de nível superior de como foi o desempenho do seu modelo durante uma execução de captura. A página mostra uma visão geral agregada de todas as suas TPUs e uma análise geral do pipeline de entrada. Há uma opção para selecionar TPUs individuais na lista suspensa Host.

A página mostra dados nos seguintes painéis:

imagem

  • Resumo de desempenho

    • Utilização de FLOPS: a porcentagem de utilização das unidades de matriz da TPU.
  • Dez principais operações do TensorFlow na TPU: mostra as operações do TensorFlow que consumiram mais tempo:

    Cada linha exibe o tempo próprio de uma operação (como a porcentagem de tempo gasto por todas as operações), o tempo cumulativo, a categoria, o nome e a taxa de FLOPS alcançada.

  • Ambiente de execução

    • O número de hosts usados
    • O tipo de TPU usado
    • O número de núcleos de TPU

Analisador do pipeline de entrada

O analisador de pipeline de entrada fornece insights sobre seus resultados de desempenho. A ferramenta informa imediatamente se o programa é limitado pela entrada e pode orientar a análise do dispositivo e do host para depurar qualquer estágio do pipeline que esteja criando gargalos.

Consulte a orientação em desempenho do pipeline de entrada para ver mais insights sobre a otimização do desempenho do pipeline.

Canal de entrada

Quando um programa do TensorFlow lê dados de um arquivo, o processo de leitura é dividido em vários estágios de processamento de dados conectados em série. A saída de uma etapa é a entrada da próxima. Esse sistema de leitura é chamado de pipeline de entrada.

Um pipeline típico para leitura de registros de arquivos tem os seguintes estágios:

  1. leitura de arquivos
  2. Pré-processamento de arquivos (opcional)
  3. Transferência de arquivos da máquina host para o dispositivo

Um canal de entrada ineficiente pode tornar o aplicativo drasticamente lento. Um aplicativo é considerado limitado pela entrada quando passa uma parte significativa do tempo no pipeline de entrada. Use o Analisador do pipeline de entrada para entender onde o pipeline de entrada é ineficiente.

Painel de pipeline de entrada

Para abrir o analisador de pipeline de entrada, selecione Perfil e, em seguida, selecione input_pipeline_analyzer na lista suspensa Ferramentas.

O painel mostra detalhes das análises do lado do dispositivo e do host.

Análise do dispositivo: mostra detalhes dos tempos de etapa do dispositivo.

  • Estatísticas da duração da etapa do dispositivo
  • Porcentagem do tempo de etapa do dispositivo aguardando dados de entrada

Análise no lado do host

Esta seção mostra os detalhes da análise do host divididos em várias categorias:

  • Enfileiramento de dados que serão transferidos para o dispositivo. Tempo gasto para colocar dados em uma fila de entrada antes de transferi-los para o dispositivo.
  • Pré-processamento de dados. Tempo gasto em operações de pré-processamento, como descompactação de imagens.
  • Leitura antecipada de dados de arquivos: tempo gasto na leitura de arquivos, incluindo armazenamento em cache, pré-busca e intercalação.
  • Leitura de dados de arquivos sob demanda: tempo gasto na leitura de dados de arquivos sem armazenamento em cache, pré-busca e intercalação.
  • Outras operações de leitura ou processamento de dados: tempo gasto em outras operações relacionadas à entrada que não usam tf.data.

imagem

Para ver as estatísticas de operações de entrada individuais e as respectivas categorias divididas por tempo de execução, expanda a seção Show Input Op statistics.

Será exibida uma tabela de dados de origem como a seguinte:

imagem

Cada entrada da tabela contém as seguintes informações:

  1. Operação de entrada: mostra o nome da operação de entrada do TensorFlow.
  2. Contagem: mostra o número total de instâncias da operação executadas durante o período de criação do perfil.
  3. Tempo total (em ms) mostra a soma cumulativa do tempo gasto em cada uma das instâncias de operação.
  4. Porcentagem de tempo total mostra o tempo total gasto em uma operação como uma fração do tempo total gasto no processamento das entradas.
  5. Tempo próprio total (em ms): mostra o tempo acumulado em todas as instâncias da função. O tempo próprio mede o tempo gasto no corpo da função, excluindo o tempo gasto em todas as funções que ele chama. Por exemplo, Iterator::PaddedBatch::Filter::ForeverRepeat::Map é chamado por Iterator::PaddedBatch::Filter. Portanto, o tempo próprio total é excluído do tempo próprio total deste último.
  6. Porcentagem de tempo próprio total: mostra o tempo próprio total como uma fração do tempo total gasto no processamento das entradas.
  7. Categoria: mostra a categoria de processamento da operação de entrada.

Perfil de operações

O perfil de operações é uma ferramenta do Cloud TPU que exibe as estatísticas de desempenho das operações do XLA executadas durante um período de criação de perfil. O perfil de operação mostra:

  • o uso que o aplicativo faz do Cloud TPU, com a porcentagem do tempo gasto em operações por categoria e de utilização de FLOPS de TPU;
  • as operações mais demoradas, que são alvos potenciais de otimização;
  • detalhes de operações individuais, incluindo forma, preenchimento e expressões que usam a operação.

Você pode usar o perfil de operações para encontrar destinos de otimização. Por exemplo, é possível usar o perfil de operação para identificar quais operações do XLA estão demorando mais tempo para serem executadas e quantos FLOPS de TPU elas consomem.

Como usar o perfil de operações

A ferramenta Perfil das operações contém estatísticas de desempenho das operações do XLA. Para visualizar os dados do Perfil das operações no TensorBoard, clique na guia Perfil na parte superior da tela e selecione op_profile no menu suspenso Ferramentas. Você verá uma tela como esta:

imagem

  1. Seção de visão geral: mostra o uso do Cloud TPU e dá sugestões de otimização.
  2. Painel de controle: contém controles que permitem definir o número de operações exibidas na tabela, quais operações são exibidas e como elas são classificadas.
  3. Tabela de operações: lista as principais categorias de operações do TensorFlow associadas às operações do XLA. Essas operações são classificadas por porcentagem de uso do Cloud TPU.
  4. Cards de detalhes das operações: mostra detalhes sobre as operações que aparecem quando você aponta para uma operação na tabela. Esses detalhes incluem a utilização de FLOPS, a expressão em que a operação é usada e o layout da operação (ajuste).

Tabela de operações do XLA

A tabela de operações lista as categorias de operações do XLA em ordem da porcentagem de uso do Cloud TPU mais alta para a mais baixa. A tabela mostra a porcentagem de tempo gasto, o nome da categoria da operação, o nome da operação do TensorFlow associado e a porcentagem de utilização de FLOPS da categoria. Para exibir (ou ocultar) as dez operações do XLA mais demoradas de uma categoria, clique no triângulo ao lado do nome da categoria na tabela.

imagem

  1. Tempo: mostra a porcentagem total de tempo gasto por todas as operações nessa categoria. Clique para expandir a entrada e ver o detalhamento do tempo gasto por cada operação individual.
  2. Dez principais operações: o botão ao lado do nome de uma categoria mostra/oculta as 10 principais operações demoradas dentro da categoria. Se uma entrada de operação de fusão for exibida na lista de operações, será possível expandi-la para ver as operações que não são de fusão, que ela contém.
  3. Operações do TensorFlow: mostra o nome da operação do TensorFlow associada à operação do XLA.
  4. FLOPS: mostra a utilização de FLOPS, que é o número medido de FLOPS expresso como porcentagem de FLOPS de pico do Cloud TPU. Quanto maior a porcentagem de utilização de FLOPS, mais rápida a execução das operações. A célula da tabela é codificada por cores: verde para alta utilização de FLOPS (boa) e vermelho para baixa utilização de FLOPS (ruim).

Cartões de detalhes de operações

Quando você seleciona uma entrada de tabela, um cartão é exibido com detalhes sobre a operação do XLA ou a categoria da operação. Um cartão costuma ter a seguinte aparência:

imagem

  • Nome e Categoria: mostram o nome e a categoria da operação do XLA em destaque.
  • Utilização de FLOPS: exibe a utilização de FLOPS como porcentagem do total de FLOPS possíveis.
  • Expressão: mostra a expressão do XLA que contém a operação.
  • Utilização da memória: exibe a porcentagem de pico de uso de memória pelo programa.
  • Layout (somente operações de convolução): mostra a forma e o layout de um tensor, incluindo uma descrição de qualquer preenchimento realizado pelo compilador XLA.

Como interpretar resultados

Para operações de convolução, a baixa utilização de FLOPS de TPU pode ocorrer devido a um destes motivos ou ambos:

  • Preenchimento (as unidades da matriz são usadas parcialmente).
  • A operação de convolução é vinculada à memória

Nesta seção, fornecemos uma interpretação de algumas métricas de desempenho de um modelo com baixa utilização de FLOP. Neste exemplo, a fusão e a convolução de saída dominaram o tempo de execução. Havia muitas operações vetoriais ou escalares com baixa utilização do FLOP.

Uma estratégia de otimização para esse tipo de perfil é transformar as operações vetoriais ou escalares em operações de convolução.

No exemplo a seguir, %convolution.399 tem menos FLOPS e utilização de memória do que %convolution.340, do exemplo anterior.

imagem

Nesse exemplo, o tamanho do lote está sendo preenchido para 128, e o tamanho do recurso está sendo preenchido para 8. Nesse caso, apenas 5% das unidades da matriz estão sendo usadas de maneira eficaz. A utilização é calculada por (((batch_time * num_of_features) / padding_size ) / num_of_cores). Compare os FLOPS deste exemplo com %convolution.340 no exemplo anterior, que não usa preenchimento.

Visualizador de traces

O visualizador de traces é uma ferramenta de análise de desempenho do Cloud TPU disponível na página Perfil. Ela usa o visualizador de perfil de evento de trace do Chrome para que funcione apenas no navegador Chrome.

O visualizador de traces contém uma linha do tempo que mostra:

  • As durações das operações que foram executadas pelo seu modelo do TensorFlow.
  • qual parte do sistema (TPU ou máquina host) executou uma operação. Normalmente, a máquina host executa operações de entrada, que pré-processam dados de treinamento e os transferem para a TPU, enquanto a TPU executa o treinamento real do modelo.

Com o visualizador de traces, é possível identificar problemas de desempenho no modelo e tomar medidas para resolvê-los. Por exemplo, de modo geral, é possível identificar se a alimentação ou treinamento de modelo está demorando mais do que isso. Em uma análise mais detalhada, é possível identificar quais operações do TensorFlow estão demorando mais para serem executadas.

O visualizador de traces é limitado a 1 milhão de eventos para cada Cloud TPU. Se você precisar avaliar mais eventos, use o visualizador de rastros em streaming.

Interface do visualizador de traces

Para abrir o visualizador de traces, acesse o TensorBoard, clique na guia Perfil na parte superior da tela e escolha trace_viewer na lista suspensa Ferramentas. O visualizador é exibido com a execução mais recente:

imagem

Essa tela contém os seguintes elementos principais, marcados com números na captura de tela anterior:

  1. Menu suspenso "Execuções": contém todas as execuções com capturas de informações de rastreamento. A visualização padrão é a execução mais recente, mas é possível abrir o menu suspenso para selecionar uma execução diferente.
  2. Menu suspenso "Tools": seleciona diferentes ferramentas de criação de perfil.
  3. Menu suspenso "Host": seleciona um host que contém um conjunto de Cloud TPU.
  4. Painel da linha do tempo: mostra as operações que o Cloud TPU e a máquina host executaram ao longo do tempo.
  5. Painel de detalhes: mostra mais informações sobre as operações selecionadas no painel "Linha do tempo".

Esta é uma visão mais detalhada do painel da linha do tempo:

imagem

O painel da linha do tempo contém os seguintes elementos:

  1. Barra superior: contém vários controles auxiliares.
  2. Eixo de tempo: mostra o tempo em relação ao início do trace.
  3. Rótulos de seção e faixa. Cada seção contém várias faixas e tem um triângulo à esquerda no qual você pode clicar para abrir e fechar a seção. Há uma seção para cada elemento de processamento do sistema.
  4. Seletor de ferramentas: contém várias ferramentas para interagir com o visualizador de traces.
  5. Eventos mostra o tempo em que uma operação foi executada ou a duração dos metaeventos, como etapas de treinamento.
  6. Barra de guias vertical: essa barra não tem uma finalidade útil para o Cloud TPU. A barra faz parte da ferramenta visualizador de rastros de uso geral fornecida pelo Chrome, que é usada para várias tarefas de análise de desempenho.

Seções e linhas

O visualizador de traces contém as seguintes seções:

  • Uma seção para cada nó da TPU, rotulada com o número do chip da TPU e o nó da TPU dentro do chip (por exemplo, "Chip 2: núcleo da TPU 1"). Cada seção de nó da TPU contém as seguintes faixas:
    • Etapa: mostra a duração das etapas de treinamento que foram executadas na TPU.
    • Operações do TensorFlow: mostra as operações do TensorFlow executadas na TPU.
    • Operações do XLA: mostra as operações do XLA que foram executadas na TPU. Cada operação é convertida em uma ou várias operações do XLA. O compilador XLA converte as operações do XLA em código que é executado na TPU.
  • Uma seção de linhas de execução na CPU do host, chamada "Linhas de execução de host". Esta seção contém uma faixa para cada thread da CPU. Observação: é possível ignorar as informações exibidas ao lado dos rótulos da seção.

Seletor de ferramenta da linha do tempo

É possível interagir com a visualização da linha do tempo usando o seletor de ferramentas da linha do tempo no TensorBoard. Clique em uma ferramenta da linha do tempo ou use os atalhos de teclado abaixo para ativar e destacar uma ferramenta. Para mover o seletor de ferramentas da linha do tempo, clique na área pontilhada na parte superior e arraste o seletor até o local desejado.

Use as ferramentas da linha do tempo da seguinte maneira:

Ferramenta de seleção
Clique em um evento para selecioná-lo ou arraste para selecionar vários eventos. O painel de detalhes exibe mais informações sobre os eventos selecionados (nome, horário de início e duração).

Ferramenta de panorama
Arraste para movimentar a visualização da linha do tempo na horizontal e na vertical.

Ferramenta de zoom
Arraste para cima ou para baixo para, respectivamente, aumentar ou diminuir o zoom ao longo do eixo horizontal (tempo). A posição horizontal do cursor do mouse determina o centro da área onde o zoom será aplicado.

Observação:se a ferramenta de zoom permanecer ativa depois que você soltar o botão do mouse, clique na visualização da linha do tempo para desativar o recurso.

Ferramenta de tempo
Arraste horizontalmente para marcar um intervalo de tempo. A duração do intervalo aparece no eixo do tempo. Para ajustar o intervalo, arraste as extremidades. Para limpar o intervalo, clique em qualquer lugar dentro da visualização da linha do tempo.

Se você selecionar outra ferramenta, o intervalo permanecerá marcado.

Visualizador de memória

O visualizador de memória permite visualizar o uso máximo de memória e as tendências de uso de memória do programa.

A interface do usuário do visualizador de memória tem esta aparência:

imagem

  1. Menu suspenso Host: seleciona um host de TPU e os módulos do otimizador de alto nível (HLO, na sigla em inglês) do XLA para visualizar.
  2. Visão geral da memória: mostra a alocação de memória de pico e o tamanho sem padding.
  3. Gráfico do espaço de trabalho: mostra o pico de uso de memória e um gráfico das tendências de uso de memória do programa. Aponte para um buffer em um dos gráficos de buffer para exibir mais informações no cartão de alocação.
  4. Gráficos de buffer: dois gráficos que mostram a alocação de buffer no pico de uso da memória. Aponte para um buffer em um dos gráficos do buffer para exibir mais informações no cartão de detalhes dele.
  5. Card de detalhes de alocação de buffer: mostra os detalhes de alocação de um buffer.

Painel de visão geral da memória

O painel de visão geral da memória (superior) mostra o nome do módulo e a alocação de memória de pico definida quando o tamanho total de alocação do buffer atinge o máximo. O tamanho da alocação de pico sem preenchimento também é mostrado para comparação.

imagem

Gráfico do espaço de trabalho

Este gráfico exibe o uso máximo de memória e um traçado das tendências de uso de memória do programa. A linha vertical indica o pico de utilização de memória no programa. Esse gráfico mostra se o programa pode caber no espaço de memória global disponível.

imagem

Cada ponto do gráfico representa um "ponto do programa" no programa HLO do XLA. A linha mostra como o uso da memória do programa muda ao longo do tempo.

Interação com elementos do gráfico de buffer

Quando você aponta para um buffer em gráficos de buffer, uma linha horizontal mostrando o ciclo de vida do buffer aparece no gráfico do espaço de trabalho.

imagem

A espessura da linha horizontal indica a magnitude relativa do tamanho do buffer em relação à alocação de memória de pico. O comprimento da linha indica a vida útil do buffer.

Gráficos de buffer

Dois gráficos mostram o detalhamento do uso de memória no pico de uso.

imagem

  • Por ordem de programa exibe os buffers da esquerda para a direita na ordem em que eles estavam ativos durante a execução do programa.

  • By Size: exibe os buffers que estavam ativos durante a execução do programa em ordem de tamanho decrescente.

Cartão de detalhes de alocação de buffer

Quando você aponta para um buffer exibido em um dos gráficos de buffer, um cartão de detalhes de alocação de buffer é exibido. Um cartão de detalhes costuma ter a seguinte aparência:

imagem

  1. Nome: nome da operação do XLA.
  2. Categoria: a categoria de operação.
  3. Tamanho: o tamanho da alocação do buffer (incluindo preenchimento).
  4. Tamanho não preenchido: o tamanho da alocação do buffer sem padding.
  5. Expansão: a magnitude relativa do tamanho do buffer preenchido em relação ao não preenchido.
  6. Memória extra: indica a quantidade de memória extra usada para preenchimento.
  7. Forma: descreve a classificação, o tamanho e o tipo de dados da matriz N-dimensional.
  8. Nome da operação do TensorFlow: mostra o nome da operação do TensorFlow associada à alocação do buffer.
  9. Tipo de alocação: indica a categoria de alocação do buffer: parâmetro, saída, linha de execução local e temporária (por exemplo, alocação de buffer em uma fusão).

erros de falta de memória

Se você executar um modelo e receber um erro de "falta de memória", use as diretrizes deste documento para capturar um perfil. Aguarde até que o script esteja treinando o modelo antes de iniciar o criador de perfil. A saída da criação do perfil pode ajudar você a entender a causa do erro.