Prepara el código de capacitación

Realiza la capacitación personalizada en Vertex AI para ejecutar tu propio código de capacitación del aprendizaje automático (AA) en la nube, en lugar de usar AutoML. En este documento, se describen las prácticas recomendadas que debes tener en cuenta cuando escribes el código de capacitación.

Elige una estructura de código de capacitación

Primero, determina qué estructura deseas que tome tu código de capacitación del AA. Puedes proporcionar un código de capacitación a Vertex AI de una de las siguientes formas:

  • Una secuencia de comandos de Python para usar con un contenedor ya compilado. Usa el SDK de Vertex AI para crear un trabajo personalizado. Este método te permite proporcionar la aplicación de capacitación como una secuencia de comandos de Python única.

  • Una aplicación de capacitación de Python para usar con un contenedor compilado previamente. Crea una distribución de fuente de Python con código que entrene un modelo de AA y lo exporte a Cloud Storage. Esta aplicación de capacitación puede usar cualquiera de las dependencias incluidas en el contenedor compilado previamente con el que planeas usarlas.

    Usa esta opción si uno de los contenedores compilados previamente para la capacitación de Vertex AI incluye todas las dependencias que necesitas para la capacitación. Por ejemplo, si deseas entrenar con PyTorch, scikit-learn, TensorFlow o XGBoost, es probable que esta sea la mejor opción.

    A fin de obtener información sobre las prácticas recomendadas específicas de esta opción, consulta la guía para crear una aplicación de capacitación de Python.

  • Una imagen de contenedor personalizada Crea una imagen de contenedor de Docker con código que entrene un modelo del AA y lo exporte a Cloud Storage. Incluye cualquier dependencia requerida por el código en la imagen de contenedor.

    Usa esta opción si deseas usar dependencias que no están incluidas en uno de los contenedores compilados previamente para la capacitación de Vertex AI. Por ejemplo, si deseas entrenar con un framework de AA de Python que no está disponible en un contenedor compilado previamente o si deseas entrenar con un lenguaje de programación que no sea Python, esto es la mejor opción.

    A fin de obtener más información sobre las prácticas recomendadas específicas de esta opción, lee la guía para crear una imagen de contenedor personalizada.

En el resto de este documento, se describen las prácticas recomendadas para ambas estructuras de código de capacitación.

Prácticas recomendadas para todo el código de capacitación personalizada

Cuando escribas un código de capacitación personalizada para Vertex AI, ten en cuenta que el código se ejecutará en una o más instancias de máquina virtual (VMs) administradas por Google Cloud. En esta sección, se describen las prácticas recomendadas para todo el código de capacitación personalizada.

Accede a los servicios de Google Cloud en tu código

En varias de las siguientes secciones, se describe el acceso a otros servicios de Google Cloud desde tu código. Para acceder a los servicios de Google Cloud, escribe el código de capacitación para usar las credenciales predeterminadas de la aplicación (ADC). Muchas bibliotecas cliente de Google Cloud se autentican con ADC de forma predeterminada. No necesitas configurar ninguna variable de entorno; Vertex AI configura de forma automática las ADC para que se autentiquen como el Agente de servicio del código personalizado de Vertex AI para tu proyecto (de forma predeterminada) o una cuenta de servicio personalizada (si configuraste una).

Sin embargo, cuando usas una biblioteca cliente de Google Cloud en tu código, es posible que Vertex AI no siempre se conecte al proyecto de Google Cloud correcto de forma predeterminada. Si te encuentras con errores de permiso, conectarte con el proyecto equivocado puede ser el problema.

Este problema ocurre porque Vertex AI no ejecuta tu código directamente en tu proyecto de Google Cloud. En cambio, Vertex AI ejecuta tu código en uno de los diversos proyectos que administra Google. Vertex AI usa estos proyectos exclusivamente para operaciones relacionadas con tu proyecto. Por lo tanto, no intentes inferir el ID del proyecto del entorno en el código de capacitación o predicción. Especifica los ID del proyecto de forma explícita.

