Como monitorar e depurar o treinamento com um shell interativo

Durante o treinamento personalizado, use um shell interativo para inspecionar o contêiner em que o código de treinamento está sendo executado. É possível navegar no sistema de arquivos e executar utilitários de depuração em cada contêiner predefinido ou contêiner personalizado em execução no Vertex AI.

Usar um shell interativo para inspecionar seu contêiner de treinamento pode ajudar a depurar problemas com o código de treinamento ou a configuração do Vertex AI. 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

Você pode usar um shell interativo ao realizar treinamento personalizado com um recurso CustomJob, um recurso HyperparameterTuningJob ou um recurso TrainingPipeline personalizado. Ao preparar seu código de treinamento e configurar o recurso de treinamento personalizado de sua escolha, certifique-se de atender aos seguintes requisitos:

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

    Todos os containers de treinamento pré-criados 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 treinamento personalizado em uma região compatível com shells interativos.

  • Não use o VPC Service Controls com o Vertex AI.

  • Tenha as seguintes permissões no projeto do Google Cloud em que você planeja realizar o treinamento personalizado:

    • aiplatform.customJobs.create
    • aiplatform.customJobs.get
    • aiplatform.customJobs.cancel

    Se você mesmo iniciar o treinamento personalizado, provavelmente já tem essas permissões e pode acessar um shell interativo. No entanto, se você quiser usar um shell interativo para inspecionar um recurso de treinamento personalizado criado por outra pessoa na sua organização, talvez seja necessário obter essas permissões.

    Uma maneira de conseguir essas permissões é solicitar que um administrador da sua organização conceda a você o papel de usuário do Vertex AI (roles/aiplatform.user).

Como ativar shells interativos

Para ativar shells interativos para um recurso de treinamento personalizado, defina o campo enableWebAccess API como true ao criar um CustomJob, HyperparameterTuningJob ou TrainingPipeline personalizado.

Os corpos de solicitação REST parciais a seguir mostram onde especificar o campo enableWebAccess para cada tipo de recurso de treinamento personalizado:

CustomJob

O exemplo a seguir é um corpo de solicitação parcial para o método de API v1beta1.projects.locations.customJobs.create:

{
  ...
  "jobSpec": {
    ...
    "enableWebAccess": true
  }
  ...
}

Para um exemplo de envio de uma solicitação de API para criar um CustomJob, consulte Como criar jobs de treinamento personalizados. No entanto, para usar um shell interativo, use a versão v1beta1 do método da API, não a versão v1.

HyperparameterTuningJob

O exemplo a seguir é um corpo de solicitação parcial para o método de API v1beta1.projects.locations.hyperparameterTuningJobs.create:

{
  ...
  "trialJobSpec": {
    ...
    "enableWebAccess": true
  }
  ...
}

Para um exemplo de envio de uma solicitação de API para criar um HyperparameterTuningJob, consulte Como usar o ajuste de hiperparâmetro. No entanto, para usar um shell interativo, use a versão v1beta1 do método da API, não a versão v1.

TrainingPipeline personalizado

Os exemplos a seguir mostram corpos de solicitação parciais para o método da API v1beta1.projects.locations.trainingPipelines.create. Selecione uma das seguintes guias, dependendo se você está usando o ajuste de hiperparâmetros:

Sem ajuste de hiperparâmetros

{
  ...
  "trainingTaskInputs": {
    ...
    "enableWebAccess": true
  }
  ...
}

Com ajuste de hiperparâmetros

{
  ...
  "trainingTaskInputs": {
    ...
    "trialJobSpec": {
      ...
      "enableWebAccess": true
    }
  }
  ...
}

Para um exemplo de envio de uma solicitação de API para criar um TrainingPipeline personalizado, consulte Como criar pipelines de treinamento. No entanto, para usar um shell interativo, use a versão v1beta1 do método da API, não a versão v1.

Como conseguir o URI de acesso à Web

Depois de iniciar o treinamento personalizado de acordo com as orientações da seção anterior, use ométodo da API v1beta1.projects.locations.customJobs.get ou o método da API v1beta1.projects.locations.hyperparameterTuningJobs.get para ver os URIs que você pode usar para acessar os shells interativos. O Vertex AI fornece um URI para cada nó de treinamento que faz parte do job.

Dependendo do tipo de recurso de treinamento personalizado que você está usando, 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ó do seu trabalho

CustomJob

As guias a seguir mostram maneiras diferentes de enviar uma solicitação v1beta1.projects.locations.customJobs.get:

gcloud

