Configurar los ajustes de los contenedores para el entrenamiento personalizado

Cuando realizas un entrenamiento personalizado, debes especificar el código de aprendizaje automático que quieres que ejecute Vertex AI. Para ello, configura los ajustes del contenedor de entrenamiento para un contenedor personalizado o una aplicación de entrenamiento de Python que se ejecute en un contenedor prediseñado.

Para determinar si quieres usar un contenedor personalizado o uno precompilado, consulta los requisitos del código de entrenamiento.

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

Dónde especificar la configuración del contenedor

Especifica los detalles de la configuración en un elemento WorkerPoolSpec. En función de 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 diferentes ajustes para cada grupo de trabajadores.

Configurar los ajustes del contenedor

En función de si usas un contenedor precompilado o uno personalizado, debes especificar diferentes campos en WorkerPoolSpec. Selecciona la pestaña correspondiente a tu situación:

Contenedor prediseñado

  1. Selecciona un contenedor predefinido que admita el framework de aprendizaje automático que quieras usar para el entrenamiento. Especifica uno de los URIs de la imagen del contenedor en el campo pythonPackageSpec.executorImageUri.

  2. Especifica los URIs de Cloud Storage de tu aplicación de formación de Python en el campopythonPackageSpec.packageUris.

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

  4. También puede especificar una lista de argumentos de línea de comandos que se pasarán al módulo del punto de entrada de la aplicación de entrenamiento en el campo pythonPackageSpec.args.

En los siguientes ejemplos se destaca dónde se especifican estos ajustes del contenedor al crear un CustomJob:

Consola

En la consola Google Cloud , no puedes crear un CustomJob directamente. Sin embargo, puedes crear un TrainingPipeline que cree un CustomJob. Cuando creas un TrainingPipeline en la Google Cloud consola, puedes especificar ajustes de contenedor prediseñados en determinados campos del paso Contenedor de entrenamiento:

  • pythonPackageSpec.executorImageUri: Usa las listas desplegables Framework del modelo y Versión del framework del modelo.

  • pythonPackageSpec.packageUris: usa el campo Ubicación del paquete.

  • pythonPackageSpec.pythonModule: usa el campo Módulo de Python.

  • pythonPackageSpec.args: usa el campo Arguments (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, consulta la guía para crear un CustomJob.

Contenedor personalizado

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

  2. Si quiere anular las instrucciones de ENTRYPOINT o CMD de su contenedor, especifique los campos containerSpec.command o containerSpec.args. Estos campos afectan al funcionamiento del contenedor según las siguientes reglas:

    • Si no especifica ninguno de los dos campos: el contenedor se ejecuta según su instrucción ENTRYPOINT e instrucción CMD (si existe). Consulta la documentación de Docker sobre cómo interactúan CMD y ENTRYPOINT.

    • Si solo especifica containerSpec.command: su contenedor se ejecuta con el valor containerSpec.command en lugar de la instrucción ENTRYPOINT. Si el contenedor tiene una instrucción CMD, se ignora.

    • Si solo especificas containerSpec.args: el contenedor se ejecuta según su instrucción ENTRYPOINT, con el valor de containerSpec.args en lugar de su instrucción CMD.

    • Si especificas ambos campos: tu contenedor se ejecuta con containerSpec.command en lugar de la instrucción ENTRYPOINT y con containerSpec.args en lugar de la instrucción CMD.

En el siguiente ejemplo se destaca dónde puede especificar algunos de estos ajustes del contenedor al crear un CustomJob:

Consola

En la consola 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 Google Cloud , puedes especificar ajustes de contenedor personalizados en determinados campos del paso Contenedor de entrenamiento:

  • containerSpec.imageUri: usa el campo Imagen del contenedor.

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

  • containerSpec.args: usa el campo Arguments (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 Java instrucciones de configuración de la guía de inicio rápido de Vertex AI con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Java de Vertex AI.

Para autenticarte en Vertex AI, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en 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_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

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

Para autenticarte en Vertex AI, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en 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_T4',
            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

Para saber cómo instalar o actualizar el SDK de Vertex AI para Python, consulta Instalar el SDK de Vertex AI para Python. Para obtener más información, consulta la documentación de referencia de la 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)

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

Siguientes pasos