Si no deseas codificar un ID del proyecto en tu código de capacitación, puedes hacer referencia a la variable de entorno CLOUD_ML_PROJECT_ID: Vertex AI establece esta variable de entorno en cada contenedor de capacitación personalizada para que contenga el número del proyecto en el que iniciaste la capacitación personalizada. Muchas herramientas de Google Cloud aceptan un número de proyecto cada vez que tomen un ID del proyecto.

Si deseas usar el cliente de Python para Google BigQuery para acceder a una tabla de BigQuery en el mismo proyecto, no intentes inferir el proyecto en tu código de capacitación:

Selección implícita del proyecto

from google.cloud import bigquery

client = bigquery.Client()

En su lugar, usa un código que elija de manera explícita un proyecto:

Selección explícita del proyecto

import os

from google.cloud import bigquery

project_number = os.environ["CLOUD_ML_PROJECT_ID"]

client = bigquery.Client(project=project_number)

Si te encuentras con errores después de configurar tu código de esta manera, lee la siguiente sección sobre a qué recursos puede acceder tu código para ajustar los permisos disponibles para tu código de capacitación.

A qué recursos puede acceder tu código

De forma predeterminada, la aplicación de capacitación puede acceder a cualquier recurso de Google Cloud que esté disponible para el agente de servicio del código personalizado (CCSA) de Vertex AI de tu proyecto. Puedes otorgar a la CCSA y, por lo tanto, tu aplicación de capacitación acceso a una cantidad limitada de otros recursos si sigues las instrucciones en Otorga a los agentes de servicio de Vertex AI acceso a otros recursos. Si tu aplicación de capacitación necesita más que acceso de nivel de lectura a los recursos de Google Cloud que no aparecen en esa página, debes adquirir un token de acceso de OAuth 2.0 con el permiso https://www.googleapis.com/auth/cloud-platform, lo que solo se puede hacer con una cuenta de servicio personalizada.

Por ejemplo, considera el acceso del código de capacitación a los recursos de Cloud Storage:

De forma predeterminada, Vertex AI puede acceder a cualquier bucket de Cloud Storage en el proyecto de Google Cloud en el que realizas un capacitación personalizada. También puedes otorgar acceso a la IA de Vertex a los buckets de Cloud Storage en otros proyectos o puedes personalizar con precisión a qué depósitos puede acceder un trabajo específico Usar una cuenta de servicio personalizada.

Lectura y escritura de archivos de Cloud Storage con Cloud Storage FUSE.

En todos los trabajos de capacitación personalizada, Vertex AI activa buckets de Cloud Storage a los que tienes acceso en el directorio /gcs/ del sistema de archivos de cada nodo de capacitación. Como alternativa conveniente al uso del cliente de Python para Cloud Storage o alguna otra biblioteca para acceder a Cloud Storage, puedes leer y escribir directamente en el sistema de archivos local para leer datos desde Cloud Storage o escribir datos a Cloud Storage. Por ejemplo, para cargar datos desde gs://BUCKET/data.csv, puedes usar el siguiente código de Python:

file = open('/gcs/BUCKET/data.csv', 'r')

Vertex AI usa Cloud Storage FUSE para activar los buckets de almacenamiento. Ten en cuenta que los directorios activados por Cloud Storage FUSE no cumplen con POSIX.

Las credenciales que usas para la capacitación personalizada determinan a qué buckets puedes acceder de esta manera. En la sección anterior sobre a qué recursos puedes acceder con código, se describe con exactitud a qué buckets puedes acceder de forma predeterminada y cómo personalizar este acceso.

Cargar datos de entrada

Por lo general, el código del AA funciona en datos de capacitación para entrenar un modelo. No almacenes datos de capacitación junto con tu código, ya sea que crees una aplicación de capacitación de Python o una imagen de contenedor personalizada. Almacenar datos con código puede llevar a un proyecto mal organizado, dificultar la reutilización del código en diferentes conjuntos de datos y generar errores para grandes conjuntos de datos.

Puedes cargar datos desde un conjunto de datos administrado de Vertex AI o escribir tu propio código para cargar datos desde una fuente fuera de Vertex AI, como BigQuery o Cloud Storage.

