Supervisa y depura el entrenamiento con una shell interactiva

Durante el entrenamiento personalizado, puedes usar una shell interactivo para inspeccionar el contenedor en el que se ejecuta tu código de entrenamiento. Puedes explorar el sistema de archivos y ejecutar utilidades de depuración en cada contenedor compilado previamente o contenedor personalizado que se ejecuta en Vertex AI.

El uso de una shell interactiva para inspeccionar el contenedor de entrenamiento puede ayudarte a depurar problemas del código de entrenamiento o la configuración de Vertex AI. Por ejemplo, puedes usar una shell interactiva para hacer lo siguiente:

  • Ejecuta herramientas de seguimiento y generación de perfiles
  • Analiza el uso de GPU
  • Verifica los permisos de Google Cloud disponibles para el contenedor

Antes de comenzar

Puedes usar una shell interactiva cuando realizas un entrenamiento personalizado con un recurso CustomJob, HyperparameterTuningJob o TrainingPipeline personalizado. A medida que preparas tu código de entrenamiento y configuras el recurso de entrenamiento personalizado que elijas, asegúrate de cumplir con los siguientes requisitos:

Habilitar shells interactivas

A fin de habilitar shells interactivos para un recurso de entrenamiento personalizado, establece el campo de API enableWebAccess en true cuando crees un CustomJob, un HyperparameterTuningJob o una TrainingPipeline personalizada.

En los siguientes cuerpos de solicitud de REST parciales, se muestra 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 v1beta1.projects.locations.customJobs.create:

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

Si deseas ver un ejemplo de envío de una solicitud a la API para crear un CustomJob, consulta Crea trabajos de entrenamiento personalizados. Sin embargo, ten en cuenta que para usar una shell interactiva, debes usar la versión v1beta1 del método de la API, no la versión v1.

HyperparameterTuningJob

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

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

Si quieres ver un ejemplo del envío de una solicitud a la API para crear un HyperparameterTuningJob, consulta Usa el ajuste de hiperparámetros. Sin embargo, ten en cuenta que para usar una shell interactiva, debes usar la versión v1beta1 del método de la API, no la versión v1.

TrainingPipeline personalizada

En los siguientes ejemplos, se muestran cuerpos de solicitud parciales para el método de la API v1beta1.projects.locations.trainingPipelines.create. Selecciona una de las siguientes pestañas, según si usas el ajuste de hiperparámetros:

Sin ajuste de hiperparámetros

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

Con ajuste de hiperparámetros

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

Si deseas obtener un ejemplo del envío de una solicitud a la API para crear una TrainingPipeline personalizada, consulta Crea canalizaciones de entrenamiento. Sin embargo, ten en cuenta que para usar una shell interactiva, debes usar la versión v1beta1 del método de la API, no la versión v1.

Obtén el URI de acceso web

Después de iniciar el entrenamiento personalizado de acuerdo con la guía de la sección anterior, usa elmétodo de la API v1beta1.projects.locations.customJobs.get o elmétodo de la API v1beta1.projects.locations.hyperparameterTuningJobs.get si quieres ver los URI que puedes usar para acceder a shells interactivos. Vertex AI proporciona un URI para cada nodo de entrenamiento que forma parte de tu trabajo.

Según el tipo de recurso de entrenamiento personalizado que uses, 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 del trabajo

CustomJob

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

gcloud

Ejecuta el comando gcloud beta ai custom-jobs describe:

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

Reemplaza lo siguiente:

  • JOB_ID: el ID numérico de tu trabajo. Este ID es la última parte del campo name del trabajo. Es posible que hayas visto el ID cuando creaste el trabajo. (Si no conoces el ID de tu trabajo, puedes ejecutar el comando gcloud beta ai custom-jobs list y buscar el trabajo adecuado).

  • LOCATION: La región en la que creaste el trabajo.

LÍNEA DE REST Y CMD

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • LOCATION: La región en la que creaste el trabajo.

  • PROJECT_ID: Tu ID del proyecto o número de proyecto.

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

Método HTTP y URL:

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

Para enviar tu solicitud, expande una de estas opciones:

 

En el resultado, busca lo siguiente:

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

Si no ves el campo webAccessUris, es posible que Vertex AI aún no comience a ejecutar tu trabajo. Verifica que veas JOB_STATE_RUNNING en el campo state. Si el estado es JOB_STATE_QUEUED o JOB_STATE_PENDING, espera un minuto. Luego, intenta obtener la información del proyecto nuevamente.

HyperparameterTuningJob

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

gcloud

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

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

