Como monitorar e depurar o treinamento com um shell interativo

Durante o treinamento, é possível usar um shell interativo para inspecionar o contêiner em que seu código de treinamento está sendo executado. Procure o sistema de arquivos e execute utilitários de depuração em cada versão do ambiente de execução ou contêiner personalizado em execução no AI Platform Training.

Usar um shell interativo para inspecionar o contêiner de treinamento pode ajudar a depurar problemas com o código de treinamento ou a configuração do AI Platform Training. Por exemplo, é possível usar um shell interativo para fazer o seguinte:

  • Executar ferramentas de rastreamento e criação de perfis
  • Analisar o uso da GPU
  • Verifique as permissões do Google Cloud disponíveis para o contêiner

Antes de começar

É possível usar um shell interativo ao executar um job de treinamento ou de ajuste de hiperparâmetros. Ao preparar seu código de treinamento e executar um job de treinamento, certifique-se de atender aos seguintes requisitos:

  • Verifique se o contêiner de treinamento tem bash instalado.

  • Todos os contêineres da versão do ambiente de execução têm o bash instalado. Se você criar um contêiner personalizado para treinamento, use um contêiner básico que inclua bash ou instale bash no Dockerfile.

  • Realize o treinamento em uma região compatível com shells interativos.

  • Verifique se qualquer pessoa que queira acessar um shell interativo tem as seguintes permissões para o projeto do Google Cloud em que o treinamento está em execução:

    • ml.jobs.create
    • ml.jobs.get
    • ml.jobs.cancel

    Se você iniciar o treinamento por conta própria, provavelmente já tem essas permissões e pode acessar um shell interativo. No entanto, se você quiser usar um shell interativo para inspecionar um job de treinamento criado por outra pessoa na organização, talvez seja necessário receber essas permissões.

    Uma maneira de conseguir essas permissões é pedir que um administrador da organização conceda a você o papel Administrador do AI Platform Training (roles/ml.admin). Se você tiver recebido o papel de desenvolvedor do AI Platform Training (roles/ml.developer), você terá acesso ao shell interativo dos jobs criados.

Requisitos para casos avançados

Se você estiver usando determinados recursos avançados, atenda aos seguintes requisitos extras:

  • Se você anexar uma conta de serviço personalizada ao job de treinamento, certifique-se de que qualquer usuário que queira acessar um shell interativo tenha a permissão iam.serviceAccounts.actAs para o conta de serviço anexada.

    O guia para contas de serviço personalizadas avisa que você precisa ter essa permissão para anexar uma conta de serviço. Essa permissão também é necessária para visualizar um shell interativo durante o treinamento personalizado.

    Por exemplo, para criar um job com uma conta de serviço anexada, você precisa ter a permissão iam.serviceAccounts.actAs para a conta de serviço. Se um dos seus colegas quiser ver um shell interativo para esse job, ele também precisará ter a mesma permissão iam.serviceAccounts.actAs.

  • Se você configurou seu projeto para usar o VPC Service Controls com o AI Platform Training, considere as seguintes limitações adicionais:

    • Não é possível usar o VPC Service Controls com o peering de rede VPC.

    • Em um shell interativo, não é possível acessar os recursos públicos da Internet ou do Google Cloud fora do perímetro de serviço.

    • Para proteger o acesso aos shells interativos, adicione notebooks.googleapis.com como um serviço restrito no perímetro de serviço, além de ml.googleapis.com. Se você restringir apenas ml.googleapis.com e não notebooks.googleapis.com, os usuários poderão acessar shells interativos de máquinas fora do perímetro de serviço, o que reduz o benefício da segurança do uso do VPC Service Controls.

Como ativar shells interativos

Para ativar shells interativos em um job de treinamento, defina o campo enableWebAccess da API como true no campo trainingInput do job ao criar um job de treinamento.

O exemplo a seguir mostra como fazer isso adicionando a sinalização --enable-web-access ao usar a CLI gcloud. No momento, não é possível criar um job de treinamento com um shell interativo ativado no console do Google Cloud.

O exemplo pressupõe que você tenha um aplicativo de treinamento em seu sistema de arquivos local em um diretório chamado trainer com um módulo chamado task.

Para criar o job de treinamento, execute o seguinte comando:

  gcloud ai-platform jobs submit training JOB_ID \
    --enable-web-access \
    --job-dir=JOB_DIR \
    --module-name=trainer.task \
    --package-path=trainer \
    --python-version=3.7 \
    --region=REGION \
    --runtime-version=2.11 \
    --scale-tier=CUSTOM \
    --master-machine-type=n1-highmem-8

Nesse comando, substitua os seguintes marcadores:

  • JOB_ID: um nome que você escolhe para o job
  • JOB_DIR: um caminho até um diretório do Cloud Storage para onde o aplicativo de treinamento é enviado.
  • REGION: a região em que você planeja criar o job de treinamento. Observe que ela precisa ser uma região compatível com shells interativos.

    Se bem-sucedido, o comando gera a seguinte saída:

    Job [JOB_ID] submitted successfully.
    Your job is still active. You may view the status of your job with the command
    
      $ gcloud ai-platform jobs describe JOB_ID
    
    or continue streaming the logs with the command
    
      $ gcloud ai-platform jobs stream-logs JOB_ID
    jobId: JOB_ID
    state: QUEUED
    