Para obtener el mejor rendimiento cuando cargas datos desde Cloud Storage, usa un bucket en la región en la que realizas la capacitación personalizada. Para obtener información sobre cómo almacenar datos en Cloud Storage, consulta Crea buckets de almacenamiento y Sube objetos.

Para obtener información sobre desde qué buckets de Cloud Storage puedes cargar datos, lee la sección anterior sobre a qué recursos puede acceder tu código.

Para cargar datos desde Cloud Storage en tu código de capacitación, usa la función de Cloud Storage FUSE descrita en la sección anterior o usa cualquier biblioteca que admita ADC. No es necesario que proporciones de forma explícita ninguna credencial de autenticación en el código.

Por ejemplo, puedes usar una de las bibliotecas cliente que se demuestran en la guía de Cloud Storage para Descargar objetos. En particular, el cliente de Python para Cloud Storage se incluye en contenedores compilados previamente. La clase tf.io.gfile.GFile de TensorFlow también admite ADC.

Carga un conjunto de datos grande

Según los tipos de máquinas que planees usar durante la capacitación personalizada, es posible que las VMs no puedan cargar la totalidad de un conjunto de datos grande en la memoria.

Si necesitas leer datos que son demasiado grandes para caber en la memoria, transmítelos o léelos de forma incremental. Los diferentes frameworks del AA tienen diferentes prácticas recomendadas para hacerlo. Por ejemplo, la clase tf.data.Dataset de TensorFlow puede transmitir datos TFRecord o de texto desde Cloud Storage.

El capacitación personalizada en varias VMs con paralelismo de datos es otra forma de reducir la cantidad de datos que carga cada VM en la memoria. Consulta la sección Escribe código para la capacitación distribuida de este documento.

Exporta un modelo entrenado del AA

Por lo general, el código del AA exporta un modelo entrenado al final de la capacitación en forma de uno o más artefactos de modelo. Luego, puedes usar los artefactos del modelo para obtener predicciones.

Una vez finalizada la capacitación personalizada, ya no podrás acceder a las VMs que ejecutó el código de capacitación. Por lo tanto, tu código de capacitación debe exportar artefactos de modelo a una ubicación fuera de Vertex AI.

Recomendamos que exportes los artefactos del modelo a un bucket de Cloud Storage. Como se describe en la sección anterior sobre los recursos a los que puede acceder el código, Vertex AI puede acceder a cualquier bucket de Cloud Storage en el proyecto de Google Cloud en el que haces la capacitación personalizada. Usa una biblioteca que admita ADC para exportar tus artefactos del modelo. Por ejemplo, las APIs de TensorFlow para guardar modelos de Keras pueden exportar artefactos directamente a una ruta de Cloud Storage.

Si deseas usar tu modelo entrenado para entregar predicciones en Vertex AI, tu código debe exportar artefactos del modelo en un formato compatible con uno de los contenedores compilados previamente para la predicción. Obtén más información en la guía para exportar artefactos del modelo para la predicción.

Variables de entorno para directorios especiales de Cloud Storage

Si especificas el campo de API baseOutputDirectory, Vertex AI configura las siguientes variables de entorno cuando ejecuta tu código de capacitación:

Los valores de estas variables de entorno difieren un poco según si usas el ajuste de hiperparámetros. Si deseas obtener más información, consulta la referencia de la API para baseOutputDirectory.

Usar estas variables de entorno facilita la reutilización del mismo código de capacitación varias veces (por ejemplo, con diferentes opciones de configuración o datos) y guarda artefactos y puntos de control del modelo en diferentes ubicaciones, con solo cambiar el campo de API baseOutputDirectory. Sin embargo, no es necesario usar las variables de entorno en tu código si no lo deseas. Por ejemplo, puedes codificar ubicaciones para guardar puntos de control y exportar artefactos del modelo.

