Monitorize e depure a preparação com um shell interativo

Esta página mostra-lhe como usar uma shell interativa para inspecionar o contentor onde o seu código de preparação está a ser executado. Pode procurar no sistema de ficheiros e executar utilitários de depuração em cada contentor pré-criado ou contentor personalizado em execução no Vertex AI.

A utilização de um shell interativo para inspecionar o contentor de preparação pode ajudar a depurar problemas com o código de preparação ou a configuração da Vertex AI. Por exemplo, pode usar uma shell interativa para fazer o seguinte:

  • Executar ferramentas de rastreio e criação de perfis.
  • Analise a utilização da GPU.
  • Verifique as Google Cloud autorizações disponíveis para o contentor.

Também pode usar o Cloud Profiler para depurar o desempenho da preparação de modelos para as suas tarefas de preparação personalizadas. Para ver detalhes, consulte o artigo Desempenho da preparação do modelo de perfil com o Profiler.

Antes de começar

Pode usar uma shell interativa quando realiza um treino personalizado com um recurso CustomJob, um recurso HyperparameterTuningJob ou um recurso TrainingPipeline personalizado. À medida que prepara o código de treino e configura o recurso de treino personalizado da sua escolha, certifique-se de que cumpre os seguintes requisitos:

  • Certifique-se de que o contentor de preparação tem o pacote bash instalado.

    Todos os contentores de preparação pré-criados têm o bash instalado. Se criar um contentor personalizado para a preparação, use um contentor base que inclua bash ou instale bash no seu Dockerfile.

  • Realize uma preparação personalizada numa região que suporte shells interativas.

  • Certifique-se de que todas as pessoas que querem aceder a um shell interativo têm as seguintes autorizações para o Google Cloud projeto onde o treino personalizado está a ser executado:

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

    Se iniciar a preparação personalizada, é provável que já tenha estas autorizações e possa aceder a um shell interativo. No entanto, se quiser usar uma shell interativa para inspecionar um recurso de preparação personalizado criado por outra pessoa na sua organização, pode ter de obter estas autorizações.

    Uma forma de obter estas autorizações é pedir a um administrador da sua organização que lhe conceda a função de utilizador da Vertex AI (roles/aiplatform.user).

Requisitos para casos avançados

Se estiver a usar determinadas funcionalidades avançadas, cumpra os seguintes requisitos adicionais:

  • Se anexar uma conta de serviço personalizada ao recurso de preparação personalizado, certifique-se de que todos os utilizadores que queiram aceder a uma shell interativa têm a autorização iam.serviceAccounts.actAs para a conta de serviço anexada.

    O guia para contas de serviço personalizadas indica que tem de ter esta autorização para anexar uma conta de serviço. Também precisa desta autorização para ver um shell interativo durante o treino personalizado.

    Por exemplo, para criar um CustomJob com uma conta de serviço anexada, tem de ter a autorização iam.serviceAccounts.actAs para a conta de serviço. Se um dos seus colegas quiser ver um shell interativo para este CustomJob, também tem de ter a mesma autorização iam.serviceAccounts.actAs.

  • Se configurou o seu projeto para usar os VPC Service Controls com o Vertex AI, tenha em conta as seguintes limitações adicionais:

    • Não pode usar o IP privado para o treino personalizado. Se precisar do VPC-SC com o peering de VPC, é necessária uma configuração adicional para usar a shell interativa. Siga as instruções abordadas no artigo Painel de controlo do Ray e shell interativa com VPC-SC + interligação de VPCs para configurar a configuração da shell interativa com VPC-SC e interligação de VPCs no seu projeto de utilizador.

    • A partir de uma shell interativa, não pode aceder à Internet pública nem a recursos fora do perímetro do seu serviço.Google Cloud

    • Para proteger o acesso a shells interativos, tem de adicionar o serviço notebooks.googleapis.com como um serviço restrito no seu perímetro de serviço, além do serviço aiplatform.googleapis.com. Se restringir apenas aiplatform.googleapis.com e não notebooks.googleapis.com, os utilizadores podem aceder a shells interativas a partir de máquinas fora do perímetro de serviço, o que reduz a vantagem de segurança da utilização dos VPC Service Controls.

