Ferramentas do Cloud TPU

Neste documento, você encontra informações sobre como executar várias ferramentas do Cloud TPU.

Pré-requisitos

Antes de usar as ferramentas neste guia, é necessário concluir os pré-requisitos a seguir:

Criar uma VM do Compute Engine e um recurso de TPU

Antes de usar as ferramentas neste guia, crie uma instância de VM do Compute Engine usando a imagem tf-1-8 na família ml-images. Além disso, crie um recurso do Cloud TPU. Leia e execute todo o guia de início rápido do Cloud TPU para ver as instruções.

Configurar o TensorBoard

Você usará o TensorFlow em operações computacionais que podem ser complexas e confusas, como o treinamento de uma enorme rede neural profunda. Para facilitar a compreensão, a depuração e a otimização dos programas do TensorFlow, incluímos um pacote de ferramentas de visualização chamado TensorBoard. Você pode usar o TensorBoard para visualizar seu gráfico do TensorFlow, assinalar métricas quantitativas sobre a execução do gráfico e mostrar outros dados, como imagens que passam por ele. Para mais detalhes, siga os tutoriais disponíveis em tensorflow.org.

Para usar o TensorBoard com o TensorFlow e o Cloud TPU, você precisa fazer algumas coisas.

  1. Conecte-se à VM do Compute Engine usando o comando gcloud compute ssh com encaminhamento de portas para o TensorBoard. Substitua tpu-demo-vm pelo nome do seu nó de TPU:

    gcloud compute ssh tpu-demo-vm -- -L 6006:localhost:6006
    
  2. Verifique se o TensorBoard está instalado em seu sistema:

    (vm)$ pip freeze | grep tensorboard
    (vm)$ sudo pip install --upgrade "tensorboard>=1.8"
    
  3. Configure um diretório model_dir. As APIs Estimators (e TPU Estimators) fazem o trabalho pesado de integrar com TensorBoard para você. No entanto, primeiro é necessário configurá-las. Quando você criar um estimador, forneça um caminho para um diretório no seu intervalo do Cloud Storage para salvar metadados sobre o modelo.

    (vm)$ export STORAGE_BUCKET=gs://[YOUR-BUCKET-NAME]
    (vm)$ export model_dir=${STORAGE_BUCKET}/output
    
  4. Siga o tutorial do MNIST para configurar e executar um treinamento do modelo MNIST:

    (vm)$ python /usr/share/models/official/mnist/mnist_tpu.py \
          --tpu=$TPU_NAME \
          --data_dir=${STORAGE_BUCKET}/data \
          --model_dir=$model_dir \
          --use_tpu=True \
          --iterations=500 \
          --train_steps=1000
    
  5. Execute o TensorBoard e indique o diretório do seu modelo:

    (vm)$ tensorboard --logdir=${model_dir}
    
  6. Abra o TensorBoard no navegador em sua estação de trabalho local. Acesse http://localhost:6006 para visualizar o TensorBoard. Você verá o gráfico XLA do seu modelo na guia Graph. Como você ainda não capturou um perfil de TPU, não conseguirá ver as ferramentas do criador de perfil.

Instalar o Cloud TPU Profiler

É necessário ter cloud-tpu-profiler == 1.7.0 instalado no sistema para capturar um perfil de TPU:

(vm)$ pip freeze | grep cloud-tpu-profiler
(vm)$ sudo pip install --upgrade "cloud-tpu-profiler==1.7.0"

Como capturar informações de rastreamento

Antes de usar as ferramentas, é necessário capturar as informações de rastreamento durante a execução do modelo. Execute o comando abaixo na VM para capturar as informações de rastreamento:

(vm)$ capture_tpu_profile --tpu=$TPU_NAME --logdir=${model_dir}

Por padrão, esse comando captura um rastreamento de dois segundos. Você pode definir a duração do rastreamento com a opção de linha de comando duration_ms. Abra o TensorBoard no seu navegador local novamente. Você verá a guia Profile.

Página de visão geral