Además, si usas una TrainingPipeline para capacitaciones personalizadas y no especificas el campo modelToUpload.artifactUri, Vertex AI usa el valor de la variable de entorno AIP_MODEL_DIR para modelToUpload.artifactUri. (Para el ajuste de hiperparámetros, Vertex AI usa el valor de la variable de entorno AIP_MODEL_DIR de la mejor prueba).

Garantiza la resiliencia ante los reinicios

En ocasiones, las VMs que ejecutan tu código de capacitación se reinician. Por ejemplo, Google Cloud podría necesitar reiniciar una VM por motivos de mantenimiento. Cuando una VM se reinicia, Vertex AI vuelve a ejecutar el código desde el inicio.

Si esperas que tu código de capacitación se ejecute durante más de cuatro horas, agrega varios comportamientos a tu código para que sea resistente a los reinicios:

  • Exporta con frecuencia el progreso de la capacitación a Cloud Storage, al menos una vez cada cuatro horas, para que no pierdas el progreso si las VMs se reinician.

  • Al inicio de tu código de capacitación, comprueba si ya existe algún progreso de capacitación en tu ubicación de exportación. Si es así, carga el estado de capacitación guardado en lugar de empezar la capacitación desde cero.

Cuatro horas es un lineamiento, no un límite estricto. Si garantizar la resiliencia es una prioridad, considera agregar estos comportamientos a tu código, incluso si no esperas que se ejecute durante ese tiempo.

El modo en que se pueden lograr estos comportamientos depende del marco de trabajo de AA que uses. Por ejemplo, si usas TensorFlow Keras, aprende a usar la devolución de llamada ModelCheckpoint para este propósito.

Para obtener más información sobre cómo Vertex AI administra las VMs, consulta Comprende el servicio de capacitación personalizada.

Prácticas recomendadas para las funciones opcionales de capacitación personalizada

Si deseas usar ciertas características opcionales de la capacitación personalizada, es posible que debas hacer cambios adicionales en el código de capacitación. En esta sección, se describen las prácticas recomendadas de código para el ajuste de hiperparámetros, las GPU, la capacitación distribuida y Vertex AI TensorBoard.

Escribe el código para habilitar el registro automático

Puedes habilitar el registro con el SDK de Vertex AI para Python para capturar de forma automática los parámetros y las métricas de rendimiento cuando envíes el trabajo personalizado. Para obtener más detalles, consulta Ejecuta un trabajo de capacitación con seguimiento de experimentos.

Escribe código para mostrar registros de contenedores

Cuando escribes registros desde el servicio o trabajo, Cloud Logging los selecciona de manera automática, siempre y cuando se escriban en cualquiera de estas ubicaciones:

Se espera que la mayoría de los desarrolladores escriban registros mediante transmisiones de salida estándar y error estándar.

Los registros de contenedores escritos en estas ubicaciones compatibles se asocian de manera automática con el servicio, la revisión y la ubicación del entrenamiento personalizado de Vertex AI o con el trabajo de Cloud Run. Las excepciones en estos registros se capturan y se informan en Error Reporting.

Comparación entre el uso de texto simple y de JSON estructurado en los registros

Cuando escribes registros, puedes enviar una string de texto simple o una sola línea de JSON serializado, que también se conoce como datos estructurados. Cloud Logging lo recopila y analiza, y se coloca en jsonPayload. En cambio, el mensaje de texto simple se coloca en textPayload.

Escribe registros estructurados

Puedes pasar registros JSON estructurados de varias maneras. Las formas más comunes son usar la biblioteca de Logging de Python o pasar JSON sin procesar con print.

Biblioteca de registros de Python

import json
import logging
from pythonjsonlogger import jsonlogger


class CustomJsonFormatter(jsonlogger.JsonFormatter):
 """Formats log lines in JSON."""
  def process_log_record(self, log_record):
    """Modifies fields in the log_record to match Cloud Logging's expectations."""
    log_record['severity'] = log_record['levelname']
    log_record['timestampSeconds'] = int(log_record['created'])
    log_record['timestampNanos'] = int(
        (log_record['created'] % 1) * 1000 * 1000 * 1000)


    return log_record




