Preparar el código de entrenamiento

Realiza entrenamiento personalizado en Vertex AI para ejecutar tu propio código de entrenamiento de aprendizaje automático (ML) en la nube, en lugar de usar AutoML. En este documento se describen las prácticas recomendadas que debes tener en cuenta al escribir código de entrenamiento.

.

Elegir una estructura de código de entrenamiento

Primero, determina qué estructura quieres que tenga tu código de entrenamiento de aprendizaje automático. Puedes proporcionar código de entrenamiento a Vertex AI de una de las siguientes formas:

  • Una secuencia de comandos de Python para usarla con un contenedor prediseñado. Usa el SDK de Vertex AI para crear un trabajo personalizado. Este método te permite proporcionar tu aplicación de entrenamiento como un único script de Python.

  • Una aplicación de entrenamiento de Python para usarla con un contenedor prediseñado. Crea una distribución de origen de Python con código que entrene un modelo de aprendizaje automático y lo exporte a Cloud Storage. Esta aplicación de entrenamiento puede usar cualquiera de las dependencias incluidas en el contenedor precompilado con el que quieras usarla.

    Usa esta opción si uno de los contenedores precompilados de Vertex AI para el entrenamiento incluye todas las dependencias que necesitas para el entrenamiento. Por ejemplo, si quieres entrenar con PyTorch, scikit-learn, TensorFlow o XGBoost, esta es probablemente la mejor opción.

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

  • Una imagen de contenedor personalizada. Crea una imagen de contenedor Docker con código que entrene un modelo de aprendizaje automático y lo exporte a Cloud Storage. Incluye en la imagen de contenedor las dependencias que necesite tu código.

    Usa esta opción si quieres usar dependencias que no estén incluidas en uno de los contenedores precompilados de Vertex AI para el entrenamiento. Por ejemplo, si quieres entrenar un modelo usando un framework de Python ML que no está disponible en un contenedor predefinido, o si quieres hacerlo con un lenguaje de programación que no sea Python, esta es la mejor opción.

    Para obtener información sobre las prácticas recomendadas específicas de esta opción, consulta 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 formación.

Prácticas recomendadas para todo el código de entrenamiento personalizado

Cuando escribas código de entrenamiento personalizado para Vertex AI, ten en cuenta que el código se ejecutará en una o varias instancias de máquina virtual (VM) gestionadas porGoogle Cloud. En esta sección se describen las prácticas recomendadas aplicables a todo el código de entrenamiento personalizado.

Acceder a los Google Cloud servicios en tu código

En varias de las secciones siguientes se describe cómo acceder a otros servicios Google Cloud desde tu código. Para acceder a los Google Cloud servicios, escribe tu código de entrenamiento para usar las credenciales predeterminadas de la aplicación (ADC). Muchas bibliotecas de cliente de Google Cloud se autentican con ADC de forma predeterminada. No es necesario que configures ninguna variable de entorno. Vertex AI configura automáticamente ADC para autenticarte como agente de servicio de código personalizado de Vertex AI de tu proyecto (de forma predeterminada) o como cuenta de servicio personalizada (si has configurado una).

.

Sin embargo, cuando usas una Google Cloud biblioteca de cliente en tu código,Google Cloud es posible que Vertex AI no siempre se conecte al proyecto correcto de forma predeterminada. Si se producen errores de permisos, puede que el problema sea que te has conectado al proyecto incorrecto.

Este problema se produce porque Vertex AI no ejecuta el código directamente en tu proyecto. Google Cloud En su lugar, Vertex AI ejecuta tu código en uno de los varios proyectos independientes gestionados por Google. Vertex AI usa estos proyectos exclusivamente para las operaciones relacionadas con tu proyecto. Por lo tanto, no intentes inferir un ID de proyecto del entorno en tu código de entrenamiento o inferencia. Especifica los IDs de proyecto de forma explícita.

Si no quieres codificar de forma rígida un ID de proyecto en tu código de entrenamiento, puedes hacer referencia a la variable de entorno CLOUD_ML_PROJECT_ID. Vertex AI define esta variable de entorno en todos los contenedores de entrenamiento personalizado para que contenga el número de proyecto del proyecto en el que has iniciado el entrenamiento personalizado. Muchas Google Cloud herramientas pueden aceptar un número de proyecto en lugar de un ID de proyecto.

