Ferramenta de visualização de memória

Você pode usar o Memory Viewer para visualizar o uso de memória durante o ciclo de vida do programa. É possível analisar os detalhes do conteúdo da memória no ponto de pico de uso da memória, inclusive para depurar situações de falta de memória (OOM). O Memory Viewer pode ajudar você a conferir o uso global de memória e a proximidade da computação de ficar sem memória.

Todas as informações exibidas no Memory Viewer são puramente estáticas, obtidas do compilador XLA. As informações dinâmicas de execução são apresentadas na ferramenta Memory Profile.

Plataformas compatíveis

TPU: compatível

GPU: compatível

Componentes do visualizador de memória

O Memory Viewer consiste em vários componentes principais:

  1. Menus suspensos de controle do usuário que permitem personalizar os dados que você está visualizando:
    • Tipos de memória: os tipos de memória compatíveis dependem do acelerador. Para GPUs, o foco está na memória de alta largura de banda (HBM), enquanto para TPUs, é possível conferir o uso de memórias no chip, incluindo VMEM, SMEM, CMEM, flags de sincronização (SFlag), Sparsecore e a memória do host.
    • Módulos: são os programas XLA que fizeram parte da execução. Um bom ponto de partida é geralmente um módulo de nível superior, rotulado como "jit_train_step" ou "jit_generate".
  2. A seção de visão geral textual fornece informações gerais, como a alocação de memória máxima necessária para o programa, a divisão entre argumentos e variáveis temporárias etc. Há uma sobrecarga imposta pelo padding, necessitada por restrições nas formas de tensores com suporte em aceleradores. Se esse padding for uma fração grande da alocação total, isso pode indicar uma oportunidade de otimização.
  3. O gráfico de linhas "Tamanho da alocação de memória x ordem do programa" mostra o uso da memória em relação aos pontos do programa (sequência HLO) conforme programado pelo compilador.
    • O eixo x não é o tempo.
    • O gráfico destaca especificamente o ponto do programa com o pico de uso de memória do módulo escolhido. O criador de perfil e as ferramentas não conhecem a co-residência de módulos em um determinado chip/memória. Quando cada módulo é compilado, o compilador anota o perfil com o ponto de partida "de referência" do total de memória alocada (por módulos que foram compilados antes deste) e conta para cima e para baixo a partir daí, conforme outras alocações e desalocamentos ocorrem. No entanto, nenhuma alocação futura por outros módulos compilados antes da execução é capturada. Lembre-se disso ao depurar situações de OOM.
  4. Os gráficos de buffer na parte de baixo da página detalham o uso de memória no ponto de pico de uso do programa (indicado pela linha vertical no gráfico de uso de memória). Há três gráficos, todos mostrando o conjunto completo de buffers alocados pelo programa, mas classificados de três maneiras diferentes:

    • Por ordem de programa: a ordem em que elas foram ativadas durante a execução do programa, com as mais antigas à esquerda.
    • Por tamanho: os que têm o maior impacto no ponto de pico de uso de memória estão à esquerda.
    • Pelo overhead de padding que eles impõem: o mais "ineficiente" do ponto de vista do hardware aparece à esquerda.

      As cores dos buffers não têm significado específico.

  5. Passar o cursor sobre um buffer em qualquer um dos três gráficos mostra duas telas adicionais:

    • Uma sobreposição no gráfico de linhas de uso da memória em uma cor que corresponde ao card de buffer, indicando o ciclo de vida desse buffer. Ou seja, uma barra horizontal cujos lados esquerdo e direito indicam os pontos de alocação e desalocação, dentro da ordem do programa. A altura da barra horizontal representa o tamanho relativo do buffer selecionado em comparação com a alocação de pico.
    • Um card de detalhes de buffer separado, geralmente no lado esquerdo, com detalhes sobre a operação específica, conforme aplicável. Um card típico inclui as seguintes informações:
      • Nome: o nome da operação do XLA, que pode ser pesquisado no Visualizador de gráficos ou no Visualizador de rastros.
      • Tamanho: o tamanho da alocação do buffer, com e sem preenchimento.
      • Forma: descreve a classificação, o tamanho e o tipo de dados da matriz N-dimensional.
      • Nome da operação do framework: mostra o nome da operação do framework associado a essa alocação.
      • Tipo de alocação: categoriza as alocações de buffer nos seguintes tipos: parâmetro, saída, thread-local e temporário (por exemplo, alocação de buffer dentro de uma fusão).