Monitoramento da Cloud TPU com o Stackdriver

Neste guia, explicamos como usar o Stackdriver para monitorar o Cloud TPU. O Cloud TPU coleta automaticamente registros e métricas do binário de ambiente de execução do Cloud TPU (por exemplo, uso da CPU do ambiente de execução do Cloud TPU e utilização de MXU) e os salva no Stackdriver. Este guia familiariza você com esses registros e mostra como:

  • consultar esses registros;

  • criar métricas com base em registros para configurar alertas e visualizar painéis.

Pré-requisitos

Este documento considera alguns conhecimentos básicos sobre registros do Stackdriver. Você deve ter uma VM do Compute Engine e os recursos do Cloud TPU criados antes de começar a gerar e trabalhar com registros. Veja o guia de início rápido para mais detalhes.

Não execute a seção de instruções de limpeza no guia de início rápido até concluir a execução do modelo e não precisar mais dos recursos. Executar a etapa de limpeza evita cobranças indesejadas.

Logging

A geração de registros do Stackdriver é executada automaticamente pelo Cloud TPU e pode gerar cobranças. Para mais informações sobre cobranças de registro, consulte Cobranças de registro.

A geração de registros do Stackdriver é escalonada linearmente à medida que você adiciona pods do Cloud TPU. É possível reduzir o número de registros ingeridos ou desativar a geração de registros do Stackdriver excluindo registros. Para mais informações, consulte Exclusões de registros

Como localizar os registros de monitoramento no Stackdriver

Os registros de monitoramento discutidos neste guia estão presentes em uma entidade de registro especial chamada runtime_monitor. Para localizá-los:

  1. Vá para a página Geração de registros do conjunto de operações do Google Cloud > Registros (Visualizador de registros) no Console do Cloud:

    Acessar a página "Visualizador de registros"

  2. Selecione um projeto atual do Google Cloud na parte superior da página.

  3. O menu do seletor Recurso auditado permite escolher os recursos, os registros e as gravidades no nível do registro que serão exibidos. Clique no menu seletor Auditar recurso, role para baixo e passe o cursor sobre Worket de TPU. Selecione a zona e o nome (node_id) do Cloud TPU para a qual você quer ver os registros.

  4. No menu suspenso do registro, selecione runtime_monitor. Clique no botão OK.

image

Como usar a consulta avançada do Stackdriver

Use as consultas avançadas do Stackdriver para identificar rapidamente os registros de monitoramento solicitados.

Para usar consultas de registros avançados no Visualizador de registros:

  1. Vá para a página Geração de registros do pacote de operações do Google Cloud > Registros (Visualizador de registros) no Console do Cloud:

    Acessar a página "Visualizador de registros"

  2. Selecione um projeto atual do Google Cloud na parte superior da página ou crie um novo.

  3. Na caixa de consulta de pesquisa, clique no menu suspenso e selecione Converter em filtro avançado.

  4. Na caixa de consulta de registros avançada, insira o script a seguir e clique no botão Enviar filtro:

    resource.type=tpu_worker
    resource.labels.project_id=your-project
    resource.labels.zone=your-tpu-zone
    resource.labels.node_id=your-tpu-name
    logName=projects/your-project/logs/tpu.googleapis.com%2Fruntime_monitor
    

image

Como entender a saída do registro

Clique em qualquer entrada de registro para expandi-la, e você encontrará um campo chamado jsonPayload. É nele que os registros de monitoramento residem. Clique para expandi-lo, e você verá vários subcampos. Veja a seguir um resumo dos subcampos importantes.

  • evententry_timestamp: o carimbo de data/hora em que a entrada de registro atual foi criada.

  • uid: o id do Cloud TPU.

  • logTime: o carimbo de data/hora do registro de ambiente de execução bruto do qual a entrada de registro foi gerada.

  • checkpoint_succeeded: se o checkpoint foi salvo ou não.

  • training_complete: se o processo de treinamento foi marcado como concluído.

  • compiler_succeeded: se a compilação foi bem-sucedida ou não.

  • compilation_timed_out: se a compilação expirou ou não.

  • execute_succeeded: se a execução foi bem-sucedida ou não.

  • execute_timed_out: se a execução expirou ou não.

  • eager_started: se o ambiente de execução está adotando o modo antecipado ou não.

  • framework: o framework do ambiente de execução, ou seja, tensorflow ou pytorch.

  • runtime_cpu_perc: a porcentagem de uso da CPU do ambiente de execução do Cloud TPU. Esse é um valor numérico com um intervalo de 0 a 5.000.

  • runtime_used_MiB: o uso da memória do ambiente de execução do Cloud TPU no MiB. Esse é um valor numérico com um intervalo de 0 a 350.000.

  • system_available_memory_GiB: a memória do sistema restante disponível no GiB. Esse é um valor numérico com um intervalo de 0 a 350.

  • matrix_unit_utilization_percent: a porcentagem de utilização de MXU do Cloud TPU. Esse é um valor numérico com um intervalo de 0 a 100.

