Monitorizar y depurar entrenamientos con un shell interactivo

En esta página se explica cómo usar un shell interactivo para inspeccionar el contenedor en el que se ejecuta el código de entrenamiento. Puedes examinar el sistema de archivos y ejecutar utilidades de depuración en cada contenedor precompilado o contenedor personalizado que se ejecute en Vertex AI.

Usar una shell interactiva para inspeccionar tu contenedor de entrenamiento puede ayudarte a depurar problemas con tu código de entrenamiento o tu configuración de Vertex AI. Por ejemplo, puedes usar un shell interactivo para hacer lo siguiente:

  • Ejecuta herramientas de seguimiento y creación de perfiles.
  • Analiza el uso de la GPU.
  • Consulta los Google Cloud permisos disponibles para el contenedor.

También puedes usar Cloud Profiler para depurar el rendimiento del entrenamiento de modelos en tus tareas de entrenamiento personalizadas. Para obtener más información, consulta Rendimiento del entrenamiento del modelo de perfil con Profiler.

Antes de empezar

Puedes usar un shell interactivo cuando realices un entrenamiento personalizado con un recurso CustomJob, un recurso HyperparameterTuningJob o un recurso TrainingPipeline personalizado. Mientras preparas el código de entrenamiento y configuras el recurso de entrenamiento personalizado que elijas, asegúrate de cumplir los siguientes requisitos:

  • Asegúrate de que tu contenedor de entrenamiento tenga instalado bash.

    Todos los contenedores de entrenamiento prediseñados tienen bash instalado. Si crea un contenedor personalizado para el entrenamiento, utilice un contenedor base que incluya bash o instale bash en su Dockerfile.

  • Realiza un entrenamiento personalizado en una región que admita shells interactivos.

  • Asegúrate de que cualquier persona que quiera acceder a una shell interactiva tenga los siguientes permisos en el Google Cloud proyecto en el que se esté ejecutando el entrenamiento personalizado:

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

    Si inicias el entrenamiento personalizado por tu cuenta, es muy probable que ya tengas estos permisos y puedas acceder a una shell interactiva. Sin embargo, si quieres usar una shell interactiva para inspeccionar un recurso de entrenamiento personalizado creado por otra persona de tu organización, es posible que tengas que obtener estos permisos.

    Una forma de obtener estos permisos es pedirle a un administrador de tu organización que te conceda el rol de usuario de Vertex AI (roles/aiplatform.user).

Requisitos para casos avanzados

Si utilizas determinadas funciones avanzadas, debes cumplir los siguientes requisitos adicionales:

  • Si adjuntas una cuenta de servicio personalizada a tu recurso de entrenamiento personalizado, asegúrate de que todos los usuarios que quieran acceder a una shell interactiva tengan el permiso iam.serviceAccounts.actAs para la cuenta de servicio adjunta.

    En la guía sobre cuentas de servicio personalizadas se indica que debes tener este permiso para adjuntar una cuenta de servicio. También necesitas este permiso para ver una shell interactiva durante el entrenamiento personalizado.

    Por ejemplo, para crear un CustomJob con una cuenta de servicio adjunta, debes tener el permiso iam.serviceAccounts.actAs para la cuenta de servicio. Si uno de tus compañeros quiere ver una shell interactiva para este CustomJob, también debe tener el mismo permiso iam.serviceAccounts.actAs.

  • Si has configurado tu proyecto para usar Controles de Servicio de VPC con Vertex AI, ten en cuenta las siguientes limitaciones adicionales:

    • No puedes usar IPs privadas para el entrenamiento personalizado. Si necesitas VPC-SC con el emparejamiento entre VPCs, debes realizar una configuración adicional para usar la shell interactiva. Sigue las instrucciones que se indican en Panel de control de Ray y shell interactivo con VPC-SC y emparejamiento de VPC para configurar el shell interactivo con VPC-SC y el emparejamiento de VPC en tu proyecto de usuario.

    • Desde una shell interactiva, no puedes acceder a Internet público ni aGoogle Cloud recursos que estén fuera de tu perímetro de servicio.

    • Para proteger el acceso a shells interactivos, debes añadir notebooks.googleapis.com como servicio restringido en tu perímetro de servicio, además de aiplatform.googleapis.com. Si solo restringes aiplatform.googleapis.com y no notebooks.googleapis.com, los usuarios podrán acceder a shells interactivos desde máquinas que estén fuera del perímetro del servicio, lo que reduce la ventaja de seguridad de usar Controles de Servicio de VPC.

