Establece la configuración de los contenedores para el entrenamiento personalizado

Cuando realizas un entrenamiento personalizado, debes especificar qué código de aprendizaje automático (AA) deseas que Vertex AI ejecute. Para ello, establece la configuración de los contenedores de entrenamiento para un contenedor personalizado o una aplicación de entrenamiento de Python que se ejecuta en un contenedor compilado previamente.

Para determinar si deseas usar un contenedor personalizado o uno ya compilado, lee Requisitos del código de entrenamiento.

En este documento, se describen los campos de la API de Vertex AI que debes especificar en cualquiera de los casos anteriores.

Dónde especificar la configuración del contenedor

Especifica los detalles de configuración dentro de un WorkerPoolSpec. Según cómo realices el entrenamiento personalizado, coloca este WorkerPoolSpec en uno de los siguientes campos de la API:

Si realizas un entrenamiento distribuido, puedes usar opciones de configuración diferentes para cada grupo de trabajadores.

Configura el Contenedor de la siguiente forma:

Según si usas un contenedor previamente compilado o un contenedor personalizado, debes especificar campos diferentes dentro de WorkerPoolSpec. Selecciona la pestaña de tu situación:

Contenedor previamente compilado

  1. Selecciona un contenedor compilado previamente que admita el framework del AA que planeas usar para el entrenamiento. Especifica uno de los URI de la imagen de contenedor en el campo pythonPackageSpec.executorImageUri.

  2. Especifica los URI de Cloud Storage de tu aplicación de entrenamiento de Python en el campo pythonPackageSpec.packageUris.

  3. Especifica el módulo de punto de entrada de la aplicación de entrenamiento en el campo pythonPackageSpec.pythonModule.

  4. De manera opcional, especifica una lista de argumentos de la línea de comandos para pasar al módulo de punto de entrada de tu aplicación de entrenamiento en el campo pythonPackageSpec.args.

En los ejemplos siguientes, se destaca dónde especificarás estas opciones de configuración del contenedor cuando creas un CustomJob:

Consola

En la consola de Google Cloud, no puedes crear un CustomJob directamente. Sin embargo, puedes crear un TrainingPipeline que cree un CustomJob. Cuando creas un TrainingPipeline en la consola de Google Cloud, puedes especificar una configuración de contenedor compilado previamente en ciertos campos del paso Contenedor de entrenamiento:

  • pythonPackageSpec.executorImageUri: usa las listas desplegables Model Framework y Model Framework version.

  • pythonPackageSpec.packageUris: usa el campo Package location.

  • pythonPackageSpec.pythonModule: usa el campo Python module.

  • pythonPackageSpec.args: Usa el campo Argumentos.

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

Para obtener más información, lee la guía para crear un CustomJob.

Contenedor personalizado

  1. Especifica el URI de Artifact Registry o Docker Hub de tu contenedor personalizado en el campo containerSpec.imageUri.

  2. De forma opcional, si deseas anular las instrucciones ENTRYPOINT o CMD en tu contenedor, especifica los campos containerSpec.command o containerSpec.args. Estos campos afectan cómo se ejecuta el contenedor de acuerdo con las siguientes reglas:

    • Si no especificas ningún campo: el contenedor se ejecuta según su instrucción ENTRYPOINT y la instrucción CMD (si existe). Consulta la documentación de Docker sobre cómo interactúan CMD y ENTRYPOINT.

    • Si especificas solo containerSpec.command: el contenedor se ejecutará con el valor de containerSpec.command, y se reemplazará la instrucción ENTRYPOINT. Si el contenedor tiene una instrucción CMD, se ignora.

    • Si especificas solo containerSpec.args: tu contenedor se ejecuta según su instrucción ENTRYPOINT y el valor de containerSpec.args reemplaza a su instrucción CMD.

    • Si especificas ambos campos: Tu contenedor se ejecuta con containerSpec.command y reemplaza su instrucción ENTRYPOINT y containerSpec.args con el reemplazo de la instrucción CMD.

En el siguiente ejemplo, se destaca dónde puedes especificar algunas de estas configuraciones de contenedor cuando creas un CustomJob:

Consola

En la consola de Google Cloud, no puedes crear un CustomJob directamente. Sin embargo, puedes crear un TrainingPipeline que cree un CustomJob. Cuando creas un TrainingPipeline en la consola de Google Cloud, puedes especificar una configuración de contenedor personalizado en ciertos campos del paso Contenedor de entrenamiento:

  • containerSpec.imageUri: usa el campo Container image.

  • containerSpec.command: este campo de API no se puede configurar en la consola de Google Cloud.

  • containerSpec.args: Usa el campo Argumentos.

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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de Vertex AI sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Vertex AI Java.

Para autenticarte en Vertex AI, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo 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_K80)
              .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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de Vertex AI sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Vertex AI Node.js.

Para autenticarte en Vertex AI, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo 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

Si deseas obtener información para instalar o actualizar el SDK de Vertex AI para Python, consulta Instala el SDK de Vertex AI para Python. Si deseas obtener más información, consulta la documentación de referencia de la API de 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)

Para obtener más información, lee la guía para crear un CustomJob.

¿Qué sigue?