Ative shells interativas

Para ativar shells interativos para um recurso de preparação personalizado, defina o campo enableWebAccess da API como true quando criar um CustomJob, um HyperparameterTuningJob ou um TrainingPipeline personalizado.

Os exemplos seguintes mostram como o fazer através de várias ferramentas diferentes:

Consola

Siga o guia para criar um TrainingPipeline personalizado na Google Cloud consola. No painel Treinar novo modelo, quando chegar ao passo Detalhes do modelo, faça o seguinte:

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

  2. Selecione a caixa de verificação Ativar depuração de preparação.

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

gcloud

Para saber como usar estes comandos, consulte o guia de criação de um CustomJob e o guia de criação de um HyperparameterTuningJob.

API

Os seguintes corpos de pedidos REST parciais mostram onde especificar o campo enableWebAccess para cada tipo de recurso de formação personalizado:

CustomJob

O exemplo seguinte é um corpo do pedido parcial para o método projects.locations.customJobs.create da API:

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

Para ver um exemplo de envio de um pedido de API para criar um CustomJob, consulte o artigo Criar tarefas de preparação personalizadas.

HyperparameterTuningJob

O exemplo seguinte é um corpo do pedido parcial para o método projects.locations.hyperparameterTuningJobs.create da API:

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

Para ver um exemplo de envio de um pedido de API para criar um HyperparameterTuningJob, consulte o artigo Usar o aperfeiçoamento de hiperparâmetros.

Custom TrainingPipeline

Os exemplos seguintes mostram corpos de pedidos parciais para o método projects.locations.trainingPipelines.create API. Selecione um dos seguintes separadores, consoante esteja a usar a otimização de hiperparâmetros:

Sem o aperfeiçoamento de hiperparâmetros

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

Com o aperfeiçoamento de hiperparâmetros

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

Para ver um exemplo de envio de um pedido de API para criar um TrainingPipeline personalizado, consulte o artigo Criar pipelines de preparação.

Python

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

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

Depois de iniciar a preparação personalizada de acordo com as orientações na secção anterior, o Vertex AI gera um ou mais URIs que pode usar para aceder a shells interativas. O Vertex AI gera um URI único para cada nó de preparação na sua tarefa.

Pode navegar para uma shell interativa de uma das seguintes formas:

  • Clique num link na Google Cloud consola
  • Use a API Vertex AI para obter o URI de acesso Web da shell
  1. Na Google Cloud consola, na secção Vertex AI, aceda a uma das seguintes páginas:

  2. Clique no nome do recurso de preparação personalizado.

    Se criou um TrainingPipeline para o treino personalizado, clique no nome do CustomJob ou HyperparameterTuningJob criado pelo seu TrainingPipeline. Por exemplo, se o seu pipeline tiver o nome PIPELINE_NAME, pode ser denominado PIPELINE_NAME-custom-job ou PIPELINE_NAME-hyperparameter-tuning-job.

  3. Na página do seu trabalho, clique em Iniciar terminal Web. Se o seu trabalho usar vários nós, clique em Iniciar terminal Web junto ao nó para o qual quer um shell interativo.

    Tenha em atenção que só pode aceder a um shell interativo enquanto a tarefa estiver em execução. Se não vir a opção Iniciar terminal Web, isto pode dever-se ao facto de o Vertex AI ainda não ter começado a executar a sua tarefa ou de a tarefa já ter terminado ou falhado. Se o Estado da tarefa for Queued ou Pending, aguarde um minuto e, em seguida, experimente atualizar a página.

    Se estiver a usar o ajuste de hiperparâmetros, existem links Iniciar terminal Web separados para cada teste.

Obtenha o URI de acesso Web a partir da 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 pode usar para aceder a shells interativas.

