Supervisar y depurar el entrenamiento con una shell interactiva

Durante el entrenamiento, 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 versión del entorno de ejecución o contenedor personalizado que se ejecuta en AI Platform Training.

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 AI Platform Training. 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 ejecutes un trabajo de entrenamiento o ajuste de hiperparámetros. A medida que preparas tu código de entrenamiento y ejecutas un trabajo de entrenamiento, asegúrate de cumplir con los siguientes requisitos:

Requisitos para casos avanzados

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

  • Si adjuntas una cuenta de servicio personalizada a tu trabajo de entrenamiento, 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 trabajo 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 trabajo, también debe tener el mismo permiso iam.serviceAccounts.actAs.

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

    • No puedes usar los Controles del servicio de VPC con el intercambio de tráfico entre redes de VPC.

    • 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 ml.googleapis.com. Si solo restringes ml.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 trabajo de entrenamiento, establece el campo de la API enableWebAccess en true en el campo trainingInput del trabajo cuando crees un trabajo de entrenamiento.

En el siguiente ejemplo, se muestra cómo hacerlo mediante la adición de la marca --enable-web-access cuando se usa la CLI de gcloud. En la actualidad, no puedes crear un trabajo de entrenamiento con una shell interactiva habilitada en la consola de Google Cloud.

En el ejemplo, se supone que tienes una aplicación de entrenamiento en el sistema de archivos local dentro de un directorio llamado trainer con un módulo llamado task.

Para crear el trabajo de entrenamiento, ejecuta el siguiente comando:

  gcloud ai-platform jobs submit training JOB_ID \
    --enable-web-access \
    --job-dir=JOB_DIR \
    --module-name=trainer.task \
    --package-path=trainer \
    --python-version=3.7 \
    --region=REGION \
    --runtime-version=2.11 \
    --scale-tier=CUSTOM \
    --master-machine-type=n1-highmem-8

En este comando, reemplaza los siguientes marcadores de posición:

  • JOB_ID: Es el nombre que elijas para el trabajo.
  • JOB_DIR: Es la ruta de acceso a un directorio de Cloud Storage al que se subirá tu aplicación de entrenamiento.
  • REGION: Es la región en la que planeas crear el trabajo de entrenamiento. Ten en cuenta que debe ser una región que admita shells interactivas.

    El comando produce el siguiente resultado si se ejecuta de forma correcta:

    Job [JOB_ID] submitted successfully.
    Your job is still active. You may view the status of your job with the command
    
      $ gcloud ai-platform jobs describe JOB_ID
    
    or continue streaming the logs with the command
    
      $ gcloud ai-platform jobs stream-logs JOB_ID
    jobId: JOB_ID
    state: QUEUED
    

Obtén el URI de acceso web

Después de iniciar el entrenamiento de acuerdo con la guía de la sección anterior, usa la consola de Google Cloud o la herramienta de línea de comandos de gcloud para ver los URI que puedes usar a fin de acceder a shells interactivas. AI Platform Training proporciona un URI para cada nodo de entrenamiento que forma parte de tu trabajo.

Según el tipo de trabajo de entrenamiento que hayas creado, selecciona una de las siguientes pestañas para ver ejemplos de cómo encontrar el campo de la API de webAccessUris, que contiene un URI interactivo de la shell para cada nodo del trabajo.

Trabajo de entrenamiento

En las siguientes pestañas, se muestran diferentes formas de acceder a TrainingOutput para un trabajo de entrenamiento estándar.

gcloud

Ejecuta el comando gcloud ai-platform jobs describe:

gcloud ai-platform jobs describe JOB_ID

Reemplaza lo siguiente:

  • JOB_ID: Es el ID de tu trabajo. Configuraste este ID cuando creaste el trabajo. (Si no conoces el ID de tu trabajo, puedes ejecutar el comando gcloud ai-platform jobs list y buscar el trabajo adecuado).

En el resultado, busca el campo.

trainingOutput:
  webAccessUris:
    master-replica-0: INTERACTIVE_SHELL_URI

Consola

  1. Abre la página Trabajos de AI Platform Training en la consola de Google Cloud.

    Abrir Trabajos en la consola de Google Cloud

  2. Haz clic en el nombre de tu trabajo en la lista para abrir la página Detalles del trabajo.

  3. Haz clic en el botón Mostrar Json en la sección en la sección para expandir una vista JSON del TrainingOutput del trabajo.