Como conseguir o URI de acesso à Web

Depois de iniciar o treinamento de acordo com as orientações na seção anterior, use o console do Google Cloud ou a ferramenta de linha de comando gcloud para ver os URIs que podem ser usados para acessar shells interativos. O AI Platform Training fornece um URI para cada nó de treinamento que faz parte do job.

Dependendo do tipo de job de treinamento criado, selecione uma das guias a seguir para ver exemplos de como encontrar o campo da API webAccessUris, que contém um URI de shell interativo para cada nó no job.

Job de treinamento

As guias a seguir mostram maneiras diferentes de acessar o TrainingOutput para um job de treinamento padrão.

gcloud

Execute o comandogcloud ai-platform jobs describe :

gcloud ai-platform jobs describe JOB_ID

Substitua:

Na saída, procure por:

trainingOutput:
  webAccessUris:
    master-replica-0: INTERACTIVE_SHELL_URI

Console

  1. Abra a página Jobs do AI Platform Training no Console do Google Cloud.

    Abrir "jobs" no console do Google Cloud

  2. Clique no nome do job na lista para abrir a página Detalhes do job.

  3. Clique no botão Mostrar JSON na seção Saída de treinamento para expandir uma visualização JSON do TrainingOutput do job.

Na saída, procure por:

{
  "webAccessUris": {
    "master-replica-0": "INTERACTIVE_SHELL_URI"
  }
}

Se você não vir o campo webAccessUris, pode ser porque o AI Platform Training ainda não começou a executar o job ou o teste. Verifique se você vê RUNNING o campo state. Se o estado for QUEUED ou PREPARING, aguarde um minuto. Em seguida, tente receber as informações do job novamente.

Job de ajuste de hiperparâmetros

As guias a seguir mostram maneiras diferentes de acessar o TrainingOutput para um job de ajuste de hiperparâmetro.

gcloud

Execute o comandogcloud ai-platform jobs describe :

gcloud ai-platform jobs describe JOB_ID

Substitua:

Na saída, procure por:

trainingOutput:
  trials:
  - trialId: '1'
    webAccessUris:
      master-replica-0: INTERACTIVE_SHELL_URI

Console

  1. Abra a página Jobs do AI Platform Training no Console do Google Cloud.

    Abrir "jobs" no console do Google Cloud

  2. Clique no nome do job na lista para abrir a página Detalhes do job.

  3. Clique no botão Mostrar JSON na seção Saída de treinamento para expandir uma visualização JSON do TrainingOutput do job.

Na saída, procure por:

{
  "trials": [
    {
      ...
      "webAccessUris": {
        "master-replica-0": "INTERACTIVE_SHELL_URI"
      }
    },
    ...
  ]
}

Se você não vir o campo webAccessUris, pode ser porque o AI Platform Training ainda não começou a executar o job ou o teste. Verifique se você vê RUNNING o campo state. Se o estado for QUEUED ou PREPARING, aguarde um minuto. Em seguida, tente receber as informações do job novamente.

O AI Platform Training fornece um conjunto de URIs de shell interativos para cada teste de ajuste de hiperparâmetros à medida que o teste entra no estado RUNNING. Se você quiser ver os URIs de shell interativos para testes posteriores, receba as informações do job novamente após o início desses testes.

O exemplo anterior mostra a saída esperada para o treinamento de réplica única: um URI para o nó de treinamento principal. Se você estiver executando um treinamento distribuído, a saída conterá um URI para cada nó de treinamento, identificado pelo nome da tarefa.

Por exemplo, se seu job tiver um mestre e dois workers, o campo webAccessUris será semelhante ao seguinte:

{
  "master-replica-0": "URI_FOR_PRIMARY",
  "worker-replica-0": "URI_FOR_FIRST_SECONDARY",
  "worker-replica-1": "URI_FOR_SECOND_SECONDARY"
}

Regiões disponíveis

O uso de um shell interativo para o AI Platform Training é compatível com as seguintes regiões:

Américas

  • Oregon (us-west1)
  • Los Angeles (us-west2)
  • Iowa (us-central1)
  • Carolina do Sul (us-east1)
  • Norte da Virgínia (us-east4)
  • Montreal (northamerica-northeast1)

Europa

  • Londres (europe-west2)
  • Bélgica (europe-west1)
  • Zurique (europe-west6)
  • Frankfurt (europe-west3)

Ásia-Pacífico

  • Singapura (asia-southeast1)
  • Taiwan (asia-east1)
  • Tóquio (asia-northeast1)
  • Sydney (australia-southeast1)
  • Seul (asia-northeast3)

O AI Platform Training também fornece outras regiões para treinamento.

Como usar um shell interativo