Consoante o tipo de recurso de preparação personalizado que estiver a usar, selecione um dos seguintes separadores para ver exemplos de como encontrar o campo da API webAccessUris, que contém um URI de shell interativo para cada nó na sua tarefa:

CustomJob

Os separadores seguintes mostram diferentes formas de enviar um pedido projects.locations.customJobs.get:

gcloud

Execute o gcloud ai custom-jobs describecomando:

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

Substitua o seguinte:

  • JOB_ID: o ID numérico do seu trabalho. Este ID é a última parte do campo name da tarefa. Pode ter visto o ID quando criou a tarefa. (Se não souber o ID da tarefa, pode executar o comando gcloud ai custom-jobs list e procurar a tarefa adequada.)

  • LOCATION: a região onde criou a tarefa.

REST

Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:

  • LOCATION: a região onde criou a tarefa.

  • PROJECT_ID: o seu ID do projeto.

  • JOB_ID: o ID numérico do seu trabalho. Este ID é a última parte do campo name da tarefa. Pode ter visto o ID quando criou a tarefa.

Método HTTP e URL:

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

Para enviar o seu pedido, expanda uma destas opções:

 

No resultado, procure o seguinte:

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

Se não vir o campo webAccessUris, isto pode dever-se ao facto de o Vertex AI ainda não ter começado a executar a sua tarefa. Verifique se vê JOB_STATE_RUNNING no campo state. Se o estado for JOB_STATE_QUEUED ou JOB_STATE_PENDING, aguarde um minuto e, em seguida, tente obter novamente as informações do projeto.

HyperparameterTuningJob

Os separadores seguintes mostram diferentes formas de enviar um pedido projects.locations.hyperparameterTuningJobs.get:

gcloud

Execute o gcloud ai hp-tuning-jobs describecomando:

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

Substitua o seguinte:

  • JOB_ID: o ID numérico do seu trabalho. Este ID é a última parte do campo name da tarefa. Pode ter visto o ID quando criou a tarefa. (Se não souber o ID da tarefa, pode executar o comando gcloud ai hp-tuning-jobs list e procurar a tarefa adequada.)

  • LOCATION: a região onde criou a tarefa.

REST

Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:

  • LOCATION: a região onde criou a tarefa.

  • PROJECT_ID: o seu ID do projeto.

  • JOB_ID: o ID numérico do seu trabalho. Este ID é a última parte do campo name da tarefa. Pode ter visto o ID quando criou a tarefa.

Método HTTP e URL:

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

Para enviar o seu pedido, expanda uma destas opções:

 

No resultado, procure o seguinte:

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

Se não vir o campo webAccessUris, isto pode dever-se ao facto de o Vertex AI ainda não ter começado a executar a sua tarefa. Verifique se vê JOB_STATE_RUNNING no campo state. Se o estado for JOB_STATE_QUEUED ou JOB_STATE_PENDING, aguarde um minuto e, em seguida, tente obter novamente as informações do projeto.

O Vertex AI fornece um conjunto de URIs de shell interativos para cada tentativa de ajuste de hiperparâmetros à medida que a tentativa entra no estado ACTIVE. Se quiser obter URIs de shell interativos para avaliações posteriores, obtenha novamente as informações da tarefa após o início dessas avaliações.

O exemplo anterior mostra o resultado esperado para a preparação de réplica única: um URI para o nó de preparação principal. Se estiver a realizar uma preparação distribuída, o resultado contém um URI para cada nó de preparação, identificado pelo conjunto de trabalhadores.

Por exemplo, se a sua tarefa tiver um conjunto de trabalhadores principal com uma réplica e um conjunto de trabalhadores secundário com duas réplicas, o campo webAccessUris é semelhante ao seguinte:

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

Use um shell interativo

Para usar a shell interativa para um nó de preparação, navegue para um dos URIs que encontrou na secção anterior. É apresentado um shell Bash no seu navegador, que lhe dá acesso ao sistema de ficheiros do contentor onde o Vertex AI está a executar o seu código de preparação.

