Monitorar e depurar o treinamento com uma shell interativa

Nesta página, mostramos como usar um shell interativo para inspecionar o contêiner em que o código de treinamento está em execução. É 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.
  • Verificar as permissões do Google Cloud disponíveis para o contêiner.

Também é possível usar o Cloud Profiler para depurar o desempenho do treinamento de modelo para jobs de treinamento personalizados. Para detalhes, consulte Gerar perfil de desempenho do treinamento de modelo usando o Profiler.

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.

  • 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 personalizado está em execução:

    • 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).

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 recurso de treinamento personalizado, verifique se qualquer usuário que queira acessar um shell interativo tem a permissão iam.serviceAccounts.actAs para a 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 CustomJob 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 CustomJob, ele também precisará ter a mesma permissão iam.serviceAccounts.actAs.

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

    • Não é possível usar um IP particular para treinamento personalizado. Se você precisar do VPC-SC com o peering de VPC, será necessário fazer uma configuração extra para usar o shell interativo. Siga as instruções em Shell interativo e painel do Ray com VPC-SC + peering de VPC para configurar o shell interativo com VPC-SC e peering de VPC no seu projeto de usuário.

    • Em um shell interativo, não é possível acessar a Internet pública ou os recursos 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 aiplatform.googleapis.com. Se você restringir apenas aiplatform.googleapis.com e não notebooks.googleapis.com, os usuários poderão acessar shells interativos a partir 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.

Ativar shells interativas

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 exemplos a seguir mostram como fazer isso usando várias ferramentas:

Console

Siga o guia para criar um TrainingPipeline personalizado no Console do Google Cloud. No painel Treinar novo modelo, quando você chegar à etapa Detalhes do modelo, faça o seguinte:

  1. Clique em Opções avançadas.

  2. Marque a caixa de seleção Ativar a depuração do treinamento.

Em seguida, conclua o restante do fluxo de trabalho Treinar novo modelo.

gcloud

  • Se você quiser criar um CustomJob, execute o comando gcloud ai custom-jobs create e especifique a sinalização --enable-web-access nesse comando.

  • Se você quiser criar um HyperparameterTuningJob, execute o comando gcloud ai hp-tuning-jobs create e especifique a sinalização --enable-web-access nesse comando.

Para saber como usar esses comandos, consulte o guia como criar um CustomJob e o guia como criar um HyperparameterTuningJob.

API

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 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.

HyperparameterTuningJob

O exemplo a seguir é um corpo de solicitação parcial para o método de API 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.

TrainingPipeline personalizado

Os exemplos a seguir mostram corpos de solicitação parciais para o método da API 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.

Python

Para saber como instalar o SDK da Vertex AI para Python, consulte Instalar o SDK da Vertex AI para Python. Para mais informações, consulte a documentação de referência da API Python.

Defina o parâmetro enable_web_access como true ao executar um dos seguintes métodos:

Depois de iniciar o treinamento personalizado de acordo com a orientação na seção anterior, a Vertex AI gera um ou mais URIs que podem ser usados para acessar shells interativos. A Vertex AI gera um URI exclusivo para cada nó de treinamento no job.

Navegue até um shell interativo de uma das seguintes maneiras:

  • Clique em um link no console do Google Cloud
  • Use a API Vertex AI para ver o URI de acesso à Web do shell
  1. No console do Google Cloud, na seção Vertex AI, acesse uma das páginas a seguir:

  2. Clique no nome do recurso de treinamento personalizado.

    Se você criou um TrainingPipeline para treinamento personalizado, clique no nome do CustomJob ou HyperparameterTuningJob criado pelo TrainingPipeline. Por exemplo, se o pipeline tiver o nome PIPELINE_NAME, ele pode ser chamado de PIPELINE_NAME-custom-job ou PIPELINE_NAME-hyperparameter-tuning-job.

  3. Na página do job, clique em Iniciar terminal da Web. Se o job usar vários nós, clique em Iniciar terminal da Web ao lado do nó em que você quer um shell interativo.

    Só é possível acessar um shell interativo enquanto o job está em execução. Se você não vir Iniciar terminal da Web, isso pode ser porque a Vertex AI ainda não começou a executar o job ou porque ele já foi concluído ou falhou. Se o status do job for Queued ou Pending, aguarde um minuto e tente atualizar a página.

    Se você estiver usando o ajuste de hiperparâmetro, haverá links separados para o terminal de inicialização da Web para cada teste.

Pegar o URI de acesso à Web na API

Use o método da API projects.locations.customJobs.get ou o método da API projects.locations.hyperparameterTuningJobs.get para ver os URIs que podem ser usados para acessar shells interativos.

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 job:

CustomJob

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

gcloud

Execute o comandogcloud ai custom-jobs describe :

gcloud 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 ai custom-jobs list e procure o job apropriado.

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

REST

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 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/v1/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 projects.locations.hyperparameterTuningJobs.get:

gcloud

Execute o comandogcloud ai hp-tuning-jobs describe :

gcloud 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 ai hp-tuning-jobs list e procure o job apropriado.

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

REST

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 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/v1/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"
}

Usar uma shell interativa

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.

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.

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.

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, é possível usar 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.

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. Por exemplo:

    gcloud storage cp profile.svg gs://BUCKET
    

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

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.

Recuperar 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ó. Por 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. Por exemplo:

    gcloud storage 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. Por exemplo:

    gcloud storage 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}"

Shell interativo e painel do Ray com VPC-SC + peering de VPC

  1. Configure peered-dns-domains.

    {
      VPC_NAME=NETWORK_NAME
      REGION=LOCATION
      gcloud services peered-dns-domains create training-cloud \
      --network=$VPC_NAME \
      --dns-suffix=$REGION.aiplatform-training.cloud.google.com.
    
      # Verify
      gcloud beta services peered-dns-domains list --network $VPC_NAME);
    }
        
    • NETWORK_NAME: mudar para a rede com peering.

    • LOCATION: o local desejado (por exemplo, us-central1).

  2. Configure DNS managed zone.

    {
      PROJECT_ID=PROJECT_ID
      ZONE_NAME=$PROJECT_ID-aiplatform-training-cloud-google-com
      DNS_NAME=aiplatform-training.cloud.google.com
      DESCRIPTION=aiplatform-training.cloud.google.com
    
      gcloud dns managed-zones create $ZONE_NAME  \
      --visibility=private  \
      --networks=https://www.googleapis.com/compute/v1/projects/$PROJECT_ID/global/networks/$VPC_NAME  \
      --dns-name=$DNS_NAME  \
      --description="Training $DESCRIPTION"
    }
        
    • PROJECT_ID: o ID do projeto. Esses IDs estão na página de boas-vindas do console do Google Cloud.

  3. Registro de transação DNS.

    {
      gcloud dns record-sets transaction start --zone=$ZONE_NAME
    
      gcloud dns record-sets transaction add \
      --name=$DNS_NAME. \
      --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
      --zone=$ZONE_NAME \
      --ttl=300
    
      gcloud dns record-sets transaction add \
      --name=*.$DNS_NAME. \
      --type=CNAME $DNS_NAME. \
      --zone=$ZONE_NAME \
      --ttl=300
    
      gcloud dns record-sets transaction execute --zone=$ZONE_NAME
    }
        
  4. Envie um job de treinamento com o shell interativo + VPC-SC + peering de VPC ativado.

A seguir