A página de visão geral fornece uma visão de nível superior do desempenho da carga de trabalho durante a execução dela na TPU. A página exibe dados nos seguintes painéis:imagem

  • Resumo do desempenho, que inclui:

    • o duração média da etapa calculada de acordo com todos as etapas que constituíram a amostra;
    • a porcentagem do tempo ocioso do host;
    • a porcentagem do tempo ocioso de TPU;
    • a utilização percentual das unidades matriciais de TPU.
  • Gráfico de duração da etapa, que representa um gráfico da duração da etapa (em milésimos de segundo) calculado de acordo com todos as etapas que constituíram a amostra. A área azul corresponde à parte do duração da etapa que representa a espera pelos dados de entrada do host e a área laranja corresponde ao tempo de computação.

  • Dez principais operações do TensorFlow na TPU, que mostra as operações do TensorFlow executadas na TPU que consumiram mais tempo. Ao clicar no botão "Mostrar", é exibida uma tabela semelhante a esta:imagemCada linha mostra o próprio tempo (como uma porcentagem do tempo gasto por todas as operações), o tempo cumulativo, a categoria, o nome e a taxa de operações de ponto flutuante por segundo (FLOPS, na sigla em inglês) atingida na operação.

  • Ambiente de execução, que inclui:

    • o número de hosts usados;
    • o tipo de TPU usada;
    • o número de núcleos de TPU;
    • o tamanho do lote de treinamento.
  • Recomendação para as próximas etapas, que informa se a carga de trabalho é limitada por entrada e, em caso afirmativo, sugere as ferramentas que você pode usar para reduzir o gargalo, dependendo se o problema está no tempo de entrada, no tempo de TPU ou em ambos.

Gráficos do XLA

Enquanto um modelo é compilado, ele também gera um gráfico que representa o programa de álgebra linear acelerada (XLA, na sigla em inglês) observado nos dispositivos de TPU. O gráfico é copiado para o diretório model_dir e pode ser encontrado na guia "Gráficos" do TensorBoard.

Um nó no gráfico representa uma instrução do XLA. Se uma instrução do XLA (por exemplo, "add") for baixada de uma operação do TensorFlow (por exemplo, x/y/z), ela será mostrada como x/y/z/add no gráfico.

O gráfico XLA pode fornecer mais informações sobre como uma TPU está executando um modelo específico e quais são as formas de entradas e saídas das diferentes operações. Em conjunto com o Visualizador de rastreamento, isso pode oferecer insights sobre o que consome a maior parte do tempo de execução.

imagem

Observações:

  • Nem todas as instruções do XLA têm operações do TensorFlow correspondentes (por exemplo, as instruções injetadas pelo compilador do XLA). Portanto, alguns nós não têm namespaces do TensorFlow.
  • A estrutura do programa do TensorFlow é incorporada no gráfico do XLA sempre que possível. No entanto, o programa do XLA em execução nos dispositivos de TPU é altamente otimizado. Portanto, a estrutura do gráfico pode ser muito diferente do programa original do TensorFlow.
  • Existe uma instrução do XLA especial chamada fusion. Essa instrução pode mesclar várias instruções de diferentes operações do TensorFlow em um único cálculo. A operação do TensorFlow correspondente à instrução raiz na fusão é usada como o namespace de toda a operação de fusão.

Verificador de compatibilidade com TPU

O visualizador de gráficos do TensorBoard inclui o Verificador de compatibilidade com TPU, uma ferramenta que indica operações do TensorFlow possivelmente problemáticas durante a compilação de um modelo para uso de TPU. A ferramenta verifica o gráfico do TensorFlow do modelo procurando as operações que atualmente não estão disponíveis na TPU.

Pré-requisitos

  • Configure seu modelo para gravar o gráfico do modelo em um arquivo. Se você estiver usando a API tf.estimator, configure a propriedade model_dir da Estimador.
  • O Verificador de compatibilidade com TPU não verifica as operações que foram atribuídas explicitamente a um dispositivo de não TPU por meio da colocação manual do dispositivo. Por exemplo, as operações explicitamente atribuídas a uma GPU são ignoradas. Se esse for seu caso, remova as colocações manuais de todas as operações que você pretende executar na TPU.

Como usar o Verificador de compatibilidade com TPU

Para acessar o Verificador de compatibilidade com TPU, abra a guia Gráficos no TensorBoard. Observe que é possível fazer upload e verificar o gráfico de qualquer modelo clicando no botão Escolher arquivo. No painel de configuração à esquerda, vá para a seção Cor e selecione a opção Compatibilidade com TPU:

imagem

O gráfico do modelo aparecerá como o abaixo. Usamos como exemplo o tutorial do Abalone:

imagem

As operações compatíveis com TPU ficam em verde, enquanto as incompatíveis recebem a cor vermelho. Os nós do gráfico que contêm operações compatíveis e incompatíveis mostram ambas as cores na proporção correspondente à porcentagem de operações compatíveis e incompatíveis.

O lado direito da tela exibe um resumo de compatibilidade:

imagem

O percentual na parte superior expressa a porcentagem de todas as operações compatíveis com TPU. Abaixo desse valor, há uma lista de operações que não são compatíveis. Clique em uma das operações para selecioná-la na visualização principal do gráfico e expandir os nós conforme o necessário para tornar a operação visível.

Como interpretar os resultados

O exemplo do Abalone mostra como interpretar os resultados do Verificador de compatibilidade com TPU. Veja novamente o resumo de compatibilidade:

imagem