def configure_logger():
  """Configures python logger to format logs as JSON."""
  formatter = CustomJsonFormatter(
        '%(name)s|%(levelname)s|%(message)s|%(created)f'
        '|%(lineno)d|%(pathname)s', '%Y-%m-%dT%H:%M:%S')
  root_logger = logging.getLogger()
  handler = logging.StreamHandler()
  handler.setFormatter(formatter)
  root_logger.addHandler(handler)
  root_logger.setLevel(logging.WARNING)


logging.warning("This is a warning log")

JSON sin procesar

import json


def log(severity, message):
  global_extras = {"debug_key": "debug_value"}
  structured_log = {"severity": severity, "message": message, **global_extras}
  print(json.dumps(structured_log))


def main(args):
  log("DEBUG", "Debugging the application.")
  log("INFO", "Info.")
  log("WARNING", "Warning.")
  log("ERROR", "Error.")
  log("CRITICAL", "Critical.")

Campos JSON especiales en los mensajes

Cuando proporcionas un registro estructurado como un diccionario JSON, algunos campos especiales se quitan de jsonPayload y se escriben en el campo correspondiente en la LogEntry generada, como se describe en la documentación sobre campos especiales.

Por ejemplo, si el JSON incluye una propiedad severity, se quita de jsonPayload y aparece como la severity de la entrada de registro. La propiedad message se usa como el texto de visualización principal de la entrada de registro, si está presente.

Correlaciona los registros del contenedor con un registro de solicitud (solo servicios)

En el Explorador de registros, los registros que se correlacionan por el mismo trace se pueden ver en formato de “superior-secundario”. Cuando haces clic en el ícono de triángulo a la izquierda de la entrada de registro de la solicitud, los registros de contenedores relacionados con esa solicitud aparecen anidados en el registro de solicitud.

Los registros de contenedores no se correlacionan de forma automática con los registros de solicitudes, a menos que uses una biblioteca cliente de Cloud Logging. Para correlacionar registros de contenedores con registros de solicitudes sin usar una biblioteca cliente, puedes usar una línea de registro JSON estructurada que contenga un campo logging.googleapis.com/trace con el identificador de seguimiento extraído del encabezado X-Cloud-Trace-Context.

Ver registros

Para ver los registros de contenedores en la consola de Google Cloud, haz lo siguiente:

  1. En la consola de Google Cloud, ve a la página Trabajos personalizados de Vertex AI.

    Ve a Trabajos personalizados

  2. Haz clic en el nombre del trabajo personalizado del que deseas ver los registros.

  3. Haz clic en Ver registros.

Escribe código para ajustar hiperparámetros

Vertex AI puede hacer el ajuste de hiperparámetros en el código de capacitación del AA. Obtén más información sobre cómo funciona el ajuste de hiperparámetros en Vertex AI y cómo configurar un recurso HyperparameterTuningJob.

Si deseas usar el ajuste de hiperparámetros, el código de capacitación debe hacer lo siguiente:

  • Analizar los argumentos de la línea de comandos que representan los hiperparámetros que deseas ajustar y usar los valores analizados para establecer los hiperparámetros para la capacitación

  • Informa de forma intermitente la métrica de ajuste de hiperparámetros a Vertex AI.

Analizar argumentos de la línea de comandos

Para el ajuste de hiperparámetros, Vertex AI ejecuta tu código de capacitación varias veces, con diferentes argumentos de línea de comandos cada vez. El código de capacitación debe analizar estos argumentos de la línea de comandos y usarlos como hiperparámetros para la capacitación. Por ejemplo, para ajustar la tasa de aprendizaje de tu optimizador, puede que quieras analizar un argumento de línea de comandos llamado --learning_rate. Obtén más información sobre cómo configurar qué argumentos de línea de comandos que proporciona Vertex AI.

Te recomendamos que uses la biblioteca argparse de Python para analizar los argumentos de la línea de comandos.

Informar la métrica de ajuste de hiperparámetros