Execute o comandogcloud beta ai custom-jobs describe :

gcloud beta ai custom-jobs describe JOB_ID \
  --region=LOCATION \
  --format=json

Substitua:

  • JOB_ID: o ID numérico do job. Esse ID é a última parte do campo name do job. Você pode ter visto o ID quando criou o job. Se você não souber o ID do job, execute o comando gcloud beta ai custom-jobs list e procure o job apropriado.

  • LOCATION: a região em que você criou o job.

REST e LINHA DE CMD

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • LOCATION: a região em que você criou o job.

  • PROJECT_ID: o ID ou o número do projeto;

  • JOB_ID: o ID numérico do job. Esse ID é a última parte do campo name do job. Você pode ter visto o ID quando criou o job.

Método HTTP e URL:

GET https://LOCATION-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/customJobs/JOB_ID

Para enviar a solicitação, expanda uma destas opções:

 

Na saída, procure por:

{
  ...
  "state": "JOB_STATE_RUNNING",
  ...
  "webAccessUris": {
    "workerpool0-0": "INTERACTIVE_SHELL_URI"
  }
}

Se você não vir o campo webAccessUris, pode ser porque o Vertex AI ainda não começou a executar o job. Verifique se você vê JOB_STATE_RUNNING no campo state. Se o estado for JOB_STATE_QUEUED ou JOB_STATE_PENDING, aguarde um minuto. Em seguida, tente receber as informações do projeto novamente.

HyperparameterTuningJob

As guias a seguir mostram maneiras diferentes de enviar uma solicitação v1beta1.projects.locations.hyperparameterTuningJobs.get:

gcloud

Execute o comandogcloud beta ai hp-tuning-jobs describe :

gcloud beta ai hp-tuning-jobs describe JOB_ID \
  --region=LOCATION \
  --format=json

Substitua:

  • JOB_ID: o ID numérico do job. Esse ID é a última parte do campo name do job. Você pode ter visto o ID quando criou o job. Se você não souber o ID do job, execute o comando gcloud beta ai hp-tuning-jobs list e procure o job apropriado.

  • LOCATION: a região em que você criou o job.

REST e LINHA DE CMD

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • LOCATION: a região em que você criou o job.

  • PROJECT_ID: o ID ou o número do projeto;

  • JOB_ID: o ID numérico do job. Esse ID é a última parte do campo name do job. Você pode ter visto o ID quando criou o job.

Método HTTP e URL:

GET https://LOCATION-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/hyperparameterTuningJobs/JOB_ID

Para enviar a solicitação, expanda uma destas opções:

 

Na saída, procure por:

{
  ...
  "state": "JOB_STATE_RUNNING",
  ...
  "trials": [
    ...
    {
      ...
      "state": "ACTIVE",
      ...
      "webAccessUris": {
        "workerpool0-0": "INTERACTIVE_SHELL_URI"
      }
    }
  ],
}

Se você não vir o campo webAccessUris, pode ser porque o Vertex AI ainda não começou a executar o job. Verifique se você vê JOB_STATE_RUNNING no campo state. Se o estado for JOB_STATE_QUEUED ou JOB_STATE_PENDING, aguarde um minuto. Em seguida, tente receber as informações do projeto novamente.

O Vertex AI fornece um conjunto de URIs de shell interativos para cada teste de ajuste de hiperparâmetros à medida que o teste entra no estado ACTIVE. Se você quiser receber 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 pool de workers.

Por exemplo, se o job tiver um pool de workers principais com uma réplica e um secundário com duas réplicas, o campo webAccessUris será semelhante a este:

{
  "workerpool0-0": "URI_FOR_PRIMARY",
  "workerpool1-0": "URI_FOR_FIRST_SECONDARY",
  "workerpool1-1": "URI_FOR_SECOND_SECONDARY"
}

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 aparece no navegador, oferecendo acesso ao sistema de arquivos do contêiner em que o Vertex AI está executando o código de treinamento.

As seções a seguir descrevem algumas coisas a serem consideradas ao usar o shell e fornecer alguns exemplos de ferramentas de monitoramento que você pode usar no shell.

Como impedir que o job seja encerrado

Quando o Vertex AI concluir a execução do job ou do 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á cargas de treinamento do Vertex AI enquanto o job continuar em execução.

Como verificar problemas de permissões

O ambiente de shell interativo é autenticado com o uso do Application Default Credentials (ADC) na conta de serviço usada pelo Vertex AI 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 um shell interativo, 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 seu 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 a configuração ou com o Vertex AI), 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