Habilitar shells interactivos

Para habilitar shells interactivos en un recurso de entrenamiento personalizado, asigna el valor true al campo enableWebAccess API cuando crees un CustomJob, un HyperparameterTuningJob o un TrainingPipeline personalizado.

En los siguientes ejemplos se muestra cómo hacerlo con varias herramientas diferentes:

Consola

Sigue la guía para crear un TrainingPipeline personalizado en la consola Google Cloud . En el panel Entrenar nuevo modelo, cuando llegues al paso Detalles del modelo, haz lo siguiente:

  1. Haz clic en Advanced options (Opciones avanzadas).

  2. Selecciona la casilla Habilitar depuración de entrenamiento.

A continuación, completa el resto del flujo de trabajo Entrenar modelo nuevo.

gcloud

Para saber cómo usar estos comandos, consulta la guía para crear un CustomJob y la guía para crear un HyperparameterTuningJob.

API

Los siguientes cuerpos de solicitud REST parciales muestran dónde especificar el campo enableWebAccess para cada tipo de recurso de entrenamiento personalizado:

CustomJob

El siguiente ejemplo es un cuerpo de solicitud parcial para el método de la API projects.locations.customJobs.create:

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

Para ver un ejemplo de cómo enviar una solicitud de API para crear un CustomJob, consulta Crear trabajos de entrenamiento personalizados.

HyperparameterTuningJob

El siguiente ejemplo es un cuerpo de solicitud parcial para el método de la API projects.locations.hyperparameterTuningJobs.create:

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

Para ver un ejemplo de cómo enviar una solicitud de API para crear un HyperparameterTuningJob, consulta Usar el ajuste de hiperparámetros.

Custom TrainingPipeline

En los ejemplos siguientes se muestran cuerpos de solicitud parciales del método de la API projects.locations.trainingPipelines.create. Selecciona una de las siguientes pestañas, en función de si usas la optimización de hiperparámetros:

Sin ajuste de hiperparámetros

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

Con ajuste de hiperparámetros

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

Para ver un ejemplo de cómo enviar una solicitud de API para crear un TrainingPipeline personalizado, consulta Crear canalizaciones de entrenamiento.

Python

Para saber cómo instalar o actualizar el SDK de Vertex AI para Python, consulta Instalar el SDK de Vertex AI para Python. Para obtener más información, consulta la documentación de referencia de la API Python.

Asigne el valor true al parámetro enable_web_access cuando ejecute uno de los siguientes métodos:

Después de iniciar el entrenamiento personalizado siguiendo las instrucciones de la sección anterior, Vertex AI genera uno o varios URIs que puedes usar para acceder a shells interactivos. Vertex AI genera un URI único para cada nodo de entrenamiento de tu tarea.

Puedes ir a un shell interactivo de una de las siguientes formas:

  • Hacer clic en un enlace de la Google Cloud consola
  • Usar la API Vertex AI para obtener el URI de acceso web del shell
  1. En la Google Cloud consola, en la sección Vertex AI, ve a una de las siguientes páginas:

  2. Haga clic en el nombre del recurso de formación personalizado.

    Si has creado un TrainingPipeline para el entrenamiento personalizado, haz clic en el nombre del CustomJob o del HyperparameterTuningJob que haya creado tu TrainingPipeline. Por ejemplo, si tu canal tiene el nombre PIPELINE_NAME, podría llamarse PIPELINE_NAME-custom-job o PIPELINE_NAME-hyperparameter-tuning-job.

  3. En la página de tu tarea, haz clic en Iniciar terminal web. Si tu trabajo usa varios nodos, haz clic en Iniciar terminal web junto al nodo para el que quieras obtener un shell interactivo.

    Ten en cuenta que solo puedes acceder a una shell interactiva mientras se esté ejecutando el trabajo. Si no ves la opción Iniciar terminal web, puede deberse a que Vertex AI aún no ha empezado a ejecutar tu trabajo o a que el trabajo ya ha finalizado o ha fallado. Si el Estado del trabajo es Queued o Pending, espera un minuto y, a continuación, prueba a actualizar la página.

    Si usas el ajuste de hiperparámetros, hay enlaces Iniciar terminal web independientes para cada prueba.

Obtener el URI de acceso web de la API

Usa el método de la API projects.locations.customJobs.get o el método de la API projects.locations.hyperparameterTuningJobs.get para ver los URIs que puedes usar para acceder a shells interactivos.