Apenas como exemplo, mostramos um resumo de compatibilidade teórico que tem várias operações indisponíveis.

Quando esse modelo foi executado, não havia qualquer colocação de dispositivo especificada. Como resultado, o Verificador de compatibilidade verificou todas as operações, mesmo aquelas que sempre precisariam ser executadas na CPU. As várias operações "save" e "report_uninitialized_variables" definitivamente se enquadram nessa categoria.

Assim, sobram três operações que são possivelmente problemáticas: "GradientDescent" e as duas "AssignAdd" em "root_mean_squared_error".

Vamos dar uma olhada no nó "GradientDescent":

imagem

A operação incompatível é uma "AssignAdd" que atualiza a contagem global de etapas. Essa operação normalmente é executada na CPU. Portanto, não é uma preocupação.

Passando para "root_mean_squared_error", vemos no código-fonte que ela é usada apenas como uma métrica de avaliação extra:

# Calculate root mean squared error as additional eval metric
eval_metric_ops = {
    "rmse": tf.metrics.root_mean_squared_error(
        tf.cast(labels, tf.float64), predictions)
}

Como essa operação não faz parte do loop de treinamento, ela também pode ser executada na CPU e, portanto, também não é uma preocupação. Concluímos, então, que esse modelo está pronto para ser executado em uma TPU.

Visualizador de rastreamento

O Visualizador de rastreamento é uma ferramenta de análise de desempenho integrada ao TensorBoard. O Visualizador de rastreamento contém uma linha do tempo que mostra:

  • a duração das várias operações executadas no 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 alimentação, que realizam o pré-processamento dos dados de treinamento e os transferem para a TPU, enquanto a TPU executa o treinamento do modelo de fato.

Com o Visualizador de rastreamento, é possível identificar problemas no desempenho do modelo e, em seguida, tomar as providências para solucioná-los. Por exemplo, de modo geral, você pode identificar se a alimentação ou o treinamento do modelo está tomando a maior parte do tempo. Em uma análise mais detalhada, é possível identificar quais operações do TensorFlow estão demorando mais para serem executadas.

Visão geral da interface do usuário

Para abrir o Visualizador de rastreamento, acesse o TensorBoard e clique na guia "Perfil" na parte superior da tela. Você verá algo como:

imagem

Essa tela contém os seguintes elementos principais (marcados acima com números):

  1. Um menu suspenso Execuções que contém todas as execuções com captura das informações de rastreamento. Por padrão, o Visualizador de rastreamento abre a execução mais recente. Você pode abrir o menu suspenso para selecionar uma execução diferente.
  2. Um menu suspenso Ferramentas, em que é possível selecionar ferramentas de criação de perfil diferentes.
  3. Um menu suspenso Host, em que é possível selecionar TPUs diferentes para ver o rastreamento em cada uma delas.
  4. Um painel Linha do tempo, que mostra as operações que a TPU e a máquina host executaram ao longo do tempo.
  5. Um painel Detalhes, que mostra outras informações sobre as operações selecionadas no painel "Linha do tempo".

Esta é uma visão mais detalhada do painel "Linha do tempo":

imagem

O painel "Linha do tempo" contém os seguintes elementos:

  1. Uma barra superior, que contém vários controles auxiliares.
  2. Um eixo de tempo, que mostra o tempo em relação ao início do rastreamento.
  3. Rótulos de seção e faixa. Cada seção contém várias faixas. Clique no triângulo à esquerda para expandir e recolher a seção. Há uma seção para cada elemento de processamento no sistema. Explicaremos o que são seções e faixas com mais detalhes abaixo.
  4. Um seletor de ferramentas, que contém várias ferramentas para interagir com o Visualizador de rastreamento.
  5. Eventos. Esse elemento mostra o tempo de execução de uma operação ou a duração dos metaeventos, como as etapas de treinamento.
  6. Uma barra vertical de guias. Esse elemento não tem uma finalidade útil para TPUs. Essa barra existe porque o Visualizador de rastreamento é uma ferramenta de uso geral fornecida pelo Chrome utilizada para realizar várias tarefas de análise de desempenho. Discutiremos mais sobre seções, faixas e eventos em seguida porque são esses os elementos que ocuparão a maior parte do seu tempo.

Seções e faixas

O Visualizador de rastreamento contém as seguintes seções:

  • Uma seção para cada nó de TPU, rotulada com o número do chip de TPU e o nó dentro do chip (por exemplo, "Chip 2: TPU Core 1"). Cada seção de nó de TPU contém as seguintes faixas:
    • Etapa: essa faixa mostra a duração das etapas de treinamento que foram executados na TPU.
    • Operações do TensorFlow: operações do TensorFlow executadas na TPU.
    • Operações do XLA: operações do XLA. Cada operação do TensorFlow é traduzida em uma ou várias operações do XLA. O compilador do XLA converte as operações do XLA em código que é executado na TPU.
  • Uma seção extra para threads em execução na CPU da máquina host, rotulada como "Threads de host". Esta seção contém uma faixa para cada thread da CPU. Observação: são exibidas outras informações ao lado dos rótulos da seção (por exemplo, "n-e93653ba-w-0" e "pid 49"). Isso tem motivos internos e pode ser ignorado.