Por ejemplo, si quieres 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 entrenamiento:

Selección implícita de proyectos

from google.cloud import bigquery

client = bigquery.Client()

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

Selección explícita de proyectos

import os

from google.cloud import bigquery

project_number = os.environ["CLOUD_ML_PROJECT_ID"]

client = bigquery.Client(project=project_number)

Si se producen errores de permisos después de configurar el código de esta forma, consulta la siguiente sección sobre a qué recursos puede acceder tu código para ajustar los permisos disponibles para tu código de entrenamiento.

A qué recursos puede acceder tu código

De forma predeterminada, tu aplicación de entrenamiento puede acceder a cualquier Google Cloud recurso que esté disponible para el agente de servicio de código personalizado (CCSA) de Vertex AI de tu proyecto. Puedes conceder a la CCSA y, por lo tanto, a tu aplicación de entrenamiento, acceso a un número limitado de otros recursos siguiendo las instrucciones que se indican en Conceder acceso a otros recursos a los agentes de servicio de Vertex AI. Si tu aplicación de entrenamiento necesita más que acceso de lectura a los Google Cloud recursos que no se indican en esa página, debe obtener un token de acceso de OAuth 2.0 con el permiso https://www.googleapis.com/auth/cloud-platform, que solo se puede obtener mediante una cuenta de servicio personalizada.

Por ejemplo, supongamos que el código de entrenamiento tiene acceso a recursos de Cloud Storage:

De forma predeterminada, Vertex AI puede acceder a cualquier segmento de Cloud Storage del Google Cloud proyecto en el que estés realizando el entrenamiento personalizado. También puedes conceder acceso a Vertex AI a los segmentos de Cloud Storage de otros proyectos o personalizar con precisión a qué segmentos puede acceder un trabajo específico mediante una cuenta de servicio personalizada.

Leer y escribir archivos de Cloud Storage con Cloud Storage FUSE

En todas las tareas de entrenamiento personalizadas, Vertex AI monta los segmentos de Cloud Storage a los que tienes acceso en el directorio /gcs/ del sistema de archivos de cada nodo de entrenamiento. Como alternativa cómoda al uso del cliente de Python para Cloud Storage u otra biblioteca para acceder a Cloud Storage, puedes leer y escribir directamente en el sistema de archivos local para leer datos de Cloud Storage o escribir datos en Cloud Storage. Por ejemplo, para cargar datos de 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 montar los segmentos de almacenamiento. Tenga en cuenta que los directorios montados por Cloud Storage FUSE no cumplen el estándar POSIX.

Las credenciales que uses para el entrenamiento personalizado determinan a qué segmentos puedes acceder de esta forma. En la sección anterior sobre a qué recursos puede acceder tu código se describe exactamente a qué contenedores puedes acceder de forma predeterminada y cómo personalizar este acceso.

Cargar datos de entrada

El código de aprendizaje automático suele operar con datos de entrenamiento para entrenar un modelo. No almacenes datos de entrenamiento junto con tu código, tanto si creas una aplicación de entrenamiento de Python como una imagen de contenedor personalizada. Almacenar datos con código puede provocar que el proyecto esté mal organizado, que sea difícil reutilizar el código en diferentes conjuntos de datos y que se produzcan errores en conjuntos de datos grandes.

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

Para obtener el mejor rendimiento al cargar datos desde Cloud Storage, usa un segmento en la región en la que realices el entrenamiento personalizado. Para saber cómo almacenar datos en Cloud Storage, consulta los artículos Crear segmentos de almacenamiento y Subir objetos.

Para saber de qué segmentos de Cloud Storage puedes cargar datos, consulta la sección anterior sobre a qué recursos puede acceder tu código.

Para cargar datos de Cloud Storage en tu código de entrenamiento, usa la función FUSE de Cloud Storage descrita en la sección anterior o cualquier biblioteca que admita ADC. No es necesario que proporcione explícitamente ninguna credencial de autenticación en su código.

Por ejemplo, puedes usar una de las bibliotecas de cliente que se muestran en la guía de Cloud Storage para descargar objetos. En concreto, el cliente de Python para Cloud Storage se incluye en los contenedores precompilados. La tf.io.gfile.GFileclase de TensorFlow también admite ADC.

Cargar un conjunto de datos de gran tamaño