Tu código de capacitación debe informar de manera intermitente la métrica de hiperparámetro que intentas optimizar en Vertex AI. Por ejemplo, si deseas maximizar la exactitud de tu modelo, te recomendamos informar esta métrica al final de cada ciclo de capacitación. Vertex AI usa esta información para decidir qué hiperparámetros usar para la próxima prueba de capacitación. Obtén más información para elegir y especificar una métrica de ajuste de hiperparámetros.

Usa la biblioteca de Python cloudml-hypertune para informar la métrica de ajuste de hiperparámetros. Esta biblioteca se incluye en todos los contenedores compilados previamente para la capacitación y puedes usar pip para instalarlo en un contenedor personalizado.

Para obtener información sobre cómo instalar y usar esta biblioteca, consultael cloudml-hypertune Repositorio de GitHub o consulta laVertex AI: codelab de ajuste de hiperparámetros.

Escribe código para las GPU

Puedes elegir VMs con unidades de procesamiento de gráficos (GPU) para ejecutar tu código de capacitación personalizada. Obtén más información sobre la configuración de la capacitación personalizada para usar VMs habilitadas para GPU.

Si deseas entrenar con GPU, asegúrate de que tu código de capacitación pueda aprovecharlas. Según el framework del AA que uses, es posible que debas hacer cambios en tu código. Por ejemplo, si usas TensorFlow Keras, solo debes ajustar el código si quieres usar más de una GPU. Algunos frameworks del AA no pueden usar GPU.

Además, asegúrate de que tu contenedor sea compatible con GPU: elige un contenedor compilado previamente para la capacitación que admita GPU o instala el kit de herramientas NVIDIA CUDA y NVIDIA cuDNN en tu contenedor personalizado. Una forma de hacerlo es usar la imagen base del repositorio de Docker de nvidia/cuda. Otra forma es usar una instancia de contenedores de aprendizaje profundo como imagen base.

Escribe código para la capacitación distribuida

Para entrenar en conjuntos de datos grandes, puedes ejecutar tu código en varias VMs en un clúster distribuido administrado por Vertex AI. Obtén información para configurar varias VMs para la capacitación.

Algunos frameworks del AA, como TensorFlow y PyTorch, te permiten ejecutar un código de capacitación idéntico en varias máquinas que coordinan de forma automática la división del trabajo basado en variables de entorno configuradas en cada máquina. Averigua si Vertex AI establece variables de entorno para que esto sea posible en el framework de AA.

De manera alternativa, puedes ejecutar un contenedor diferente en cada uno de varios grupos de trabajadores. Un grupo de trabajadores es un grupo de VMs que configuras para usar las mismas opciones de procesamiento y contenedor. En este caso, tal vez quieras confiar en las variables de entorno configuradas por Vertex AI para coordinar la comunicación entre las VMs. Puedes personalizar el código de capacitación de cada grupo de trabajadores para que realice las tareas arbitrarias que desees. La forma de hacerlo dependerá del objetivo y del framework del AA que uses.

Recorre y visualiza experimentos de capacitación personalizada con Vertex AI TensorBoard

Vertex AI TensorBoard es una versión administrada de TensorBoard, un proyecto de código abierto de Google para visualizar experimentos de aprendizaje automático. Con Vertex AI TensorBoard, puedes hacer un seguimiento, visualizar y comparar experimentos del AA, y compartirlos con tu equipo. También puedes usar Cloud Profiler para identificar y solucionar cuellos de botella en el rendimiento para entrenar modelos más rápido y de manera más económica.

Para usar Vertex AI TensorBoard con entrenamiento personalizado, debes hacer lo siguiente:

  • Crea una instancia de Vertex AI TensorBoard en tu proyecto para almacenar tus experimentos (consulta Crea una instancia de TensorBoard).

  • Configurar una cuenta de servicio para ejecutar el trabajo de capacitación personalizada con los permisos adecuados.

  • Ajustar el código de capacitación personalizada para escribir registros compatibles con TensorBoard en Cloud Storage (consulta Cambios en la secuencia de comandos de capacitación)

Para obtener una guía paso a paso, consulta Usa Vertex AI TensorBoard con capacitación personalizada.

¿Qué sigue?