Seletor de ferramentas

Esse seletor contém ferramentas que você pode usar para interagir com a visualização da linha do tempo. Clique em uma ferramenta para ativá-la ou use os atalhos de teclado abaixo. A ferramenta ativa no momento será destacada. Você pode mover o seletor de ferramentas pela tela, clicando nele e arrastando-o na área pontilhada na parte superior.

O que cada ferramenta faz:

Ferramenta Seleção
Clique em um evento para selecioná-lo. Clique e arraste para selecionar vários eventos. Mais informações sobre os eventos selecionados (nome, horário de início e duração) serão exibidas no painel de detalhes.

Ferramenta Movimentar
Clique e arraste para movimentar a visualização da linha do tempo na horizontal e na vertical.

Ferramenta Zoom
Clique e 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 de onde o zoom será aplicado.

Observação: a ferramenta Zoom tem um bug conhecido que deixa o zoom ativado se o botão do mouse for liberado enquanto o cursor estiver do lado de fora da visualização da linha do tempo. Se isso acontecer, basta clicar brevemente na visualização da linha de tempo para parar o zoom.

Ferramenta Tempo
Clique e 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.

Observe que o intervalo permanece marcado se você selecionar uma das outras ferramentas.

Eventos

Os eventos têm cores diferentes para facilitar a distinção visual. As cores em si não têm significado específico.

Barra superior (painel Linha do tempo)

A barra superior do painel "Linha do tempo" contém vários controles auxiliares:

imagem

  1. Exibição de metadados: não é usado para TPUs.
  2. Opções de visualização: não é usado para TPUs.
  3. Caixa de pesquisa: digite um texto para pesquisar todos os eventos com esse texto no nome. Clique nos botões de seta à direita da caixa de pesquisa para avançar e recuar pelos eventos correspondentes, selecionando cada um por vez.
  4. Botão Console: não usado para TPUs.
  5. Botão Ajuda: clique para exibir um resumo da ajuda rápida.

Atalhos do teclado

Eis aqui alguns atalhos do teclado que você pode usar no Visualizador de rastreamento. Clique no botão "Ajuda" na barra superior para ver mais atalhos.

w Zoom in
s Zoom out
a Pan left
d Pan right
f Zoom to selected event(s)
m Mark time interval for selected event(s)
1 Activate selection tool
2 Activate pan tool
3 Activate zoom tool
4 Activate timing tool

O atalho da tecla f pode ser especialmente útil. Selecione uma etapa e pressione f para aumentar o zoom.

Eventos característicos

Veja abaixo alguns tipos de eventos importantes para a análise do desempenho da TPU.

imagem

  • InfeedDequeueTuple: essa operação do TensorFlow é executada na TPU e recebe dados de entrada provenientes do host. Se essa operação estiver demorando muito, isso pode significar que as operações do TensorFlow que fazem o pré-processamento dos dados na máquina host não conseguem acompanhar a taxa de consumo de dados da TPU. Você pode ver os eventos correspondentes nos rastreamentos do host nomeados InfeedEnqueueTuple. Também é possível analisar mais detalhadamente o canal de entrada usando a ferramenta Analisador do canal de entrada.

  • CrossReplicaSum: essa operação do TensorFlow é executada na TPU e calcula uma soma entre as réplicas. Como cada réplica corresponde a um nó de TPU diferente, essa operação precisa aguardar que todos os nós de TPU terminem uma etapa. Se você notar que essa operação está demorando muito, isso normalmente não significa que a soma em si é lenta, mas que o nó de TPU está aguardando algum outro nó. Geralmente, isso ocorre porque os outros nós de TPU foram atrasados por uma alimentação de dados lenta.

imagem

  • Operações do conjunto de dados: ao carregar os dados com a API Dataset, o Visualizador de rastreamento visualizará todas as operações do conjunto de dados. No exemplo acima, Iterator::Filter::Batch::ForeverRepeat::Memory é compilado e corresponde à operação dataset.map(). Verificar essas operações no Visualizador de rastreamento é muito útil para depurar e atenuar os gargalos no canal de entrada.

imagem

  • Threads de pré-busca: use dataset.prefetch() para armazenar em buffer os dados de entrada. Essa técnica evita lentidões esporádicas no acesso a arquivos que criam um gargalo no canal de entrada. Os threads de pré-busca são exibidos no Visualizador de rastreamento quando as operações do dataset.prefetch() são capturadas.

