Usar Vertex AI TensorBoard con el entrenamiento personalizado

Cuando usas el entrenamiento personalizado para entrenar modelos, puedes configurar tu trabajo de entrenamiento para que suba automáticamente tus registros de Vertex AI TensorBoard a Vertex AI TensorBoard.

Puedes usar esta integración para monitorizar tu entrenamiento casi en tiempo real, ya que Vertex AI TensorBoard transmite los registros de Vertex AI TensorBoard a medida que se escriben en Cloud Storage.

Para la configuración inicial, consulta el artículo Configurar Vertex AI TensorBoard.

Cambios en tu guion de entrenamiento

Tu secuencia de comandos de entrenamiento debe configurarse para escribir registros de TensorBoard en el contenedor de Cloud Storage, cuya ubicación el servicio de entrenamiento de Vertex AI pondrá automáticamente a disposición a través de una variable de entorno predefinida AIP_TENSORBOARD_LOG_DIR.

Para ello, normalmente se proporciona os.environ['AIP_TENSORBOARD_LOG_DIR'] como directorio de registro a las APIs de escritura de registros de TensorBoard de código abierto. La ubicación de AIP_TENSORBOARD_LOG_DIR se suele definir con la variable staging_bucket.

Para configurar tu script de entrenamiento en TensorFlow 2.x, crea una retrollamada de TensorBoard y asigna el valor os.environ['AIP_TENSORBOARD_LOG_DIR'] a la variable log_dir. La retrollamada de TensorBoard se incluye en la lista de retrollamadas de TensorFlow model.fit.

  tensorboard_callback = tf.keras.callbacks.TensorBoard(
       log_dir=os.environ['AIP_TENSORBOARD_LOG_DIR'],
       histogram_freq=1
  )
  
  model.fit(
       x=x_train,
       y=y_train,
       epochs=epochs,
       validation_data=(x_test, y_test),
       callbacks=[tensorboard_callback],
  )
  

Consulta más información sobre cómo Vertex AI define las variables de entorno en tu entorno de entrenamiento personalizado.

Crear un trabajo de entrenamiento personalizado

En el siguiente ejemplo se muestra cómo crear un trabajo de entrenamiento personalizado.

Para ver un ejemplo detallado de cómo crear un trabajo de entrenamiento personalizado, consulta Hola, entrenamiento personalizado. Para saber cómo crear contenedores de entrenamiento personalizados, consulta el artículo Crear una imagen de contenedor personalizada para el entrenamiento.

Para crear una tarea de entrenamiento personalizada, usa el SDK de Vertex AI para Python o REST.

Python

Python

def create_training_pipeline_custom_job_sample(
    project: str,
    location: str,
    staging_bucket: str,
    display_name: str,
    script_path: str,
    container_uri: str,
    model_serving_container_image_uri: str,
    dataset_id: Optional[str] = None,
    model_display_name: Optional[str] = None,
    args: Optional[List[Union[str, float, int]]] = None,
    replica_count: int = 0,
    machine_type: str = "n1-standard-4",
    accelerator_type: str = "ACCELERATOR_TYPE_UNSPECIFIED",
    accelerator_count: int = 0,
    training_fraction_split: float = 0.8,
    validation_fraction_split: float = 0.1,
    test_fraction_split: float = 0.1,
    sync: bool = True,
    tensorboard_resource_name: Optional[str] = None,
    service_account: Optional[str] = None,
):
    aiplatform.init(project=project, location=location, staging_bucket=staging_bucket)

    job = aiplatform.CustomTrainingJob(
        display_name=display_name,
        script_path=script_path,
        container_uri=container_uri,
        model_serving_container_image_uri=model_serving_container_image_uri,
    )

    # This example uses an ImageDataset, but you can use another type
    dataset = aiplatform.ImageDataset(dataset_id) if dataset_id else None

    model = job.run(
        dataset=dataset,
        model_display_name=model_display_name,
        args=args,
        replica_count=replica_count,
        machine_type=machine_type,
        accelerator_type=accelerator_type,
        accelerator_count=accelerator_count,
        training_fraction_split=training_fraction_split,
        validation_fraction_split=validation_fraction_split,
        test_fraction_split=test_fraction_split,
        sync=sync,
        tensorboard=tensorboard_resource_name,
        service_account=service_account,
    )

    model.wait()

    print(model.display_name)
    print(model.resource_name)
    print(model.uri)
    return model

  • project: . Puedes encontrar estos IDs en la página de Google Cloud bienvenida de la consola.
  • location: la ubicación en la que se ejecutará el CustomJob. Debe ser la misma ubicación que la instancia de TensorBoard proporcionada.
  • staging_bucket: el segmento de Cloud Storage en el que se almacenan los artefactos durante las llamadas a la API, incluidos los registros de TensorBoard.
  • display_name: nombre visible del trabajo de entrenamiento personalizado.
  • script_path: la ruta, relativa al directorio de trabajo en tu sistema de archivos local, de la secuencia de comandos que es el punto de entrada de tu código de entrenamiento.
  • container_uri: el URI de la imagen del contenedor de entrenamiento puede ser Vertex AI. contenedor de entrenamiento prediseñado o un contenedor personalizado.
  • model_serving_container_image_uri: el URI del contenedor de servicio del modelo adecuado para servir el modelo producido por la secuencia de comandos de entrenamiento.
  • dataset_id: número de ID del conjunto de datos que se va a usar para el entrenamiento.
  • model_display_name: nombre visible del modelo entrenado.
  • args: argumentos de línea de comandos que se pasarán a la secuencia de comandos de Python.
  • replica_count: número de réplicas de trabajadores que se deben usar. En la mayoría de los casos, asigna el valor 1 a tu primer grupo de trabajadores.
  • machine_type: el tipo de VM que se va a usar. Para ver una lista de las máquinas virtuales compatibles, consulta Tipos de máquinas.
  • accelerator_type: tipo de GPU que se va a asociar a cada VM del pool de recursos. Para ver una lista de las GPUs compatibles, consulta GPUs.
  • accelerator_count El número de GPUs que se van a asociar a cada VM del grupo de recursos. El valor predeterminado es 1.
  • training_fraction_split: la fracción del conjunto de datos que se usará para entrenar el modelo.
  • validation_fraction_split: la fracción del conjunto de datos que se usará para validar el modelo.
  • test_fraction_split: la fracción del conjunto de datos que se usará para evaluar el modelo.
  • sync: indica si se debe ejecutar este método de forma síncrona.
  • tensorboard_resource_name: nombre del recurso de la instancia de Vertex TensorBoard a la que CustomJob subirá los registros de TensorBoard.
  • service_account: es obligatorio cuando se ejecuta con TensorBoard. Consulta Crear una cuenta de servicio con los permisos necesarios.