En función de los tipos de máquinas que tengas previsto usar durante el entrenamiento personalizado, es posible que tus VMs no puedan cargar todo un conjunto de datos de gran tamaño en la memoria.

Si necesitas leer datos que son demasiado grandes para caber en la memoria, transmite los datos o léelos de forma incremental. Cada framework de aprendizaje automático tiene sus propias prácticas recomendadas para hacerlo. Por ejemplo, la tf.data.Datasetclase de TensorFlow puede transmitir datos de TFRecord o de texto desde Cloud Storage.

Realizar un entrenamiento personalizado 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 Escribir código para el entrenamiento distribuido de este documento.

Exportar un modelo de aprendizaje automático entrenado

El código de aprendizaje automático suele exportar un modelo entrenado al final del entrenamiento en forma de uno o varios artefactos de modelo. Después, puedes usar los artefactos del modelo para obtener inferencias.

Una vez que se haya completado el entrenamiento personalizado, ya no podrás acceder a las VMs que ejecutaron tu código de entrenamiento. Por lo tanto, el código de entrenamiento debe exportar los artefactos del modelo a una ubicación fuera de Vertex AI.

Te recomendamos que exportes los artefactos del modelo a un segmento de Cloud Storage. Como se describe en la sección anterior sobre a qué recursos puede acceder tu código, Vertex AI puede acceder a cualquier contenedor de Cloud Storage del Google Cloud proyecto en el que estés realizando el entrenamiento personalizado. Usa una biblioteca que admita ADC para exportar los artefactos de tu modelo. Por ejemplo, las APIs de TensorFlow para guardar modelos de Keras pueden exportar artefactos directamente a una ruta de Cloud Storage.

Si quieres usar tu modelo entrenado para publicar inferencias en Vertex AI, tu código debe exportar los artefactos del modelo en un formato compatible con uno de los contenedores precompilados para inferencias. Consulta más información en la guía para exportar artefactos de modelos para la inferencia y la explicación.

Variables de entorno para directorios especiales de Cloud Storage

Si especificas el campo de la API baseOutputDirectory, Vertex AI define las siguientes variables de entorno cuando ejecuta el código de entrenamiento:

Los valores de estas variables de entorno varían ligeramente en función de si usas la optimización de hiperparámetros. Para obtener más información, consulta la referencia de la API de baseOutputDirectory.

Si usas estas variables de entorno, te resultará más fácil reutilizar el mismo código de entrenamiento varias veces (por ejemplo, con diferentes datos u opciones de configuración) y guardar los artefactos y los puntos de control del modelo en diferentes ubicaciones. Para ello, solo tienes que cambiar el campo baseOutputDirectory de la API. Sin embargo, no es obligatorio usar las variables de entorno en el código si no quieres. Por ejemplo, puedes codificar de forma alternativa las ubicaciones para guardar los puntos de control y exportar los artefactos del modelo.

Además, si utilizas un TrainingPipeline para el entrenamiento personalizado y no especificas el campo modelToUpload.artifactUri, Vertex AI usará el valor de la variable de entorno AIP_MODEL_DIR para modelToUpload.artifactUri. En el caso del ajuste de hiperparámetros, Vertex AI usa el valor de la variable de entorno AIP_MODEL_DIR de la mejor prueba.

Asegurar la resiliencia ante reinicios

Las VMs que ejecutan tu código de entrenamiento se reinician de vez en cuando. Por ejemplo, es posible que Google Cloud tenga que reiniciar una VM por motivos de mantenimiento. Cuando se reinicia una VM, Vertex AI vuelve a ejecutar el código desde el principio.

Si prevés que tu código de entrenamiento se ejecutará durante más de cuatro horas, añade varios comportamientos al código para que resista los reinicios:

  • Exporta con frecuencia tu progreso de entrenamiento a Cloud Storage, al menos una vez cada cuatro horas, para no perderlo si se reinician tus VMs.

  • Al principio del código de entrenamiento, comprueba si ya hay algún progreso de entrenamiento en la ubicación de exportación. Si es así, carga el estado de entrenamiento guardado en lugar de empezar el entrenamiento desde cero.

Cuatro horas es una directriz, no un límite estricto. Si la resiliencia es una prioridad, considera la posibilidad de añadir estos comportamientos a tu código aunque no esperes que se ejecute durante tanto tiempo.