O que pode dar errado

Fique atento a estas possíveis "armadilhas" ao usar o Visualizador de rastreamento:

  • Limite de exibição de eventos: o Visualizador de rastreamento exibe um milhão de eventos no máximo. Se você capturou mais eventos, apenas os um milhão de eventos mais antigos serão exibidos. Os eventos mais recentes serão descartados. Para capturar mais eventos de TPU, você pode solicitar explicitamente que capture_tpu_profile exclua as operações do conjunto de dados com a sinalização --include_dataset_ops=False.
  • Eventos muito longos: se um evento for começado antes do início da captura ou finalizado após o término dela, ele não será visível no Visualizador de rastreamento. Isso significa que eventos muito longos podem ser ignorados.
  • Quando iniciar a captura de rastros: se você iniciar a captura de rastros muito cedo, a TPU poderá ainda estar inicializando e você verá nenhum ou poucos eventos. Você pode adicionar a sinalização --duration_ms e/ou --num_tracing_attempts para aumentar a duração de criação do perfil e automaticamente repetir a coleta de rastros quando não houver qualquer evento de rastreamento coletado:

    (vm)$ capture_tpu_profile --tpu=$TPU_NAME
    --logdir=${model_dir} --duration_ms=60000 --num_tracing_attempts=10
    

Perfil das operações

O TensorBoard também contém o Perfil das operações, uma ferramenta que exibe as estatísticas de desempenho das operações do XLA que foram executadas durante o período de criação do perfil. O Perfil das operações mostra:

  • como o aplicativo usa a TPU. A utilização de FLOPS de TPU informada é definida como o número mensurado de operações de ponto flutuante por segundo (FLOPS, na sigla em inglês) normalizadas para o valor máximo de FLOPS disponível na TPU;
  • as operações mais demoradas. Essas operações são candidatas em potencial para otimização;
  • detalhes de operações individuais, incluindo forma, preenchimento e expressão.

O Perfil das operações fornece insights sobre como o modelo usa a TPU, além de ajudar a encontrar operações candidatas à otimização. Por exemplo, se o modelo atingir apenas 5% do valor máximo de FLOPS da TPU, você poderá fazer uma busca detalhada e identificar quais operações do XLA estão demorando mais para serem executadas e quantos FLOPS da TPU elas consomem.

Como usar o Perfil das operações

Ao coletar um perfil, capture_tpu_profile também coleta um arquivo op_profile.json que contém as estatísticas de desempenho das operações do XLA. Para abrir o Perfil das operações, acesse o TensorBoard e clique na guia Perfil na parte superior da tela. Selecione op_profile na lista suspensa Ferramentas. Você verá algo como:

imagem

  1. Uma seção de visão geral, que mostra a utilização geral da TPU e a operação que leva mais tempo na duração do perfil. A ferramenta também informa a eficiência da operação no uso do potencial computacional do chip, além de fornecer sugestões de otimização.
  2. Um painel de controle. Deslize a barra à esquerda para selecionar quantas operações serão exibidas em cada categoria do XLA. Você também pode alternar o botão à direita para listar apenas operações dentro de 90% do tempo total de execução.
  3. Uma tabela de operações, que lista as operações do XLA por categoria e as classifica em ordem decrescente por tempo gasto.
  4. Cartões de detalhes das operações. Ao passar o cursor do mouse sobre uma entrada da tabela, aparecerá um cartão mostrando mais detalhes sobre a operação como, por exemplo, a utilização de FLOPS, a expressão do XLA e o layout.

Tabela de operações

Cada entrada na tabela contém várias colunas. Também há um triângulo à esquerda de cada uma em que você pode clicar para expandir e reduzir a entrada. Há uma entrada para cada categoria de operação. Em cada uma, a tabela mostra o tempo, o nome da categoria da operação, o nome da operação do TensorFlow associada e a utilização de FLOPS.

imagem

  1. Tempo: mostra a porcentagem total do tempo gasto por todas as operações na categoria. Você pode clicar para expandir a entrada e ver o detalhamento do tempo gasto por cada operação individual.
  2. Barra horizontal: oferece uma visualização da distribuição do tempo entre as categorias.
  3. Dez principais operações: ao clicar para expandir cada categoria, são listadas as dez principais operações que levam mais tempo. Você pode expandir ainda mais uma entrada de operação "fusion" para ver as operações incluídas nela que tem elementos que não são de "fusion".
  4. Operações do TensorFlow: mostra o nome da operação do TensorFlow associada à operação do XLA.
  5. FLOPS: mostra a utilização de FLOPS, que é o valor de FLOPS mensurado normalizado para o valor máximo de FLOPS do dispositivo. O melhor é ter uma utilização de FLOPS mais elevada porque isso significa que as operações são executadas rapidamente. 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 da operação

