Usa Vertex AI TensorBoard con entrenamiento personalizado

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

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

Para la configuración inicial, consulta Configura Vertex AI TensorBoard.

Cambios en la secuencia de comandos de entrenamiento

La secuencia de comandos de entrenamiento debe configurarse para escribir registros de TensorBoard en el bucket de Cloud Storage, cuya ubicación pondrá a disposición Vertex AI Training Service de forma automática a través de una variable de entorno predefinida AIP_TENSORBOARD_LOG_DIR.

Por lo general, esto se puede hacer si 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. Por lo general, la ubicación de AIP_TENSORBOARD_LOG_DIR se establece con la variable staging_bucket.

Para configurar la secuencia de comandos de entrenamiento en TensorFlow 2.x, crea una devolución de llamada de TensorBoard y establece la variable log_dir en os.environ['AIP_TENSORBOARD_LOG_DIR']La devolución de llamada de TensorBoard se incluye en la lista de devoluciones de llamadas model.fit de TensorFlow.

  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],
  )
  

Obtén más información sobre cómo Vertex AI establece variables de entorno en el entorno de entrenamiento personalizado.

Crea un trabajo de entrenamiento personalizado

En el siguiente ejemplo, se muestra cómo crear tu propio trabajo de entrenamiento personalizado.

Para obtener un ejemplo detallado sobre cómo crear un trabajo de entrenamiento personalizado, consulta Entrenamiento personalizado de Hello. Si deseas obtener los pasos para compilar contenedores de entrenamiento personalizados, consulta Crea una imagen de contenedor personalizada para el entrenamiento.

Si quieres crear un trabajo de entrenamiento personalizado, 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: El ID del proyecto. Puedes encontrar estos IDs en la página de bienvenida de la consola de Google Cloud.
  • location: La región en la que se ejecutará la consulta. Debe ser la misma región que la instancia de TensorBoard proporcionada.
  • staging_bucket: El bucket de Cloud Storage para almacenar en etapa intermedia los artefactos durante las llamadas a la API, incluidos los registros de TensorBoard.
  • display_name: El nombre visible del trabajo de entrenamiento personalizado.
  • script_path: La ruta, en relación con el directorio de trabajo en su sistema de archivos local, que conduce a la secuencia de comandos que es el punto de entrada del código de entrenamiento.
  • container_uri: El URI de la imagen de contenedor de entrenamiento puede ser un contenedor de entrenamiento compilado previamente de Vertex AI o un contenedor personalizado.
  • model_serving_container_image_uri: El URI del contenedor de entrega del modelo adecuado para entregar el modelo producido por la secuencia de comandos de entrenamiento.
  • dataset_id: El número de ID del conjunto de datos que se usará para el entrenamiento.
  • model_display_name: Nombre visible del modelo entrenado
  • args: Los argumentos de la línea de comandos que se pasarán a la secuencia de comandos de Python.
  • replica_count: La cantidad de réplicas de trabajadores que se deben usar. En la mayoría de los casos, debes configurar esta opción como 1 para el primer grupo de trabajadores.
  • machine_type: el tipo de VM que se usará. Para obtener una lista de las VMs compatibles, consulta Tipos de máquinas.
  • accelerator_type: El tipo de GPU que se conectará a cada VM en el grupo de recursos. Para obtener una lista de las GPUs compatibles, consulta GPU.
  • accelerator_count: Es la cantidad de GPUs que se deben adjuntar a cada VM en el grupo de recursos (opcional). 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: Es el nombre del recurso de la instancia de Vertex TensorBoard en la que CustomJob subirá los registros de TensorBoard.
  • service_account: Obligatorio cuando se ejecuta con TensorBoard. Consulta Crea una cuenta de servicio con los permisos necesarios.

REST

Antes de usar cualquiera de los datos de solicitud a continuación, haz los siguientes reemplazos:

  • LOCATION_ID: Tu región.
  • PROJECT_ID: El ID del proyecto.
  • TENSORBOARD_INSTANCE_NAME: (Nombre obligatorio) El nombre completo de la instancia de Vertex AI de TensorBoard existente que almacena tus registros de TensorBoard de Vertex AI:
    projects/PROJECT_ID/locations/LOCATION_ID/tensorboards/TENSORBOARD_INSTANCE_ID
    Nota: Si La instancia de TensorBoard no es una existente, la creación de customJobs muestra un error 404.
  • GCS_BUCKET_NAME: "${PROJECT_ID}-tensorboard-logs-${LOCATION}"
  • USER_SA_EMAIL: (obligatorio) a 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: Es la ruta de acceso de Google Cloud en la que se escribe todo el resultado del entrenamiento (obligatorio). "gs://$GCS_BUCKET_NAME/$JOB_NAME"

Método HTTP y URL:

POST http://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, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
  "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"
}

¿Qué sigue?