Configurer les paramètres du conteneur pour l'entraînement personnalisé

Lorsque vous procédez à un entraînement personnalisé, vous devez spécifier le code de machine learning (ML) que vous souhaitez que l'IA Vertex exécute. Pour ce faire, configurez les paramètres de conteneur d'entraînement pour un conteneur personnalisé ou pour une application d'entraînement Python s'exécutant sur un conteneur prédéfini.

Pour déterminer si vous souhaitez utiliser un conteneur personnalisé ou un conteneur prédéfini, consultez la section Exigences concernant le code d'entraînement.

Ce document décrit les champs de l'API d'IA Vertex que vous devez spécifier dans l'un des cas précédents.

Où spécifier les paramètres de conteneur

Spécifiez les détails de la configuration dans un objet WorkerPoolSpec. Selon votre type d'entraînement personnalisé, placez cet objet WorkerPoolSpec dans l'un des champs d'API suivants :

Si vous réalisez un entraînement distribué, vous pouvez utiliser des paramètres différents pour chaque pool de nœuds de calcul.

Configurer les paramètres du conteneur

Selon que vous utilisez un conteneur prédéfini ou un conteneur personnalisé, vous devez spécifier des champs différents dans WorkerPoolSpec. Sélectionnez l'onglet correspondant à votre scénario :

Conteneur prédéfini

  1. Sélectionnez un conteneur prédéfini compatible avec le framework de ML que vous prévoyez d'utiliser pour l'entraînement. Spécifiez l'un des URI de l'image du conteneur dans le champ pythonPackageSpec.executorImageUri.

  2. Spécifiez les URI Cloud Storage de votre application d'entraînement Python dans le champ pythonPackageSpec.packageUris.

  3. Spécifiez le module de point d'entrée de votre application d'entraînement dans le champ pythonPackageSpec.pythonModule.

  4. Vous pouvez également spécifier une liste d'arguments de ligne de commande à transmettre au module de point d'entrée de votre application d'entraînement dans le champ pythonPackageSpec.args.

Les exemples suivants indiquent où spécifier ces paramètres de conteneur lorsque vous créez un CustomJob :

Console

Dans la console Google Cloud, vous ne pouvez pas créer directement un CustomJob. Toutefois, vous pouvez créer un TrainingPipeline qui crée un objet CustomJob. Lorsque vous créez un TrainingPipeline dans la console Google Cloud, vous pouvez spécifier des paramètres de conteneur prédéfinis dans certains champs de l'étape Entraînement du conteneur :

  • pythonPackageSpec.executorImageUri : utilisez les listes déroulantes Framework de modèle et Version du framework de modèle.

  • pythonPackageSpec.packageUris : utilisez le champ Emplacement du package.

  • pythonPackageSpec.pythonModule : utilisez le champ Module Python.

  • pythonPackageSpec.args : utilisez le champ Arguments.

gcloud

gcloud ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --python-package-uris=PYTHON_PACKAGE_URIS \
  --worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,python-module=PYTHON_MODULE

Pour plus de contexte, lisez le guide de création d'un CustomJob.

Conteneur personnalisé

  1. Spécifiez l'URI Artifact Registry ou Docker Hub de votre conteneur personnalisé dans le champ containerSpec.imageUri.

  2. Si vous souhaitez remplacer les instructions ENTRYPOINT ou CMD dans votre conteneur, spécifiez les champs containerSpec.command ou containerSpec.args. Ces champs affectent l'exécution du conteneur conformément aux règles suivantes :

    • Si vous ne spécifiez aucun champ : votre conteneur s'exécute conformément à son instruction ENTRYPOINT et à son instruction CMD (si elle existe). Reportez-vous à la documentation Docker sur l'interaction entre CMD et ENTRYPOINT.

    • Si vous ne spécifiez que containerSpec.command : votre conteneur s'exécute avec la valeur de containerSpec.command à la place de son instruction ENTRYPOINT. Si le conteneur comprend une instruction CMD, elle est ignorée.

    • Si vous ne spécifiez que containerSpec.args : votre conteneur s'exécute conformément à son instruction ENTRYPOINT, avec la valeur de containerSpec.args à la place de son instruction CMD.

    • Si vous spécifiez les deux champs : votre conteneur s'exécute avec containerSpec.command à la place de son instruction ENTRYPOINT et containerSpec.args à la place de son instruction CMD.

L'exemple suivant montre où spécifier certains de ces paramètres de conteneur lorsque vous créez un CustomJob :

Console

Dans la console Google Cloud, vous ne pouvez pas créer directement un CustomJob. Toutefois, vous pouvez créer un TrainingPipeline qui crée un objet CustomJob. Lorsque vous créez un TrainingPipeline dans la console Google Cloud, vous pouvez spécifier des paramètres de conteneur personnalisés dans certains champs de l'étape Entraîner le conteneur :

  • containerSpec.imageUri : utilisez le champ Image de conteneur.

  • containerSpec.command : ce champ API n'est pas configurable dans la console Google Cloud.

  • containerSpec.args : utilisez le champ Arguments.

gcloud

gcloud ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,container-image-uri=CUSTOM_CONTAINER_IMAGE_URI

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java décrites dans le guide de démarrage rapide de Vertex AI à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Vertex AI Java.

Pour vous authentifier auprès de Vertex AI, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.