As secções seguintes descrevem alguns aspetos a ter em conta ao usar a shell e apresentam alguns exemplos de ferramentas de monitorização que pode usar na shell.

Impedir que a tarefa termine

Quando a Vertex AI terminar a execução da tarefa ou da avaliação, perde imediatamente o acesso à shell interativa. Se isto acontecer, pode ver a mensagem command terminated with exit code 137 ou o shell pode deixar de responder. Se criou ficheiros no sistema de ficheiros do contentor, estes não são mantidos após a conclusão da tarefa.

Em alguns casos, pode querer prolongar intencionalmente a execução da tarefa para depurar com uma shell interativa. Por exemplo, pode adicionar código como o seguinte ao seu código de preparação para que a tarefa continue a ser executada durante, pelo menos, uma hora após a ocorrência de 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, tenha em atenção que incorre em custos de preparação da Vertex AI enquanto a tarefa continuar a ser executada.

Verifique problemas de autorizações

O ambiente de shell interativo é autenticado através das credenciais predefinidas da aplicação (ADC) para a conta de serviço que o Vertex AI usa para executar o seu código de preparação. Pode executar gcloud auth list na shell para ver mais detalhes.

Na shell, pode usar bq e outras ferramentas que suportam o ADC. Isto pode ajudar a verificar se a tarefa consegue aceder a um contentor do Cloud Storage, a uma tabela do BigQuery ou a outroGoogle Cloud recurso específico de que o seu código de preparação precisa.

Visualize a execução de Python com py-spy

py-spy permite-lhe criar perfis de um programa Python em execução sem o modificar. Para usar py-spy num shell interativo, faça o seguinte:

  1. Instale py-spy:

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

  3. Execute qualquer um dos subcomandos descritos na documentação do py-spy, usando o PID que encontrou no passo anterior.

  4. Se usar o py-spy record para criar um ficheiro SVG, copie este ficheiro para um contentor do Cloud Storage para o poder ver mais tarde no seu computador local. Por exemplo:

    gcloud storage cp profile.svg gs://BUCKET
    

    Substitua BUCKET pelo nome de um contentor ao qual tem acesso.

Analise o desempenho com o perf

perf permite-lhe analisar o desempenho do seu nó de preparação. Para instalar a versão do perf adequada ao kernel Linux do seu 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, pode executar qualquer um dos subcomandos descritos na perf documentação.

Obtenha informações sobre a utilização da GPU

Normalmente, os contentores com GPU ativada em execução em nós com GPUs têm várias ferramentas de linha de comandos pré-instaladas que podem ajudar a monitorizar a utilização da GPU. Por exemplo:

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

  • Use nvprof para recolher uma variedade de informações de criação de perfis da GPU. Uma vez que o nvprof não pode ser anexado a um processo existente, recomendamos que use a ferramenta para iniciar um processo adicional que execute o seu código de preparação. (Isto significa que o código de preparação é 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 do ponto de entrada da aplicação de preparação; por exemplo, trainer.task.

    Em seguida, transfira o ficheiro de saída para um contentor do Cloud Storage para que o possa analisar mais tarde no seu computador local. Por exemplo:

    gcloud storage cp prof.nvvp gs://BUCKET
    

    Substitua BUCKET pelo nome de um contentor ao qual tem acesso.

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

    Em seguida, transfira o relatório para um contentor do Cloud Storage para o poder analisar mais tarde no seu 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 contentor ao qual tem acesso.

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

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

Painel de controlo do Ray e shell interativa com VPC-SC + intercâmbio da VPC

  1. Configure o dispositivo 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: altere para a rede com peering.

    • LOCATION: localização pretendida (por exemplo, us-central1).

  2. Configure o dispositivo 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 seu projeto. Pode encontrar estes IDs na página de Google Cloud boas-vindas da consola.

  3. Registar transação de 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 uma tarefa de preparação com a shell interativa + o VPC-SC + o intercâmbio da VPC ativados.

O que se segue?