Ao passar o cursor do mouse sobre uma entrada da tabela, aparecerá um cartão à esquerda informando mais detalhes sobre a operação do XLA a categoria da operação. Normalmente, um cartão tem a seguinte aparência:

imagem

  1. Nome: mostra o nome da operação do XLA.
  2. Categoria: mostra a categoria da operação.
  3. Utilização de FLOPS: inclui o valor e uma barra de progresso codificada por cores.
  4. Utilização de memória: mostra a porcentagem de largura de banda de memória consumida durante a execução da operação.
  5. Expressão: mostra a expressão do XLA da operação.
  6. Layout (opcional): mostra a forma e o layout de um tensor. Observe que o layout é mostrado apenas para as operações de convolução. A ferramenta também mostra se a forma do tensor se ajusta exatamente às unidades da matriz e como ela é preenchida.

Como interpretar os resultados

Nesta seção, fornecemos uma interpretação rápida dos números mostrados no exemplo acima para fins ilustrativos. No geral, o modelo atinge 8,1% dos maiores FLOPS que podem ser alcançados pelo dispositivo. Alimentação e soma de réplicas cruzadas são predominantes no tempo de execução, mas também há uma longa série de operações vetoriais ou escalares com valor de FLOPS muito baixo. Uma estratégia de otimização é melhorar o canal de entrada do modelo usando a ferramenta Analisador do canal de entrada.

Nas operações de convolução, a utilização de FLOPS da TPU também pode ser baixa devido aos seguintes motivos:

  • Preenchimento: as unidades da matriz são usadas apenas parcialmente.
  • A operação de convolução é limitada pela memória.

No exemplo a seguir, %convolution.399 mostra menor utilização de FLOPS do que %convolution.395 no exemplo anterior.

imagem

Analisando o layout mais detalhadamente, há um preenchimento de 16 a 128, o que indica que apenas metade das unidades da matriz são usadas de fato. Portanto, em comparação ao caso anterior que tem um ajuste exato, a utilização de FLOPS é muito menor.

Em outro exemplo %reduce mostra uma utilização de FLOPS menor porque a largura de banda de memória foi totalmente usada.

imagem

Analisador do canal de entrada

O TensorBoard fornece uma ferramenta poderosa para analisar o canal de entrada do TensorFlow. Quando um programa do TensorFlow lê dados de arquivos, isso acontece no início do gráfico do TensorFlow de uma maneira segmentada. O processo de leitura é dividido em vários estágios de processamento de dados conectados em série, em que a saída de um estágio é a entrada do próximo. Esse processo de leitura de arquivos é chamado de canal de entrada.

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

  1. leitura de arquivos
  2. pré-processamento de arquivos (opcional)
  3. transferência do arquivo da máquina host para o dispositivo

Um canal de entrada ineficiente pode tornar o aplicativo drasticamente lento. Dizemos que um aplicativo é limitado pela entrada quando uma parte significativa do tempo é passada no canal de entrada. Essa ferramenta apresenta uma análise detalhada do desempenho do canal de entrada com base em vários dados de desempenho coletados. Em um nível geral, a ferramenta informa se o programa é limitado pela entrada. Se esse for o caso, a ferramenta também pode orientar você na análise do dispositivo e do host para fazer a depuração no estágio do canal em que está o gargalo.

Visão geral da interface do usuário

A ferramenta "Analisador do canal de entrada" lê os resultados da análise do desempenho de um arquivo input_pipeline.json que também é coletado por capture_tpu_profile. Para abrir o Analisador do canal de entrada, selecione input_pipeline_analyzer na lista suspensa Ferramentas. A análise contém três seções:

imagem

  1. Resumo: informa a análise geral do canal de entrada, isto é, se o aplicativo é limitado pela entrada e o quanto.
  2. Análise no lado do dispositivo: mostra os resultados detalhados da análise no lado do dispositivo, incluindo a duração da etapa do dispositivo e o tempo gasto na espera dos dados de entrada.
  3. Análise no lado do host: mostra a análise detalhada no lado do host, incluindo um detalhamento do tempo de processamento de entradas no host e uma visualização tabular dos detalhes de cada operação de entrada.

Como saber se o aplicativo é limitado pela entrada

A Seção 1 é um resumo da análise geral. Ela informa se o programa de TPU está limitado pela entrada e o quanto (em termos de porcentagem do tempo que o dispositivo gasta aguardando pelas entradas do host). Além disso, se você estiver usando um canal de entrada padrão que tenha sido instrumentado, a ferramenta informará como a maior parte do tempo de processamento de entrada é gasto. Por exemplo:

imagem

Análise no lado do dispositivo