En función del tipo de recurso de entrenamiento personalizado que utilices, selecciona una de las siguientes pestañas para ver ejemplos de cómo encontrar el campo de la API webAccessUris, que contiene un URI de shell interactivo para cada nodo de tu trabajo:

CustomJob

En las siguientes pestañas se muestran diferentes formas de enviar una solicitud projects.locations.customJobs.get:

gcloud

Ejecuta el gcloud ai custom-jobs describe comando:

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

Haz los cambios siguientes:

  • JOB_ID: ID numérico de tu trabajo. Este ID es la última parte del campo name del trabajo. Es posible que hayas visto el ID al crear el trabajo. Si no sabes cuál es el ID de tu trabajo, puedes ejecutar el comando gcloud ai custom-jobs list y buscar el trabajo adecuado.

  • LOCATION: la región en la que has creado el trabajo.

REST

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • LOCATION: la región en la que has creado el trabajo.

  • PROJECT_ID: tu ID de proyecto.

  • JOB_ID: ID numérico de tu trabajo. Este ID es la última parte del campo name del trabajo. Es posible que hayas visto el ID al crear el trabajo.

Método HTTP y URL:

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

Para enviar tu solicitud, despliega una de estas opciones:

 

En la salida, busca lo siguiente:

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

Si no ves el campo webAccessUris, puede deberse a que Vertex AI aún no ha empezado a ejecutar tu trabajo. Comprueba que veas JOB_STATE_RUNNING en el campo state. Si el estado es JOB_STATE_QUEUED o JOB_STATE_PENDING, espera un minuto y vuelve a intentar obtener la información del proyecto.

HyperparameterTuningJob

En las siguientes pestañas se muestran diferentes formas de enviar una solicitud projects.locations.hyperparameterTuningJobs.get:

gcloud

Ejecuta el gcloud ai hp-tuning-jobs describe comando:

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

Haz los cambios siguientes:

  • JOB_ID: ID numérico de tu trabajo. Este ID es la última parte del campo name del trabajo. Es posible que hayas visto el ID al crear el trabajo. Si no sabes cuál es el ID de tu trabajo, puedes ejecutar el comando gcloud ai hp-tuning-jobs list y buscar el trabajo adecuado.

  • LOCATION: la región en la que has creado el trabajo.

REST

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • LOCATION: la región en la que has creado el trabajo.

  • PROJECT_ID: tu ID de proyecto.

  • JOB_ID: ID numérico de tu trabajo. Este ID es la última parte del campo name del trabajo. Es posible que hayas visto el ID al crear el trabajo.

Método HTTP y URL:

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

Para enviar tu solicitud, despliega una de estas opciones:

 

En la salida, busca lo siguiente:

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

Si no ves el campo webAccessUris, puede deberse a que Vertex AI aún no ha empezado a ejecutar tu trabajo. Comprueba que veas JOB_STATE_RUNNING en el campo state. Si el estado es JOB_STATE_QUEUED o JOB_STATE_PENDING, espera un minuto y vuelve a intentar obtener la información del proyecto.

Vertex AI proporciona un conjunto de URIs de shell interactivos para cada prueba de ajuste de hiperparámetros cuando la prueba pasa al estado ACTIVE. Si quieres obtener URIs de shell interactivos para pruebas posteriores, vuelve a obtener la información del trabajo después de que empiecen esas pruebas.

En el ejemplo anterior se muestra el resultado esperado del entrenamiento de una sola réplica: un URI para el nodo de entrenamiento principal. Si realizas un entrenamiento distribuido, el resultado contiene un URI para cada nodo de entrenamiento, identificado por el grupo de trabajadores.

Por ejemplo, si tu trabajo tiene un grupo de trabajadores principal con una réplica y un grupo de trabajadores secundario con dos réplicas, el campo webAccessUris tendrá un aspecto similar al siguiente:

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

Usar un shell interactivo

Para usar la shell interactiva de un nodo de entrenamiento, ve a una de las URIs que has encontrado en la sección anterior. Aparecerá un shell de Bash en tu navegador, que te dará acceso al sistema de archivos del contenedor en el que Vertex AI ejecuta tu código de entrenamiento.

En las siguientes secciones se describen algunos aspectos que debes tener en cuenta al usar la shell y se proporcionan algunos ejemplos de herramientas de monitorización que puedes usar en la shell.

Evitar que finalice el trabajo

Cuando Vertex AI termine de ejecutar tu tarea o prueba, perderás inmediatamente el acceso a tu shell interactivo. Si esto ocurre, es posible que veas el mensaje command terminated with exit code 137 o que la shell deje de responder. Si has creado algún archivo en el sistema de archivos del contenedor, no se conservará después de que finalice el trabajo.