Dependendo da origem das entradas de registro, nem todos os subcampos estarão presentes ao mesmo tempo. Por exemplo, as entradas de registro com o subcampo system_available_memory_GiB não terão subcampos como matriz_unit_utilization_percent.

Como criar métricas com base em registros

Esta seção descreve como criar métricas com base em registros usadas para configurar painéis e alertas de monitoramento. Consulte também Como criar métricas com base em registros de forma programática usando a API REST do Stackdriver.

O exemplo a seguir usa o subcampo matrix_unit_utilization_percent para demonstrar os procedimentos necessários para criar uma métrica com base em registros para monitorar a utilização da unidade de multiplicação de matriz (MXU, na sigla em inglês) do Cloud TPU.

  1. Na caixa de consulta avançada, insira o script de consulta a seguir para extrair todas as entradas de registro que tiverem matrix_unit_utilization_percent definido para o worker principal do Cloud TPU:

    resource.type=tpu_worker
    resource.labels.project_id=your-project
    resource.labels.zone=your-tpu-zone
    resource.labels.node_id=your-tpu-name
    resource.labels.worker_id=0
    logName=projects/your-project/logs/tpu.googleapis.com%2Fruntime_monitor
    jsonPayload.matrix_unit_utilization_percent:*
    
  2. Clique no botão CRIAR MÉTRICA. Na barra lateral do Editor de métricas no lado direito, digite "matriz_unit_utilization_percent" e "Utilização de MXU" nos campos Nome e Descrição, respectivamente.

  3. Clique no menu suspenso Tipo e selecione Distribuição. O tipo Distribuição é apropriado para exibir métricas numéricas.

  4. Em Nome do campo, digite "jsonPayload.matrix_unit_utilization_percent".

  5. Clique em Mais. Na seção Buckets de histograma, altere o menu suspenso Tipo para Linear. Insira 0 em Valor inicial, 200 em Número de buckets e 0,5 em Largura do bucket. Isso cria 200 blocos no bucket de 0 a 100 com uma largura de bucket de 0,5.

  6. Clique no botão Criar métrica na parte inferior da barra lateral para concluir a criação da métrica.

image

Para exibir os resultados do monitoramento com precisão, a definição do bucket do bucket precisa ser apropriada. Use os valores de intervalo especificados para os campos numéricos em Noções básicas sobre a saída do registro. Uma técnica é sempre usar Linear como Tipo e 200 como Número de buckets e, em seguida, descobrir a Largura do bucket com base no bucket de métricas.

Como criar métricas com base em registros de maneira programática usando a API REST do Stackdriver

É possível criar essas métricas por meio da API REST do Stackdriver de maneira programática. O pré-requisito para usar essa API é um arquivo JSON que contém a definição de todas as métricas necessárias. Consulte as instruções em Como criar uma métrica de distribuição para saber como definir uma métrica com base em registros usando JSON. O exemplo a seguir declara duas métricas dentro de um arquivo JSON:

[
  {
    "name": "system_available_memory_GiB",
    "description": "System available memory.",
    "filter": "resource.type=tpu_worker AND resource.labels.project_id=your-project AND jsonPayload.system_available_memory_GiB:*",
    "valueExtractor": "EXTRACT(jsonPayload.system_available_memory_GiB)",
    "bucketOptions": {
      "linearBuckets": {
        "numFiniteBuckets": 200,
        "width": 1.75,
        "offset": 0
      }
    },
    "metricDescriptor": {
      "metricKind": "DELTA",
      "valueType": "DISTRIBUTION"
    }
  },
  {
    "name": "matrix_unit_utilization_percent",
    "description": "MXU utilization.",
    "filter": "resource.type=tpu_worker AND resource.labels.project_id=your-project AND jsonPayload.matrix_unit_utilization_percent:*",
    "valueExtractor": "EXTRACT(jsonPayload.matrix_unit_utilization_percent)",
    "bucketOptions": {
      "linearBuckets": {
        "numFiniteBuckets": 200,
        "width": 0.5,
        "offset": 0
      }
    },
    "metricDescriptor": {
      "metricKind": "DELTA",
      "valueType": "DISTRIBUTION"
    }
  }
]

Para simplificar a criação de métricas, fornecemos um arquivo JSON com algumas métricas predefinidas neste link, que contém o seguinte:

  1. matriz_unit_utilization_percent: porcentagem de utilização de MXU.

  2. system_available_memory_GiB: memória do sistema disponível no GiB.

  3. runtime_used_MiB: o uso da memória do ambiente de execução do Cloud TPU no MiB.

  4. runtime_cpu_perc: a porcentagem de uso da CPU do ambiente de execução do Cloud TPU.

  5. training_completed: número de eventos de treinamento concluídos.

  6. compilation_succeeded: número de eventos de compilação bem-sucedidos.

