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 Google Cloud Console, 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 Cloud Console, 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, Container 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 Google Cloud Console, 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 Cloud Console, 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 Cloud Console.

  • 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

Node.js

/**
 * 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

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