A Seção 2 mostra os detalhes da análise no lado do dispositivo, que fornece insights sobre quanto tempo é gasto no dispositivo em comparação ao host, bem como quanto tempo o dispositivo gasta aguardando pelos dados de entrada do host.

imagem

  1. Duração da etapa traçada em relação ao número de etapas: traça um gráfico da duração da etapa (em milésimos de segundo) do dispositivo ao longo de todas as etapas que constituíram a amostra. A área azul corresponde à parte da duração da etapa que está aguardando os dados de entrada do host, enquanto a área laranja corresponde à duração sem entrada.
  2. Estatísticas de duração da etapa: informa a média, o desvio padrão e o intervalo ([mínimo, máximo]) da duração da etapa do dispositivo.
  3. Intervalo de tempo de espera dos dados de entrada traçado em relação ao número de etapas: traça um gráfico de linhas que mostra a fração do tempo que dispositivo aguarda o processamento dos dados de entrada (normalizado para a duração de etapas total do dispositivo) em todas as etapas. Observe que a fração do tempo gasto varia de acordo com o núcleo de TPU. Portanto, além da fração média entre todos os núcleos, o intervalo das frações para núcleos diferentes também é traçado para cada etapa. Idealmente, esse intervalo deve ser o menor possível porque o tempo final de cada etapa é determinado pelo núcleo mais lento.
  4. Fração do tempo de espera pelos dados de entrada: informa a média, o desvio padrão e o intervalo ([mínimo, máximo]) da fração de tempo que o dispositivo aguarda os dados de entrada normalizados para a duração de etapas total do dispositivo.

Análise no lado do host

A Seção 3 mostra os detalhes da análise no lado do host sobre o tempo de processamento de entrada (o tempo gasto em operações da API Dataset) no host em várias categorias:

  • Leitura de dados de arquivos sob demanda: o tempo gasto na leitura de dados de arquivos sem armazenamento em cache, pré-busca e intercalação.
  • Leitura antecipada de dados de arquivos, incluindo armazenamento em cache, pré-busca e intercalação.
  • Pré-processamento de dados, por exemplo, descompactação da imagem.
  • Enfileiramento de dados a serem transferidos para o dispositivo: normalmente chamado pelo TensorFlow para colocar os dados em uma fila de alimentação antes de transferi-los para o dispositivo.

imagem

Se você quiser ver as estatísticas e as categorias de cada operação de entrada no detalhamento do tempo de execução, clique no botão "Mostrar estatísticas das operações de entrada". Você verá uma tabela como esta:

imagem

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

  1. Operação de entrada: mostra o nome da operação do TensorFlow da operação de entrada.
  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: mostra a soma cumulativa do tempo total real gasto em cada uma das instâncias.
  4. Porcentagem do tempo total: mostra o tempo total gasto na operação como uma fração do tempo total gasto no processamento das entradas.
  5. Tempo próprio total: mostra a soma cumulativa do tempo próprio gasto em cada uma das instâncias. O tempo próprio mede o tempo gasto no corpo da função, excluindo o tempo gasto na função que a chama. Por exemplo, Iterator::PaddedBatch::Filter::ForeverRepeat::Map é chamada por Iterator::PaddedBatch::Filter. Portanto, o tempo próprio total daquela é excluído do tempo próprio total desta.
  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: corresponde às categorias definidas acima para o detalhamento.

Visualizador de memória

O Visualizador de memória permite visualizar o uso máximo da memória pelo programa, bem como as tendências do uso da memória durante a vida útil do programa.

A IU do Visualizador de memória tem esta aparência:

imagem

  1. Um menu suspenso Hosts em que é possível selecionar a TPU e o módulo do XLA a serem visualizados.
  2. Uma seção de visão geral que mostra a alocação do valor máximo de uso da memória e o tamanho sem preenchimento.
  3. Um gráfico de linhas de uso de memória que mostra as tendências de uso da memória durante a vida útil do programa.
  4. Duas exibições na parte inferior que mostram o detalhamento do uso de memória no ponto máximo (dado pela linha barra vertical no gráfico superior).
  5. Um cartão de detalhes da operação. Ao passar o cursor do mouse sobre um buffer de detalhamento nas exibições na parte inferior, aparecerá um cartão à esquerda com mais detalhes sobre a operação. Por exemplo, o cartão mostra o tamanho da alocação de memória, o tamanho não preenchido, a forma, o nome da operação do TensorFlow e o tipo de alocação.

Seção de visão geral

A parte superior desta seção mostra o nome do módulo e a alocação do pico da memória quando o tamanho total de alocação do buffer atinge o máximo. O tamanho de alocação de pico não preenchido também é mostrado em uma fonte menor para dar uma ideia da quantidade de memória extra que é consumida devido ao preenchimento.

Gráfico de linhas de uso de memória

imagem

