Supervisa y depura el entrenamiento con una shell interactiva

En esta página, se muestra cómo 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.

También puedes usar Cloud Profiler para depurar el rendimiento del entrenamiento de modelos en los trabajos de entrenamiento personalizados. Para obtener más detalles, consulta Genera perfiles de rendimiento de entrenamiento de modelos con Profiler.

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:

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

    Todos los contenedores de entrenamiento compilados con anterioridad tienen bash instalado. Si creas un contenedor personalizado para el entrenamiento, usa un contenedor base que incluya bash o instala bash en tu Dockerfile.

  • Realiza el entrenamiento personalizado en una región que admita shells interactivas.

  • Asegúrate de que cualquier persona que desee acceder a una shell interactiva tenga los siguientes permisos para el proyecto de Google Cloud en el que se ejecuta el entrenamiento personalizado:

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

    Si inicias un entrenamiento personalizado, lo más probable es que ya tengas estos permisos y puedas acceder a una shell interactiva. Sin embargo, si deseas usar una shell interactiva para inspeccionar un recurso de entrenamiento personalizado que creó otra persona de tu organización, es posible que debas obtener estos permisos.

    Una forma de obtener estos permisos es solicitarle a un administrador de tu organización que te otorgue la función de usuario de IA de Vertex (roles/aiplatform.user).

Requisitos para casos avanzados

Si usas ciertas funciones avanzadas, cumple con los siguientes requisitos adicionales:

  • Si adjuntas una cuenta de servicio personalizada a tu recurso de entrenamiento personalizado, asegúrate de que cualquier usuario que desee acceder a una shell interactiva tenga el permiso iam.serviceAccounts.actAs para la cuenta de servicio adjunta.

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

    Por ejemplo, a fin de 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 colegas quiere ver una shell interactiva para este CustomJob, también debe tener el mismo permiso iam.serviceAccounts.actAs.

  • Si configuraste tu proyecto para usar los Controles del servicio de VPC con Vertex AI, ten en cuenta las siguientes limitaciones adicionales:

    • No puedes usar una IP privada para el entrenamiento personalizado. Si necesitas VPC-SC con intercambio de tráfico entre VPC, se requiere una configuración adicional para usar la shell interactiva. Sigue las instrucciones que se abordan en el panel de Ray y la shell interactiva con VPC-SC + intercambio de tráfico entre VPC para configurar la configuración de shell interactiva con VPC-SC y el intercambio de tráfico de VPC en tu proyecto de usuario.

    • Desde un shell interactivo, no puedes acceder a la Internet pública ni a los recursos de Google Cloud fuera del perímetro de servicio.

    • Para proteger el acceso a shells interactivos, debes agregar notebooks.googleapis.com como servicio restringido en el perímetro de servicio, además de aiplatform.googleapis.com. Si solo restringes aiplatform.googleapis.com y no notebooks.googleapis.com, los usuarios pueden acceder a shells interactivos desde máquinas fuera del perímetro de servicio, lo que reduce el beneficio de seguridad de usar los Controles del servicio de VPC.

Habilita 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 ejemplos, se muestra cómo hacerlo con varias herramientas diferentes:

Console

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

  1. Haz clic en Opciones avanzadas.

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

Luego, completa el resto del flujo de trabajo del Entrenar un modelo nuevo.

gcloud

Si deseas obtener información sobre cómo usar estos comandos, consulta la guía para crear un CustomJob y la guía sobre cómo crear un HyperparameterTuningJob.

API

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

HyperparameterTuningJob

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

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

Si deseas ver un ejemplo de cómo enviar una solicitud a la API para crear un HyperparameterTuningJob, consulta Usa el ajuste de hiperparámetros.

TrainingPipeline personalizada

En los siguientes ejemplos, se muestran cuerpos de solicitud parciales para el método de la API 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.

Python

Si deseas obtener información para instalar o actualizar el SDK de Vertex AI para Python, consulta Instala el SDK de Vertex AI para Python. Si deseas obtener más información, consulta la documentación de referencia de la API de Python.

Configura el parámetro enable_web_access como true cuando ejecutes uno de los siguientes métodos:

Después de iniciar el entrenamiento personalizado de acuerdo con las instrucciones de la sección anterior, Vertex AI genera uno o más URI que puedes usar para acceder a shells interactivos. Vertex AI genera un URI único para cada nodo de entrenamiento en tu trabajo.

Puede navegar a una shell interactiva de una de las siguientes maneras:

  • Haz clic en un vínculo en la consola de Google Cloud
  • Usa la API de Vertex AI para obtener el URI de acceso web de la shell
  1. En la sección AI de la consola de Cloud de la consola de Google Cloud, ve a una de las siguientes páginas:

  2. Haz clic en el nombre de tu recurso de entrenamiento personalizado.

    Si creaste un TrainingPipeline para el entrenamiento personalizado, haz clic en el nombre del CustomJob o HyperparameterTuningJob que creó tu TrainingPipeline. Por ejemplo, si tu canalización 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 trabajo, haz clic en Iniciar terminal web. Si tu trabajo usa varios nodos, haz clic en Iniciar terminal web junto al nodo para el que deseas una shell interactiva.

    Ten en cuenta que solo puedes acceder a una shell interactiva mientras se ejecuta el trabajo. Si no ves Iniciar terminal web, es posible que Vertex AI aún no comience a ejecutar tu trabajo o que el trabajo ya finalizó o falle. Si el Estado del trabajo es Queued o Pending, espera un minuto. Luego, intenta actualizar la página.

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

Obtén el URI de acceso web desde la API

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

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 projects.locations.customJobs.get:

gcloud

Ejecuta el comando gcloud ai custom-jobs describe:

gcloud 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 ai custom-jobs list y buscar el trabajo adecuado).

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

REST

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

gcloud

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

gcloud 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 ai hp-tuning-jobs list y buscar el trabajo adecuado).

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

REST

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: El ID del 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/v1/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 Vertex AI Training, 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 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:

    gcloud storage 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:

    gcloud storage 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:

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

Panel de Ray y shell interactivo con VPC-SC + intercambio de tráfico entre VPC

  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 con intercambio de tráfico.

    • LOCATION: La 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: ID del proyecto Puedes encontrar estos ID en la página de bienvenida de la consola de Google Cloud.

  3. Registro de la transacción 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. Envía un trabajo de entrenamiento con la shell interactiva + VPC-SC + intercambio de tráfico entre VPC habilitado.

¿Qué sigue?