A API REST do Stackdriver usa apenas um objeto JSON como entrada por vez. Portanto, precisamos de uma ferramenta para dividir a lista no arquivo JSON em objetos JSON individuais antes de passá-los para a API REST. Recomendamos o uso da ferramenta de código aberto jq.

Se você já tiver criado métricas com os mesmos nomes, precisará alterar os nomes das definições de métrica no arquivo JSON ou remover as métricas existentes antes de executar a API REST do Stackdriver. Para remover as métricas existentes, primeiro você precisa excluir todos os alertas definidos para elas. Siga as instruções descritas neste guia sobre como remover políticas de alerta existentes. Para remover métricas e criar novas métricas, siga estas etapas:

  1. Abra o arquivo JSON transferido e, em seguida, substitua your-project pelo projeto.

  2. Remova todas as métricas existentes:

    jq -c '.[] | .name' your-json-file-name | \
    xargs -I % curl -X DELETE "https://logging.googleapis.com/v2/projects/your-project/metrics/%" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Accept: application/json"
    
  3. Crie novas métricas:

    jq -c .[] your-json-file-name | \
    xargs -0 -d '\n' -I % curl -X POST "https://logging.googleapis.com/v2/projects/your-project/metrics" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Accept: application/json" -H "Content-Type: application/json" -d %
    

Como criar painéis e alertas usando métricas com base em registros

Depois de criar as métricas com base em registros, você poderá criar painéis e alertas no Stackdriver Monitoring. Os painéis são úteis para visualizar métricas (previsão de cerca de 2 minutos de atraso). Os alertas são úteis para a notificação em caso de erro.

Como criar painéis

As etapas nesta seção mostram um exemplo de criação de um painel no Stackdriver Monitoring para a métrica matrix_unit_utilization_percent.

  1. Acesse o console do Stackdriver Monitoring.

    Acesse o Stackdriver Monitoring.

  2. Mova o cursor para Painéis e clique em Criar painel no menu exibido.

  3. Clique no botão Adicionar gráfico no canto superior direito.

  4. Na nova página exibida, insira "Utilização de MXU do ambiente de execução da TPU" na caixa de entrada de texto Título do gráfico.

  5. No campo Localizar tipo e métrica de recurso, digite "matriz_unit_utilization_percent". O Stackdriver carregará automaticamente a métrica criada logging.googleapis.com/user/matrix_unit_utilization_percent. Selecione a métrica encontrada. O campo Tipo de recurso será preenchido automaticamente pelo Worker da TPU.

  6. No campo Filtro, defina project_id como seu projeto, zone como sua zona de TPU e node_id como o nome da TPU.

  7. Altere o Aggregator para none. Em seguida, clique no botão SALVAR na parte inferior da página.

Como criar alertas

As etapas nesta seção mostram um exemplo de como adicionar uma política de alerta para a métrica matriz_unit_utilization_percent. Ele cria uma política de alerta associada à utilização de MXU do Cloud TPU. Sempre que essa variável ficar abaixo de 5% por mais de uma hora, o Stackdriver enviará um e-mail para o endereço de e-mail registrado. Se o uso de MXU do Cloud TPU ultrapassar 5% novamente, o Stackdriver enviará uma notificação de que o alarme foi removido.

  1. Acesse o console do Stackdriver Monitoring.

    Acesse o Stackdriver Monitoring.

  2. Mova o cursor até Alertas e clique em Criar uma política no menu exibido.

  3. Na página Criar nova política de alertas, clique no botão Adicionar condição.

  4. Digite "Alerta de utilização da MXU no ambiente de execução da TPU" no campo Condição.

  5. No campo Localizar tipo e métrica de recurso, digite "matriz_unit_utilization_percent". O Stackdriver carregará automaticamente a métrica criada logging.googleapis.com/user/matrix_unit_utilization_percent. Selecione a métrica encontrada. O campo Tipo de recurso será preenchido automaticamente pelo Worker da TPU.

  6. Na seção Configuração, altere Condição para está abaixo. Digite 5 no campo Limite e selecione 1 hora no menu suspenso Por. Clique no botão Salvar.

  7. No menu suspenso Tipo de canal de notificação, selecione E-mail e digite seu e-mail na caixa de texto Endereço de e-mail. Clique no botão Adicionar canal de notificação.

  8. No campo Documentação, você pode inserir as informações que ajudarão a identificar o problema quando os alertas forem disparados.

  9. Na caixa de entrada de texto Nome desta política, insira "Alerta de utilização de MXU baixa do ambiente de execução da TPU". Clique no botão Salvar na parte inferior.