Utiliser Vertex AI TensorBoard avec un entraînement personnalisé

Lorsque vous utilisez l'entraînement personnalisé pour entraîner des modèles, vous pouvez configurer votre job d'entraînement pour importer automatiquement vos journaux Vertex AI TensorBoard dans Vertex AI  TensorBoard.

Vous pouvez utiliser cette intégration pour surveiller votre entraînement quasiment en temps réel, car Vertex AI TensorBoard diffuse les journaux Vertex AI TensorBoard à mesure qu'ils sont écrits dans Cloud Storage.

Pour la configuration initiale, consultez la page Configurer Vertex AI TensorBoard.

Modifier le script d'entraînement

Votre script d'entraînement doit être configuré pour écrire des journaux TensorBoard dans le bucket Cloud Storage, dont l'emplacement sera automatiquement mis à disposition par le service Vertex AI Training via une variable d'environnement prédéfinie AIP_TENSORBOARD_LOG_DIR.

Pour ce faire, vous devez généralement fournir os.environ['AIP_TENSORBOARD_LOG_DIR'] comme répertoire de journal aux API d'écriture de journaux TensorBoard Open Source. L'emplacement de AIP_TENSORBOARD_LOG_DIR est généralement défini avec la variable staging_bucket.

Pour configurer votre script d'entraînement dans TensorFlow 2.x, créez un rappel TensorBoard et définissez la variable log_dir sur os.environ['AIP_TENSORBOARD_LOG_DIR']. Le rappel TensorBoard est ensuite inclus dans la liste des rappels model.fit 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],
  )
  

Découvrez comment Vertex AI définit les variables d'environnement dans votre environnement d'entraînement personnalisé.

Créer un job d'entraînement personnalisé

L'exemple de requête suivant montre comment créer votre propre job d'entraînement personnalisé.

Pour obtenir un exemple détaillé de création de job d'entraînement personnalisé, consultez la section Premiers pas avec l'entraînement personnalisé. Pour connaître les étapes de création d'un conteneur d'entraînement personnalisé, consultez la section Créer une image de conteneur personnalisée pour l'entraînement.

Pour créer un job d'entraînement personnalisé, utilisez le SDK Vertex AI pour Python ou 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 : l'ID de votre projet. Vous pouvez trouver ces ID sur la page Accueil de la console Google Cloud.
  • location : emplacement dans lequel exécuter CustomJob. Il doit s'agir du même emplacement que celui de l'instance TensorBoard fournie.
  • staging_bucket: bucket Cloud Storage permettant de préparer les artefacts lors des appels d'API, y compris les journaux TensorBoard.
  • display_name: nom à afficher du job d'entraînement personnalisé.
  • script_path : chemin d'accès au script qui est le point d'entrée de votre code d'entraînement et qui se trouve dans le répertoire de travail de votre système de fichiers local.
  • container_uri : URI de l'image du conteneur d'entraînement peut être un conteneur d'entraînement prédéfini Vertex AI ou un conteneur personnalisé
  • model_serving_container_image_uri: URI du conteneur de diffusion du modèle adapté à la diffusion du modèle produit par le script d'entraînement.
  • dataset_id : ID de l'ensemble de données à utiliser pour l'entraînement.
  • model_display_name : nom à afficher du modèle entraîné.
  • args : arguments de ligne de commande à transmettre au script Python.
  • replica_count : nombre d'instances dupliquées de nœuds de calcul à utiliser. Dans la plupart des cas, définissez cette valeur sur 1 pour votre premier pool de nœuds de calcul.
  • machine_type : type de VM à utiliser. Pour obtenir la liste des VM compatibles, consultez la section Types de machines.
  • accelerator_type : type de GPU à associer à chaque VM du pool de ressources. Pour obtenir la liste des GPU compatibles, consultez la section GPU.
  • accelerator_count : nombre de GPU à associer à chaque VM du pool de ressources. La valeur par défaut est 1.
  • training_fraction_split : fraction de l'ensemble de données à utiliser pour entraîner votre modèle.
  • validation_fraction_split : fraction de l'ensemble de données à utiliser pour valider votre modèle.
  • test_fraction_split : fraction de l'ensemble de données à utiliser pour évaluer votre modèle.
  • sync: indique si cette méthode doit être exécutée de manière synchrone.
  • tensorboard_resource_name: nom de ressource de l'instance Vertex TensorBoard dans laquelle CustomJob importe les journaux TensorBoard.
  • service_account: obligatoire lors de l'exécution avec TensorBoard. Consultez la section Créer un compte de service avec les autorisations requises.

REST

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • LOCATION_ID : emplacement dans lequel exécuter CustomJob (par exemple, us-central1). Il doit s'agir du même emplacement que celui de l'instance TensorBoard fournie.
  • PROJECT_ID : l'ID de votre projet.
  • TENSORBOARD_INSTANCE_NAME (obligatoire) : nom complet de l'instance Vertex AI TensorBoard existante stockant vos journaux Vertex AI TensorBoard :
    projects/PROJECT_ID/locations/LOCATION_ID/tensorboards/TENSORBOARD_INSTANCE_ID
    Remarque : Si l'instance TensorBoard n'est pas existante, la création de tâches personnalisées génère une erreur 404.
  • GCS_BUCKET_NAME: "${PROJECT_ID}-tensorboard-logs-${LOCATION}"
  • USER_SA_EMAIL (obligatoire) : compte de service créé lors des étapes précédentes ou votre propre compte de service. "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 : (obligatoire) chemin d'accès à Google Cloud dans lequel le résultat de l'entraînement est écrit. "gs://$GCS_BUCKET_NAME/$JOB_NAME"

Méthode HTTP et URL :

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

Corps JSON de la requête :

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

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

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

Étapes suivantes