REST

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • LOCATION_ID: la ubicación en la que se ejecutará el CustomJob. Por ejemplo, us-central1. Debe ser la misma ubicación que la instancia de TensorBoard proporcionada.
  • PROJECT_ID: tu ID de proyecto.
  • TENSORBOARD_INSTANCE_NAME: (Obligatorio) Nombre completo de la instancia de Vertex AI TensorBoard que almacena los registros de Vertex AI TensorBoard:
    projects/PROJECT_ID/locations/LOCATION_ID/tensorboards/TENSORBOARD_INSTANCE_ID
    Nota: Si la instancia de TensorBoard no existe, se producirá un error 404 al crear customJobs.
  • GCS_BUCKET_NAME: "${PROJECT_ID}-tensorboard-logs-${LOCATION}"
  • USER_SA_EMAIL: (Obligatorio) La cuenta de servicio creada en los pasos anteriores o tu propia cuenta de servicio. "USER_SA_NAME@${PROJECT_ID}.iam.gserviceaccount.com"
  • TRAINING_CONTAINER: TRAINING_CONTAINER.
  • INVOCATION_TIMESTAMP: "$(date +'%Y%m%d-%H%M%S')"
  • JOB_NAME: "tensorboard-example-job-${INVOCATION_TIMESTAMP}"
  • BASE_OUTPUT_DIR: (obligatorio) la ruta Google Cloud donde se escribe toda la salida del entrenamiento. "gs://$GCS_BUCKET_NAME/$JOB_NAME"

Método HTTP y URL:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/customJobs

Cuerpo JSON de la solicitud:

{
"displayName": JOB_NAME,
"jobSpec":{
"workerPoolSpecs":[
  {
    "replicaCount": "1",
     "machineSpec": {
        "machineType": "n1-standard-8",
      },
      "containerSpec": {
        "imageUri": TRAINING_CONTAINER,
      }
    }
  ],
  
  "base_output_directory": {
  "output_uri_prefix": BASE_OUTPUT_DIR,
   },
  "serviceAccount": USER_SA_EMAIL,
  "tensorboard": TENSORBOARD_INSTANCE_NAME,
  }
}

Para enviar tu solicitud, despliega una de estas opciones:

Deberías recibir una respuesta JSON similar a la siguiente:

{
  "name": "projects/PROJECT_ID/locations/LOCATION_ID/customJobs/CUSTOM_JOB_ID",
  "displayName": "DISPLAY_NAME",
  "jobSpec": {
    "workerPoolSpecs": [
      {
        "machineSpec": {
          "machineType": "n1-standard-8"
        },
        "replicaCount": "1",
        "diskSpec": {
          "bootDiskType": "pd-ssd",
          "bootDiskSizeGb": 100
        },
        "containerSpec": {
          "imageUri": "IMAGE_URI"
        }
      }
    ],
    "serviceAccount": "SERVICE_ACCOUNT",
    "baseOutputDirectory": {
      "outputUriPrefix": "OUTPUT_URI_PREFIX"
    },
    "tensorboard": "projects//locations/LOCATION_ID/tensorboards/tensorboard-id"
  },
  "state": "JOB_STATE_PENDING",
  "createTime": "CREATE-TIME",
  "updateTime": "UPDATE-TIME"
}

Siguientes pasos