Configurare le impostazioni del contenitore per l'addestramento personalizzato

Quando esegui l'addestramento personalizzato, devi specificare il codice di machine learning (ML) che vuoi che Vertex AI esegua. A tale scopo, configura le impostazioni del container di addestramento per un container personalizzato o un'applicazione di addestramento Python che viene eseguita su un container predefinito.

Per determinare se vuoi utilizzare un contenitore personalizzato o un contenitore predefinito, consulta la sezione Requisiti del codice di addestramento.

Questo documento descrive i campi dell'API Vertex AI che devi specificare in uno dei casi precedenti.

Dove specificare le impostazioni del contenitore

Specifica i dettagli di configurazione all'interno di un WorkerPoolSpec. A seconda di come esegui l'addestramento personalizzato, inserisci questo WorkerPoolSpec in uno dei seguenti campi dell'API:

Se esegui l'addestramento distribuito, puoi utilizzare impostazioni diverse per ogni pool di worker.

Configura le impostazioni del contenitore

A seconda che tu stia utilizzando un contenitore predefinito o uno personalizzato, devi specificare campi diversi all'interno di WorkerPoolSpec. Seleziona la scheda relativa al tuo scenario:

Container predefinito

  1. Seleziona un container predefinito che supporti il framework ML che prevedi di utilizzare per l'addestramento. Specifica uno degli URI dell'immagine container nel pythonPackageSpec.executorImageUri campo.

  2. Specifica gli URI Cloud Storage della tua applicazione di addestramento in Python nel pythonPackageSpec.packageUris campo.

  3. Specifica il modulo del punto di contatto dell'applicazione di addestramento nel pythonPackageSpec.pythonModule campo.

  4. Facoltativamente, specifica un elenco di argomenti della riga di comando da passare al modulo del punto di ingresso dell'applicazione di addestramento nel pythonPackageSpec.args campo.

Gli esempi riportati di seguito mostrano dove specificare queste impostazioni del contenitore quando crei un CustomJob:

Console

Nella console Google Cloud non puoi creare direttamente un CustomJob. Tuttavia, puoi creare un TrainingPipeline che crea un CustomJob. Quando crei un TrainingPipeline nella console Google Cloud, puoi specificare le impostazioni preimpostate del contenitore in determinati campi del passaggio Contenitore di addestramento:

  • pythonPackageSpec.executorImageUri: utilizza gli elenchi a discesa Framework modello e Versione framework modello.

  • pythonPackageSpec.packageUris: utilizza il campo Posizione del pacco.

  • pythonPackageSpec.pythonModule: utilizza il campo Modulo Python.

  • pythonPackageSpec.args: utilizza il campo Argomenti.

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

Per maggiori informazioni, consulta la guida alla creazione di un CustomJob.

Container personalizzato

  1. Specifica l'URI di Artifact Registry o Docker Hub del contenitore personalizzato nel containerSpec.imageUri campo.

  2. Se vuoi, puoi eseguire l'override delle istruzioni ENTRYPOINT o CMD nel contenitore specificando i campi containerSpec.command o containerSpec.args. Questi campi influiscono sul funzionamento del contenitore in base alle seguenti regole:

    • Se non specifichi nessuno dei due campi: il contenitore viene eseguito in base alle sue istruzioni ENTRYPOINT e CMD (se esistenti). Consulta la documentazione di Docker su come interagiscono CMD e ENTRYPOINT.

    • Se specifichi solo containerSpec.command: il contenitore viene eseguito con il valore di containerSpec.command che sostituisce l'istruzione ENTRYPOINT. Se il contenitore ha un'istruzione CMD, viene ignorato.

    • Se specifichi solo containerSpec.args: il contenitore viene eseguito in base all'istruzione ENTRYPOINT, con il valore di containerSpec.args che sostituisce l'istruzione CMD.

    • Se specifichi entrambi i campi: il contenitore viene eseguito concontainerSpec.command che sostituisce l'istruzione ENTRYPOINT econtainerSpec.args che sostituisce l'istruzione CMD.

L'esempio seguente mostra dove puoi specificare alcune di queste impostazioni del contenitore quando crei un CustomJob:

Console

Nella console Google Cloud non puoi creare direttamente un CustomJob. Tuttavia, puoi creare un TrainingPipeline che crea un CustomJob. Quando crei un TrainingPipeline nella console Google Cloud, puoi specificare impostazioni personalizzate del contenuto in determinati campi del passaggio Container di addestramento:

  • containerSpec.imageUri: utilizza il campo Immagine container.

  • containerSpec.command: questo campo dell'API non è configurabile nella console Google Cloud.

  • containerSpec.args: utilizza il campo Argomenti.

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

Prima di provare questo esempio, segui le istruzioni di configurazione Java riportate nella guida rapida all'utilizzo delle librerie client di Vertex AI. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Java di Vertex AI.

Per autenticarti in Vertex AI, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.


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

Prima di provare questo esempio, segui le istruzioni di configurazione Node.js riportate nella guida rapida all'utilizzo delle librerie client di Vertex AI. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Node.js di Vertex AI.

Per autenticarti in Vertex AI, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.

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

Per scoprire come installare o aggiornare l'SDK Vertex AI per Python, consulta Installare l'SDK Vertex AI per Python. Per saperne di più, consulta la documentazione di riferimento dell'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)

Per maggiori informazioni, consulta la guida alla creazione di un CustomJob.

Passaggi successivi