Para usar o shell interativo em um nó de treinamento, navegue até um dos URIs encontrados na seção anterior. Um shell do Bash é exibido no navegador, oferecendo acesso ao sistema de arquivos do contêiner em que o AI Platform Training está executando o código de treinamento.

Nas seções a seguir, você verá alguns itens a serem considerados ao usar o shell e alguns exemplos de ferramentas de monitoramento que podem ser usadas nele.

Como impedir que o job seja encerrado

Quando o AI Platform Training terminar de executar o job ou o teste, você perderá imediatamente o acesso ao shell interativo. Se isso acontecer, você poderá ver a mensagem command terminated with exit code 137 ou o shell pode parar de responder. Se você tiver criado arquivos no sistema de arquivos do contêiner, eles não persistirão após o término do job.

Em alguns casos, pode ser útil fazer com que o job seja executado por mais tempo para depurar com um shell interativo. Por exemplo, você pode adicionar um código como o seguinte ao seu código de treinamento para fazer o job continuar em execução por pelo menos uma hora após uma exceção:

import time
import traceback

try:
    # Replace with a function that runs your training code
    train_model()
except Exception as e:
    traceback.print_exc()
    time.sleep(60 * 60)  # 1 hour

No entanto, você receberá cobranças pelo treinamento do AI Platform Training, desde que o job continue em execução.

Como verificar problemas de permissões

O ambiente interativo de shell é autenticado com o uso de Application Default Credentials (ADC) na conta de serviço que o AI Platform Training usa para executar o código de treinamento. Para mais detalhes, execute gcloud auth list no shell.

No shell, você pode usar gsutil, bq e outras ferramentas compatíveis com o ADC. Isso pode ajudar você a verificar se o job consegue acessar um determinado bucket do Cloud Storage, tabela do BigQuery ou outro recurso do Google Cloud necessário para o código de treinamento.

Como visualizar a execução do Python com py-spy

O py-spy permite que você crie um perfil para executar um programa Python sem modificá-lo. Para usar py-spy em uma shell interativa, faça o seguinte:

  1. Instale py-spy:

    pip3 install py-spy
    
  2. Execute ps aux no shell e procure o PID do programa de treinamento Python.

  3. Execute qualquer um dos subcomandos descritos na documentação de py-spy usando o PID encontrado na etapa anterior.

  4. Se você usar py-spy record para criar um arquivo SVG, copie-o para um bucket do Cloud Storage para que você possa vê-lo depois no computador local. Exemplo:

    gsutil cp profile.svg gs://BUCKET
    

    Substitua BUCKET pelo nome de um bucket ao qual você tem acesso.

Como analisar o desempenho com perf

perf permite analisar o desempenho do nó de treinamento. Para instalar a versão do perf apropriada para o kernel do Linux do nó, execute os seguintes comandos:

apt-get update
apt-get install -y linux-tools-generic
rm /usr/bin/perf
LINUX_TOOLS_VERSION=$(ls /usr/lib/linux-tools | tail -n 1)
ln -s "/usr/lib/linux-tools/${LINUX_TOOLS_VERSION}/perf" /usr/bin/perf

Depois disso, execute qualquer um dos subcomandos descritos na perfdocumentação.

Como conseguir informações sobre o uso da GPU

Os contêineres ativados para GPU em execução nos nós com GPUs costumam ter várias ferramentas de linha de comando pré-instaladas que podem ajudar a monitorar o uso da GPU. Exemplo:

  • Use nvidia-smi para monitorar a utilização da GPU por vários processos.

  • Use nvprof para coletar uma variedade de informações de criação do perfil da GPU. Como o nvprof não pode ser anexado a um processo existente, convém usar a ferramenta para iniciar um processo adicional executando o código de treinamento. Isso significa que o código de treinamento será executado duas vezes no nó. Exemplo:

    nvprof -o prof.nvvp python3 -m MODULE_NAME
    

    Substitua MODULE_NAME pelo nome totalmente qualificado do módulo de ponto de entrada do aplicativo de treinamento. Por exemplo, trainer.task.

    Em seguida, transfira o arquivo de saída para um intervalo do Cloud Storage para analisá-lo posteriormente no computador local. Exemplo:

    gsutil cp prof.nvvp gs://BUCKET
    

    Substitua BUCKET pelo nome de um bucket ao qual você tem acesso.

  • Se você encontrar um erro de GPU (não um problema com sua configuração ou no AI Platform Training), use nvidia-bug-report.sh para criar um relatório de bug.

    Em seguida, transfira o relatório para um bucket do Cloud Storage para analisá-lo posteriormente no computador local ou enviá-lo para a NVIDIA. Exemplo:

    gsutil cp nvidia-bug-report.log.gz gs://BUCKET
    

    Substitua BUCKET pelo nome de um bucket ao qual você tem acesso.

Se bash não conseguir encontrar nenhum desses comandos da NVIDIA, tente adicionar /usr/local/nvidia/bin e /usr/local/cuda/bin ao PATH do shell:

export PATH="/usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}"

A seguir