Reemplaza lo siguiente:

  • JOB_ID: el ID numérico de tu trabajo. Este ID es la última parte del campo name del trabajo. Es posible que hayas visto el ID cuando creaste el trabajo. (Si no conoces el ID de tu trabajo, puedes ejecutar el comando gcloud beta ai hp-tuning-jobs list y buscar el trabajo adecuado).

  • LOCATION: La región en la que creaste el trabajo.

LÍNEA DE REST Y CMD

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • LOCATION: La región en la que creaste el trabajo.

  • PROJECT_ID: Tu ID del proyecto o número de proyecto.

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

Método HTTP y URL:

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

Para enviar tu solicitud, expande una de estas opciones:

 

En el resultado, busca lo siguiente:

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

Si no ves el campo webAccessUris, es posible que Vertex AI aún no comience a ejecutar tu trabajo. Verifica que veas JOB_STATE_RUNNING en el campo state. Si el estado es JOB_STATE_QUEUED o JOB_STATE_PENDING, espera un minuto. Luego, intenta obtener la información del proyecto nuevamente.

Vertex AI proporciona un conjunto de URI de shell interactivos para cada prueba de ajuste de hiperparámetros a medida que la prueba ingresa al estado ACTIVE. Si deseas obtener URI de shell interactivos para pruebas posteriores, vuelve a obtener la información del trabajo después de que se inicien esas pruebas.

En el ejemplo anterior, se muestra el resultado esperado para el 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 principales con una réplica y un grupo de trabajadores secundario con dos réplicas, el campo webAccessUris será similar al siguiente:

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

Usa una shell interactiva

A fin de usar la shell interactiva para un nodo de entrenamiento, navega a uno de los URI que encontraste en la sección anterior. Aparece una shell de Bash en el navegador, lo que te brinda acceso al sistema de archivos del contenedor en el que Vertex AI ejecuta el código de entrenamiento.

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

Evitar que finalice el trabajo

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

En algunos casos, es posible que desees que tu trabajo se ejecute a propósito para poder depurar con una shell interactiva. Por ejemplo, puedes agregar código como el siguiente a tu código de entrenamiento para que el trabajo se siga ejecutando 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 aplican cargos de entrenamiento de Vertex AI, siempre y cuando el trabajo se siga ejecutando.

Verifica los problemas de permisos

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

En la shell, puedes usar gsutil, bq y otras herramientas compatibles con ADC. Esto puede ayudarte a verificar que el trabajo pueda acceder a un bucket de Cloud Storage en particular, a una tabla de BigQuery o a otro recurso de Google Cloud que tu código de entrenamiento necesita.

Visualiza la ejecución de Python con py-spy

py-spy te permite generar un perfil de un programa de Python en ejecución sin modificarlo. Para usar py-spy en una shell interactiva, haz lo siguiente:

  1. Instala py-spy:

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

  3. Ejecuta cualquiera de los subcomandos que se describen en la documentación de py-spy con el PID que encontraste en el paso anterior.

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

    gsutil cp profile.svg gs://BUCKET
    

    Reemplaza BUCKET por el nombre de un bucket al que tienes acceso.

Analiza el rendimiento con perf

perf te permite analizar el rendimiento de tu nodo de entrenamiento. Si quieres 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 de esto, puedes ejecutar cualquiera de los subcomandos que se describen en la documentación de perf.

Recupera información sobre el uso de GPU

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

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

  • Usa nvprof para recopilar una variedad de información de generación de perfiles de GPU. Dado que nvprof no puede adjuntarse a un proceso existente, tal vez quieras usar la herramienta para iniciar un proceso adicional que ejecuta tu código de entrenamiento. (Esto significa que tu código de entrenamiento se ejecutará dos veces en el nodo). Por ejemplo:

    nvprof -o prof.nvvp python3 -m MODULE_NAME
    

    Reemplaza MODULE_NAME por el nombre completamente calificado del módulo de punto de entrada de la aplicación de entrenamiento; por ejemplo, trainer.task.

    Luego, transfiere el archivo de salida a un bucket de Cloud Storage para que puedas analizarlo más tarde en tu computadora local. Por ejemplo:

    gsutil cp prof.nvvp gs://BUCKET
    

    Reemplaza BUCKET por el nombre de un bucket al que tienes acceso.

  • Si encuentras 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.

    Luego, transfiere el informe a un bucket de Cloud Storage para que puedas analizarlo más tarde en tu computadora local o enviarlo a NVIDIA. Por ejemplo:

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

    Reemplaza BUCKET por el nombre de un bucket al que tienes acceso.

Si bash no puede encontrar ninguno de estos comandos de NVIDIA, intenta agregar /usr/local/nvidia/bin y /usr/local/cuda/bin al PATH de la shell:

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

¿Qué sigue?