La forma de conseguir estos comportamientos depende del framework de aprendizaje automático que utilices. Por ejemplo, si usas TensorFlow Keras, consulta cómo usar la retrollamada ModelCheckpoint para este fin.

Para obtener más información sobre cómo gestiona Vertex AI las VMs, consulta Información sobre el servicio de entrenamiento personalizado.

Prácticas recomendadas para las funciones de entrenamiento personalizadas opcionales

Si quieres usar determinadas funciones de entrenamiento personalizadas opcionales, es posible que tengas que hacer cambios adicionales en tu código de entrenamiento. En esta sección se describen las prácticas recomendadas de código para el ajuste de hiperparámetros, las GPUs, el entrenamiento distribuido y Vertex AI TensorBoard.

Escribir código para habilitar el registro automático

Puede habilitar el registro automático mediante el SDK de Vertex AI para Python para registrar automáticamente los parámetros y las métricas de rendimiento al enviar el trabajo personalizado. Para obtener más información, consulta el artículo Ejecutar un trabajo de entrenamiento con seguimiento de experimentos.

Escribir código para devolver registros de contenedores

Cuando escribas registros desde tu servicio o trabajo, Cloud Logging los recogerá automáticamente siempre que se escriban en alguna de estas ubicaciones:

La mayoría de los desarrolladores deben escribir registros mediante la salida estándar y el error estándar.

Los registros de contenedores escritos en estas ubicaciones admitidas se asocian automáticamente al servicio, la revisión y la ubicación de entrenamiento personalizado de Vertex AI, o bien a la tarea de entrenamiento personalizado. Error Reporting captura las excepciones contenidas en estos registros y crea informes sobre ellas.

Usar texto simple en lugar de JSON estructurado en los registros

Cuando escribes registros, puedes enviar una cadena de texto simple o una sola línea de JSON serializado, también llamada datos "estructurados". Cloud Logging la recoge y la analiza, y la coloca en jsonPayload. En cambio, el mensaje de texto simple se coloca en textPayload.

Escribir registros estructurados

Puedes enviar registros JSON estructurados de varias formas. Las formas más habituales son usar la biblioteca de registro de Python o enviar JSON sin formato mediante print.

Biblioteca de registro 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 mensajes

Cuando proporcionas un registro estructurado como un diccionario JSON, se eliminan algunos campos especiales del jsonPayload y se escriben en el campo correspondiente del LogEntry generado, tal como se describe en la documentación de los campos especiales.

Por ejemplo, si tu JSON incluye una propiedad severity, se elimina del jsonPayload y aparece como severity de la entrada de registro. La propiedad message se usa como texto principal de la entrada de registro, si está presente.

Correlacionar los registros de tu contenedor con un registro de solicitudes (solo servicios)

En el Explorador de registros, los registros correlacionados por el mismo trace se pueden ver en formato "principal-secundario": cuando haces clic en el icono de triángulo situado a la izquierda de la entrada del registro de solicitudes, los registros de contenedores relacionados con esa solicitud se muestran anidados debajo del registro de solicitudes.

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

Ver registros

Para ver los registros de tu contenedor en la Google Cloud consola, sigue estos pasos:

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

    Ir a Tareas personalizadas

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

  3. Haz clic en Ver registros.

Escribir código para el ajuste de hiperparámetros

Vertex AI puede ajustar los hiperparámetros de tu código de entrenamiento de aprendizaje automático. Consulta más información sobre cómo funciona el ajuste de hiperparámetros en Vertex AI y cómo configurar un recurso HyperparameterTuningJob.

Si quieres usar el ajuste de hiperparámetros, tu código de entrenamiento debe hacer lo siguiente:

  • Analiza los argumentos de la línea de comandos que representan los hiperparámetros que quieres ajustar y usa los valores analizados para definir los hiperparámetros del entrenamiento.

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

Analizar argumentos de línea de comandos

Para el ajuste de hiperparámetros, Vertex AI ejecuta el código de entrenamiento varias veces, con diferentes argumentos de línea de comandos cada vez. Tu código de entrenamiento debe analizar estos argumentos de línea de comandos y usarlos como hiperparámetros para el entrenamiento. Por ejemplo, para ajustar la velocidad de aprendizaje de tu optimizador, puedes analizar un argumento de línea de comandos llamado --learning_rate. Consulta cómo configurar los argumentos de línea de comandos que proporciona Vertex AI.

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