En algunos casos, puede que quieras que tu trabajo se ejecute durante más tiempo para depurarlo con una shell interactiva. Por ejemplo, puede añadir un código como el siguiente al código de entrenamiento para que el trabajo siga ejecutándose durante al menos una hora después de que se produzca una excepción:

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

Sin embargo, ten en cuenta que se te aplicarán cargos de Vertex AI Training mientras la tarea siga en ejecución.

Comprobar problemas de permisos

El entorno de shell interactivo se autentica mediante credenciales predeterminadas de la aplicación (ADC) para la cuenta de servicio que usa Vertex AI para ejecutar tu código de entrenamiento. Puedes ejecutar gcloud auth list en el shell para obtener más información.

En el shell, puedes usar bq y otras herramientas que admitan ADC. Esto puede ayudarte a verificar que la tarea puede acceder a un segmento de Cloud Storage, una tabla de BigQuery u otroGoogle Cloud recurso concreto que necesite tu código de entrenamiento.

Visualizar la ejecución de Python con py-spy

py-spy te permite crear un perfil de un programa Python en ejecución sin modificarlo. Para usar py-spy en un shell interactivo, sigue estos pasos:

  1. Instalar py-spy:

    pip3 install py-spy
    
  2. Ejecuta ps aux en el shell y busca el PID del programa de entrenamiento de Python.

  3. Ejecuta cualquiera de los subcomandos descritos en la documentación de py-spy, con el PID que has encontrado en el paso anterior.

  4. Si usas py-spy record para crear un archivo SVG, copia este archivo en un segmento de Cloud Storage para poder verlo más adelante en tu ordenador local. Por ejemplo:

    gcloud storage cp profile.svg gs://BUCKET
    

    Sustituye BUCKET por el nombre de un segmento al que tengas acceso.

Analizar el rendimiento con perf

perf te permite analizar el rendimiento de tu nodo de entrenamiento. Para instalar la versión de perf adecuada para el kernel de Linux de tu nodo, ejecuta los siguientes 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

Después, puedes ejecutar cualquiera de los subcomandos descritos en la perf documentación.

Obtener información sobre el uso de la GPU

Los contenedores habilitados para GPU que se ejecutan en nodos con GPUs suelen tener preinstaladas varias herramientas de línea de comandos que pueden ayudarte a monitorizar el uso de la GPU. Por ejemplo:

  • Usa nvidia-smi para monitorizar el uso de la GPU de varios procesos.

  • Usa nvprof para recoger información variada sobre el perfil de la GPU. Como nvprof no puede asociarse a un proceso ya iniciado, puede que quieras usar la herramienta para iniciar un proceso adicional que ejecute tu código de entrenamiento. Esto significa que el código de entrenamiento se ejecutará dos veces en el nodo. Por ejemplo:

    nvprof -o prof.nvvp python3 -m MODULE_NAME
    

    Sustituye MODULE_NAME por el nombre completo del módulo del punto de entrada de tu aplicación de entrenamiento; por ejemplo, trainer.task.

    Después, transfiere el archivo de salida a un segmento de Cloud Storage para poder analizarlo más adelante en tu ordenador local. Por ejemplo:

    gcloud storage cp prof.nvvp gs://BUCKET
    

    Sustituye BUCKET por el nombre de un segmento al que tengas acceso.

  • Si se produce un error de GPU (no un problema con tu configuración o con Vertex AI), usa nvidia-bug-report.sh para crear un informe de errores.

    A continuación, transfiere el informe a un segmento de Cloud Storage para poder analizarlo más adelante en tu ordenador local o enviarlo a NVIDIA. Por ejemplo:

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

    Sustituye BUCKET por el nombre de un segmento al que tengas acceso.

Si bash no encuentra ninguno de estos comandos de NVIDIA, prueba a añadir /usr/local/nvidia/bin y /usr/local/cuda/bin al PATH del shell:

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

Panel de control de Ray y shell interactivo con VPC-SC y emparejamiento entre VPCs

  1. Configura 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: cambia a la red emparejada.

    • LOCATION: ubicación deseada (por ejemplo, us-central1).

  2. Configura 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: tu ID de proyecto. Puedes encontrar estos IDs en la página de bienvenida de la Google Cloud consola.

  3. Registra la transacción 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. Envía un trabajo de entrenamiento con el shell interactivo, VPC-SC y el emparejamiento de VPC habilitados.

Siguientes pasos