A exibição na parte superior mostra as tendências no uso da memória durante a vida útil do programa. A barra vertical no gráfico indica o ponto no programa com utilização máxima da memória.

Cada ponto do gráfico representa um "ponto do programa" no otimizador de alto nível (HLO, na sigla em inglês) do XLA, conforme agendado pelo compilador.

Este gráfico de comparação com os pontos do programa na parte superior serve apenas para dar uma ideia da progressão de picos antes e depois do uso máximo. Como apenas o uso máximo realmente importa, de fato é ele que determina se um programa pode ou não caber no espaço de memória global disponível.

Exibições na parte inferior

Abaixo da exibição na parte superior há duas exibições que mostram o detalhamento do uso de memória no ponto de pico do programa (dado pela barra vertical no gráfico superior).

A exibição "Por ordem de programa" mostra os buffers na ordem em que eles estavam ativos durante a execução do programa. Então, se você estiver interessado em saber quais buffers estavam ativos por mais tempo, veja o lado esquerdo dessa exibição.

A exibição "Por tamanho" mostra os buffers por ordem decrescente de tamanho para que você possa ver quais causam maior impacto no ponto de pico de uso da memória.

Cartão de detalhes do buffer e período de vida útil

Ao passar o cursor do mouse sobre os detalhamentos do buffers nessas exibições, aparecerá um cartão à esquerda com mais informações sobre a alocação do buffer. Um cartão típico tem a seguinte aparência:

imagem

  • Nome: mostra o nome da operação do XLA.
  • Categoria: mostra a categoria da operação.
  • Tamanho: mostra o tamanho da alocação do buffer (incluindo preenchimento).
  • Tamanho não preenchido: mostra o tamanho da alocação do buffer sem preenchimento.
  • Expansão: a magnitude relativa do tamanho do buffer preenchido versus o tamanho não preenchido. Essa métrica indica a quantidade de memória extra que é usada para preenchimento.
  • Forma: descreve a classificação, o tamanho e o tipo de dados de um arranjo n-dimensional.
  • Nome da operação do TF: mostra o nome da operação do TensorFlow associada à alocação.
  • Tipo de alocação: categoriza as alocações de buffer nos tipos: Parâmetro, Saída, Thread local e Temporária (por exemplo, alocação do buffer dentro de uma "fusion").

imagem

Ao passar o cursor do mouse sobre os detalhamentos do buffers, também é possível observar uma magnitude relativa do tamanho do buffer versus o pico no gráfico de linhas de uso de memória. O retângulo colorido indica o tempo de vida do buffer, sendo que o limite esquerdo é o ponto do programa quando o buffer é alocado e o limite direito é o ponto do programa quando o buffer é liberado.

Como depurar erros de memória

DICAS: você pode usar o Cloud TPU Profiler 1.7.0 para capturar um perfil de memória quando o seu for incapaz de compilar. Basta executar o comando a seguir depois que sua compilação falhar.

(vm)$ capture_tpu_profile --tpu=$TPU_NAME --logdir=${model_dir}

Visualizador de rastreamento em streaming

O Visualizador de rastreamento acima tem limite de um milhão de eventos por rastreamento. Para que seja possível visualizar mais eventos, foi adicionado um novo recurso chamado Visualizador de rastreamento em streaming. Esse recurso permite que o navegador carregue eventos de rastreamento dinamicamente.

Como usar a ferramenta

Ao capturar um perfil no TensorFlow 1.9 ou posterior, você poderá ver um arquivo rastreável armazenado no seu intervalo do Google Cloud Storage. Para visualizar esse arquivo, é necessário conectar o TensorBoard à TPU por meio da chamada de procedimento remoto do Google (GRPC, na sigla em inglês). O canal GRPC não é criptografado. Encontre o endereço IP interno da sua TPU no Console do Google Cloud: [TPU_IP].

imagemimagem Primeiro, acesse a página da TPU no Console do Google Cloud e localize a coluna denominada "IP interno" à direita. Procure o nome da sua TPU e o IP interno associado à ela.

(vm)$ tensorboard --logdir=${model_dir} --master_tpu_unsecure_channel=[TPU_IP]

Você verá traceviewer@ na lista suspensa "Ferramentas". Aumente e diminua o zoom para ver os eventos de rastreamento carregados dinamicamente no navegador.

imagem

Compatibilidade com criação de perfil de pod

O Cloud TPU Profiler 1.7.0 e o TensorBoard 1.9 agora são compatíveis com a criação de perfil de um pod completo. A ferramenta mostra uma overview_page para todas as TPUs agregadas, bem como uma análise geral do canal de entrada. Você pode selecionar a lista suspensa Hosts para ver o Visualizador de rastreamento, o Perfil das operações e o Visualizador de memória de cada TPU.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…