Registrar la métrica de ajuste de hiperparámetros

El código de entrenamiento debe informar de forma intermitente a Vertex AI sobre la métrica de hiperparámetros que quieres optimizar. Por ejemplo, si quiere maximizar la precisión de su modelo, puede registrar esta métrica al final de cada época de entrenamiento. Vertex AI usa esta información para decidir qué hiperparámetros usar en la siguiente prueba de entrenamiento. Consulte más información sobre cómo seleccionar y especificar una métrica de ajuste de hiperparámetros.

Usa la biblioteca de Python cloudml-hypertune para registrar la métrica de ajuste de hiperparámetros. Esta biblioteca se incluye en todos los contenedores precompilados para el entrenamiento y puedes usar pip para instalarla en un contenedor personalizado.

Para saber cómo instalar y usar esta biblioteca, consulta el repositorio de cloudml-hypertune GitHub o el codelab Vertex AI: ajuste de hiperparámetros.

Escribir código para GPUs

Puedes seleccionar VMs con unidades de procesamiento gráfico (GPUs) para ejecutar tu código de entrenamiento personalizado. Consulta más información sobre cómo configurar el entrenamiento personalizado para usar máquinas virtuales con GPU.

Si quieres entrenar con GPUs, asegúrate de que tu código de entrenamiento pueda aprovecharlas. En función del framework de aprendizaje automático que utilices, es posible que tengas que modificar el código. Por ejemplo, si usas TensorFlow Keras, solo tienes que ajustar el código si quieres usar más de una GPU. Algunos frameworks de aprendizaje automático no pueden usar GPUs.

Además, asegúrate de que tu contenedor sea compatible con GPUs. Para ello, selecciona un contenedor prediseñado para el entrenamiento que sea compatible con GPUs o instala el kit de herramientas NVIDIA CUDA y NVIDIA cuDNN en tu contenedor personalizado. Una forma de hacerlo es usar una imagen base del nvidia/cudarepositorio de Docker. Otra forma es usar una instancia de Deep Learning Containers como imagen base.

Escribir código para el entrenamiento distribuido

Para entrenar con conjuntos de datos grandes, puedes ejecutar tu código en varias máquinas virtuales de un clúster distribuido gestionado por Vertex AI. Consulta cómo configurar varias VMs para el entrenamiento.

Algunos frameworks de aprendizaje automático, como TensorFlow y PyTorch, permiten ejecutar un código de entrenamiento idéntico en varias máquinas, que coordinan automáticamente cómo dividir el trabajo en función de las variables de entorno definidas en cada máquina. Consulta si Vertex AI define variables de entorno para que tu framework de aprendizaje automático pueda hacerlo.

También puedes ejecutar un contenedor diferente en cada uno de los grupos de trabajadores. Un grupo de trabajadores es un grupo de VMs que configuras para que usen las mismas opciones de computación y el mismo contenedor. En este caso, probablemente quieras seguir usando las variables de entorno definidas por Vertex AI para coordinar la comunicación entre las VMs. Puedes personalizar el código de entrenamiento de cada grupo de trabajadores para que realice las tareas arbitrarias que quieras. La forma de hacerlo depende de tu objetivo y del framework de aprendizaje automático que uses.

Monitorizar y visualizar experimentos de entrenamiento personalizado con Vertex AI TensorBoard

Vertex AI TensorBoard es una versión gestionada de TensorBoard, un proyecto de código abierto de Google para visualizar experimentos de aprendizaje automático. Con Vertex AI TensorBoard, puedes monitorizar, visualizar y comparar experimentos de aprendizaje automático, y luego compartirlos con tu equipo. También puedes usar Cloud Profiler para identificar y corregir los cuellos de botella del rendimiento, lo que te permitirá entrenar modelos más rápido y a un coste menor.

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

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

  • Configura una cuenta de servicio para ejecutar la tarea de entrenamiento personalizado con los permisos adecuados.

  • Ajusta tu código de entrenamiento personalizado para escribir registros compatibles con TensorBoard en Cloud Storage (consulta Cambios en tu secuencia de comandos de entrenamiento).

Para obtener una guía paso a paso, consulta Usar Vertex AI TensorBoard con el entrenamiento personalizado.

Siguientes pasos