En el resultado, busca el campo:

{
  "webAccessUris": {
    "master-replica-0": "INTERACTIVE_SHELL_URI"
  }
}

Si no ves el campo webAccessUris, esto podría deberse a que AI Platform Training aún no comenzó a ejecutar el trabajo o la prueba. Verifica que veas RUNNING en el campo state. Si el estado es QUEUED o PREPARING, espera un minuto. Luego, intenta volver a obtener la información del trabajo.

Trabajo de ajuste de hiperparámetros

En las siguientes pestañas, se muestran diferentes formas de acceder a TrainingOutput para un trabajo de ajuste de hiperparámetros.

gcloud

Ejecuta el comando gcloud ai-platform jobs describe:

gcloud ai-platform jobs describe JOB_ID

Reemplaza lo siguiente:

  • JOB_ID: Es el ID de tu trabajo. Configuraste este ID cuando creaste el trabajo. (Si no conoces el ID de tu trabajo, puedes ejecutar el comando gcloud ai-platform jobs list y buscar el trabajo adecuado).

En el resultado, busca el campo.

trainingOutput:
  trials:
  - trialId: '1'
    webAccessUris:
      master-replica-0: INTERACTIVE_SHELL_URI

Consola

  1. Abre la página Trabajos de AI Platform Training en la consola de Google Cloud.

    Abrir Trabajos en la consola de Google Cloud

  2. Haz clic en el nombre de tu trabajo en la lista para abrir la página Detalles del trabajo.

  3. Haz clic en el botón Mostrar Json en la sección en la sección para expandir una vista JSON del TrainingOutput del trabajo.

En el resultado, busca el campo:

{
  "trials": [
    {
      ...
      "webAccessUris": {
        "master-replica-0": "INTERACTIVE_SHELL_URI"
      }
    },
    ...
  ]
}

Si no ves el campo webAccessUris, esto podría deberse a que AI Platform Training aún no comenzó a ejecutar el trabajo o la prueba. Verifica que veas RUNNING en el campo state. Si el estado es QUEUED o PREPARING, espera un minuto. Luego, intenta volver a obtener la información del trabajo.

AI Platform Training proporciona un conjunto de URI de shell interactivos para cada prueba de ajuste de hiperparámetros a medida que la prueba entra en el estado RUNNING. Si deseas obtener los 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, que se identifica por el nombre de la tarea.

Por ejemplo, si tu trabajo tiene una instancia principal y dos trabajadores, el campo webAccessUris será similar al siguiente:

{
  "master-replica-0": "URI_FOR_PRIMARY",
  "worker-replica-0": "URI_FOR_FIRST_SECONDARY",
  "worker-replica-1": "URI_FOR_SECOND_SECONDARY"
}

Regiones disponibles

El uso de una shell interactiva para AI Platform Training es compatible con las siguientes regiones:

América

  • Oregón (us-west1)
  • Los Ángeles (us-west2)
  • Iowa (us-central1)
  • Carolina del Sur (us-east1)
  • Virginia  del Norte (us-east4)
  • Montreal (northamerica-northeast1)

Europa

  • Londres (europe-west2)
  • Bélgica (europe-west1)
  • Zúrich (europe-west6)
  • Fráncfort (europe-west3)

Asia-Pacífico

  • Singapur (asia-southeast1)
  • Taiwán (asia-east1)
  • Tokio (asia-northeast1)
  • Sídney (australia-southeast1)
  • Seúl (asia-northeast3)

AI Platform Training también proporciona regiones adicionales para el entrenamiento.

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 Bash en el navegador, lo que te brinda acceso al sistema de archivos del contenedor en el que AI Platform Training 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.

Evita que el trabajo finalice

Cuando AI Platform Training termine de ejecutar el trabajo o la prueba, perderás de inmediato el acceso a la 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 aplicarán cargos de entrenamiento de AI Platform Training mientras el trabajo se siga ejecutando.

Verifica problemas de permisos

El entorno de shell interactivo se autentica mediante credenciales predeterminadas de la aplicación (ADC) para la cuenta de servicio que AI Platform Training usa a fin de 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 mediante 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.

Obtén 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 experimentas un error de GPU (no un problema con la configuración o con AI Platform Training), 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?