import com.google.cloud.aiplatform.v1.AcceleratorType;
import com.google.cloud.aiplatform.v1.ContainerSpec;
import com.google.cloud.aiplatform.v1.CustomJob;
import com.google.cloud.aiplatform.v1.CustomJobSpec;
import com.google.cloud.aiplatform.v1.JobServiceClient;
import com.google.cloud.aiplatform.v1.JobServiceSettings;
import com.google.cloud.aiplatform.v1.LocationName;
import com.google.cloud.aiplatform.v1.MachineSpec;
import com.google.cloud.aiplatform.v1.WorkerPoolSpec;
import java.io.IOException;

// Create a custom job to run machine learning training code in Vertex AI
public class CreateCustomJobSample {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "PROJECT";
    String displayName = "DISPLAY_NAME";

    // Vertex AI runs your training application in a Docker container image. A Docker container
    // image is a self-contained software package that includes code and all dependencies. Learn
    // more about preparing your training application at
    // https://cloud.google.com/vertex-ai/docs/training/overview#prepare_your_training_application
    String containerImageUri = "CONTAINER_IMAGE_URI";
    createCustomJobSample(project, displayName, containerImageUri);
  }

  static void createCustomJobSample(String project, String displayName, String containerImageUri)
      throws IOException {
    JobServiceSettings settings =
        JobServiceSettings.newBuilder()
            .setEndpoint("us-central1-aiplatform.googleapis.com:443")
            .build();
    String location = "us-central1";

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (JobServiceClient client = JobServiceClient.create(settings)) {
      MachineSpec machineSpec =
          MachineSpec.newBuilder()
              .setMachineType("n1-standard-4")
              .setAcceleratorType(AcceleratorType.NVIDIA_TESLA_T4)
              .setAcceleratorCount(1)
              .build();

      ContainerSpec containerSpec =
          ContainerSpec.newBuilder().setImageUri(containerImageUri).build();

      WorkerPoolSpec workerPoolSpec =
          WorkerPoolSpec.newBuilder()
              .setMachineSpec(machineSpec)
              .setReplicaCount(1)
              .setContainerSpec(containerSpec)
              .build();

      CustomJobSpec customJobSpecJobSpec =
          CustomJobSpec.newBuilder().addWorkerPoolSpecs(workerPoolSpec).build();

      CustomJob customJob =
          CustomJob.newBuilder()
              .setDisplayName(displayName)
              .setJobSpec(customJobSpecJobSpec)
              .build();
      LocationName parent = LocationName.of(project, location);
      CustomJob response = client.createCustomJob(parent, customJob);
      System.out.format("response: %s\n", response);
      System.out.format("Name: %s\n", response.getName());
    }
  }
}

Node.js

Avant d'essayer cet exemple, suivez les instructions de configuration pour Node.js décrites dans le guide de démarrage rapide de Vertex AI à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Vertex AI Node.js.

Pour vous authentifier auprès de Vertex AI, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

/**
 * TODO(developer): Uncomment these variables before running the sample.\
 * (Not necessary if passing values as arguments)
 */

// const customJobDisplayName = 'YOUR_CUSTOM_JOB_DISPLAY_NAME';
// const containerImageUri = 'YOUR_CONTAINER_IMAGE_URI';
// const project = 'YOUR_PROJECT_ID';
// const location = 'YOUR_PROJECT_LOCATION';

// Imports the Google Cloud Job Service Client library
const {JobServiceClient} = require('@google-cloud/aiplatform');

// Specifies the location of the api endpoint
const clientOptions = {
  apiEndpoint: 'us-central1-aiplatform.googleapis.com',
};

// Instantiates a client
const jobServiceClient = new JobServiceClient(clientOptions);

async function createCustomJob() {
  // Configure the parent resource
  const parent = `projects/${project}/locations/${location}`;
  const customJob = {
    displayName: customJobDisplayName,
    jobSpec: {
      workerPoolSpecs: [
        {
          machineSpec: {
            machineType: 'n1-standard-4',
            acceleratorType: 'NVIDIA_TESLA_K80',
            acceleratorCount: 1,
          },
          replicaCount: 1,
          containerSpec: {
            imageUri: containerImageUri,
            command: [],
            args: [],
          },
        },
      ],
    },
  };
  const request = {parent, customJob};

  // Create custom job request
  const [response] = await jobServiceClient.createCustomJob(request);

  console.log('Create custom job response:\n', JSON.stringify(response));
}
createCustomJob();

Python

Pour savoir comment installer ou mettre à jour le SDK Vertex AI pour Python, consultez la section Installer le SDK Vertex AI pour Python. Pour en savoir plus, consultez la documentation de référence de l'API Python.

from google.cloud import aiplatform


def create_custom_job_sample(
    project: str,
    display_name: str,
    container_image_uri: str,
    location: str = "us-central1",
    api_endpoint: str = "us-central1-aiplatform.googleapis.com",
):
    # The AI Platform services require regional API endpoints.
    client_options = {"api_endpoint": api_endpoint}
    # Initialize client that will be used to create and send requests.
    # This client only needs to be created once, and can be reused for multiple requests.
    client = aiplatform.gapic.JobServiceClient(client_options=client_options)
    custom_job = {
        "display_name": display_name,
        "job_spec": {
            "worker_pool_specs": [
                {
                    "machine_spec": {
                        "machine_type": "n1-standard-4",
                        "accelerator_type": aiplatform.gapic.AcceleratorType.NVIDIA_TESLA_K80,
                        "accelerator_count": 1,
                    },
                    "replica_count": 1,
                    "container_spec": {
                        "image_uri": container_image_uri,
                        "command": [],
                        "args": [],
                    },
                }
            ]
        },
    }
    parent = f"projects/{project}/locations/{location}"
    response = client.create_custom_job(parent=parent, custom_job=custom_job)
    print("response:", response)

Pour plus de contexte, lisez le guide de création d'un CustomJob.

Étape suivante