Configura los recursos de procesamiento para el entrenamiento personalizado

Cuando realizas un entrenamiento personalizado, tu código de entrenamiento se ejecuta en una o más instancias de máquina virtual (VM). Puedes configurar qué tipos de VM usar para el entrenamiento: el uso de VM con más recursos de procesamiento puede acelerar el entrenamiento y te permite trabajar con conjuntos de datos más grandes, pero también pueden generar mayores costos de entrenamiento.

En algunos casos, también puedes usar las GPU para acelerar el entrenamiento. Las GPU generan costos adicionales.

De manera opcional, puedes personalizar el tipo y el tamaño de los discos de arranque de tus VM de entrenamiento.

En este documento, se describen los diferentes recursos de procesamiento que puedes usar para el entrenamiento personalizado y cómo configurarlos.

Dónde especificar recursos de procesamiento

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.

Tipos de máquina

En tu WorkerPoolSpec, debes especificar uno de los siguientes tipos de máquina en el campo machineSpec.machineType. Cada réplica en el grupo de trabajadores se ejecuta en una VM independiente que tiene el tipo de máquina especificado.

  • a2-highgpu-1g*
  • a2-highgpu-2g*
  • a2-highgpu-4g*
  • a2-highgpu-8g*
  • a2-megagpu-16g*
  • e2-standard-4
  • e2-standard-8
  • e2-standard-16
  • e2-standard-32
  • e2-highmem-2
  • e2-highmem-4
  • e2-highmem-8
  • e2-highmem-16
  • e2-highcpu-16
  • e2-highcpu-32
  • n2-standard-4
  • n2-standard-8
  • n2-standard-16
  • n2-standard-32
  • n2-standard-48
  • n2-standard-64
  • n2-standard-80
  • n2-highmem-2
  • n2-highmem-4
  • n2-highmem-8
  • n2-highmem-16
  • n2-highmem-32
  • n2-highmem-48
  • n2-highmem-64
  • n2-highmem-80
  • n2-highcpu-16
  • n2-highcpu-32
  • n2-highcpu-48
  • n2-highcpu-64
  • n2-highcpu-80
  • n1-standard-4
  • n1-standard-8
  • n1-standard-16
  • n1-standard-32
  • n1-standard-64
  • n1-standard-96
  • n1-highmem-2
  • n1-highmem-4
  • n1-highmem-8
  • n1-highmem-16
  • n1-highmem-32
  • n1-highmem-64
  • n1-highmem-96
  • n1-highcpu-16
  • n1-highcpu-32
  • n1-highcpu-64
  • n1-highcpu-96
  • c2-standard-4
  • c2-standard-8
  • c2-standard-16
  • c2-standard-30
  • c2-standard-60

Para obtener más información sobre las especificaciones técnicas de cada tipo de máquina, consulta la documentación de Compute Engine sobre tipos de máquinas. Si deseas obtener información sobre el costo del uso de cada tipo de máquina para el entrenamiento personalizado, lee Precios.

En los siguientes ejemplos, se indica dónde debes especificar el tipo de máquina cuando creas un CustomJob:

Console

En Google Cloud Console, no puedes crear un CustomJob directamente. Sin embargo, puedes crear un TrainingPipeline que cree un CustomJob. Cuando crees una TrainingPipeline en Cloud Console, especifica un tipo de máquina para cada grupo de trabajadores en el paso Procesamiento y precios, en el campo Tipo de máquina.

gcloud

gcloud beta 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');
  console.log(`${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)

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

GPU

Si escribiste tu código de entrenamiento para usar GPU, puedes configurar tu grupo de trabajadores a fin de que use una o más GPU en cada VM. Para usar las GPU, debes usar un tipo de máquina A2 o N1.

Vertex AI es compatible con los siguientes tipos de GPU para el entrenamiento personalizado:

  • NVIDIA_TESLA_A100
  • NVIDIA_TESLA_K80
  • NVIDIA_TESLA_P4
  • NVIDIA_TESLA_P100
  • NVIDIA_TESLA_T4
  • NVIDIA_TESLA_V100

Si deseas obtener más información sobre la especificación técnica para cada tipo de GPU, consulta la documentación breve de Compute Engine sobre GPU para cargas de trabajo de procesamiento. Si deseas obtener información sobre el costo del uso de cada tipo de máquina para el entrenamiento personalizado, lee Precios.

En tu WorkerPoolSpec, especifica el tipo de GPU que deseas usar en el campo machineSpec.acceleratorType y la cantidad de GPU que quieres que cada VM en el grupo de trabajadores use en el campo machineSpec.acceleratorCount. Sin embargo, tus elecciones para estos campos deben cumplir con las siguientes restricciones:

  • El tipo de GPU que elijas debe estar disponible en la ubicación en la que realizas el entrenamiento personalizado. No todos los tipos de GPU están disponibles en todas las regiones. Obtén información sobre la disponibilidad regional.

  • Solo puedes usar una cantidad determinada de GPU en tu configuración. Por ejemplo, puedes usar 2 o 4 GPU NVIDIA_TESLA_T4 en una VM, pero no 3. A fin de averiguar qué valores de acceleratorCount son válidos para cada tipo de GPU, consulta la siguiente tabla de compatibilidad.

  • Debes asegurarte de que tu configuración de GPU proporcione suficientes CPU virtuales y memoria para el tipo de máquina con el que la uses. Por ejemplo, si usas el tipo de máquina n1-standard-32 en tu grupo de trabajadores, cada VM tiene 32 CPU virtuales y 120 GB de memoria. Debido a que cada GPU NVIDIA_TESLA_V100 puede proporcionar hasta 12 CPU virtuales y 76 GB de memoria, debes usar al menos 4 GPU para cada VM n1-standard-32 a fin de cumplir con sus requisitos. (2 GPU no proporcionan los recursos suficientes y no puedes especificar 3 GPU).

    En la siguiente tabla de compatibilidad, se explica este requisito.

    Ten en cuenta las limitaciones siguientes adicionales sobre el uso de GPU para el entrenamiento personalizado que difiere del uso de GPU con Compute Engine:

    • Una configuración con 8 GPU NVIDIA_TESLA_K80 solo proporciona hasta 208 GB de memoria en todas las regiones y zonas.
    • Una configuración con 4 GPU NVIDIA_TESLA_P100 solo proporciona hasta 64 CPU virtuales y 208 GB de memoria en todas las regiones y zonas.

En la siguiente tabla de compatibilidad, se enumeran los valores válidos de machineSpec.acceleratorCount según tus elecciones para machineSpec.machineType y machineSpec.acceleratorType:

Números válidos de GPU para cada tipo de máquina
Tipo de máquina NVIDIA_TESLA_A100 NVIDIA_TESLA_K80 NVIDIA_TESLA_P4 NVIDIA_TESLA_P100 NVIDIA_TESLA_T4 NVIDIA_TESLA_V100
a2-highgpu-1g 1
a2-highgpu-2g 2
a2-highgpu-4g 4
a2-highgpu-8g 8
a2-megagpu-16g 16
n1-standard-4 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-standard-8 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-standard-16 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 2, 4, 8
n1-standard-32 4, 8 2, 4 2, 4 2, 4 4, 8
n1-standard-64 4 4 8
n1-standard-96 4 4 8
n1-highmem-2 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-highmem-4 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-highmem-8 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-highmem-16 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 2, 4, 8
n1-highmem-32 4, 8 2, 4 2, 4 2, 4 4, 8
n1-highmem-64 4 4 8
n1-highmem-96 4 4 8
n1-highcpu-16 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 2, 4, 8
n1-highcpu-32 4, 8 2, 4 2, 4 2, 4 4, 8
n1-highcpu-64 8 4 4 4 8
n1-highcpu-96 4 4 8

En los ejemplos siguientes, se indica dónde puedes especificar las GPU cuando creas un CustomJob:

Console

En Cloud Console, no puedes crear un CustomJob directamente. Sin embargo, puedes crear un TrainingPipeline que cree un CustomJob. Cuando creas un TrainingPipeline en Cloud Console, puedes especificar GPU para cada grupo de trabajadores en el paso Procesamiento y precios. Primero especifica un tipo de máquina. Luego, puedes especificar los detalles de la GPU en los campos Tipo de acelerador y Recuento de aceleradores.

gcloud

Para especificar las GPU con la herramienta de línea de comandos de gcloud, debes usar un archivo config.yaml. Por ejemplo:

config.yaml

workerPoolSpecs:
  machineSpec:
    machineType: MACHINE_TYPE
    acceleratorType: ACCELERATOR_TYPE
    acceleratorCount: ACCELERATOR_COUNT
  replicaCount: REPLICA_COUNT
  containerSpec:
    imageUri: CUSTOM_CONTAINER_IMAGE_URI

Luego, ejecuta un comando como el siguiente:

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --config=config.yaml

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');
  console.log(`${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)

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

Opciones de disco de arranque

De manera opcional, puedes personalizar los discos de arranque para tus VM de entrenamiento. Todas las VM en un grupo de trabajadores usan el mismo tipo y tamaño de disco de arranque.

  • Para personalizar el tipo de disco de arranque que usa cada VM de entrenamiento, especifica el campo diskSpec.bootDiskType en tu WorkerPoolSpec.

    Puedes configurar este campo como pd-standard para usar un disco persistente estándar respaldado por un disco duro estándar, o puedes configurarlo como pd-ssd a fin de usar un disco persistente SSD respaldado por una unidad de estado sólido. El valor predeterminado es pd-ssd.

    Usar pd-ssd puede mejorar el rendimiento si tu código de entrenamiento lee y escribe en el disco. Obtén más información sobre los tipos de discos.

  • Para personalizar el tamaño (en GB) del disco de arranque que usa cada VM de entrenamiento, especifica el campo diskSpec.bootDiskSizeGb en tu WorkerPoolSpec.

    Puedes configurar este campo en un número entero entre 100 y 64,000, inclusive. El valor predeterminado es 100.

    Es posible que quieras aumentar el tamaño del disco de arranque si tu código de entrenamiento escribe muchos datos temporales en el disco. Ten en cuenta que los datos que escribas en el disco de arranque son temporales y no podrás recuperarlos después de completar el entrenamiento.

Cambiar el tipo y el tamaño de los discos de arranque afecta el precio del entrenamiento personalizado.

En los siguientes ejemplos, se destaca dónde puedes especificar opciones del disco de arranque cuando creas un CustomJob:

Console

En Cloud Console, no puedes crear un CustomJob directamente. Sin embargo, puedes crear un TrainingPipeline que cree un CustomJob. Cuando creas un TrainingPipeline en Cloud Console, puedes especificar opciones del disco de arranque para cada grupo de trabajadores en el paso Procesamiento y precios, en la lista desplegable Tipo de disco y el campo Tamaño del disco (GB).

gcloud

Para especificar las opciones del disco de arranque con la herramienta de línea de comandos de gcloud, debes usar un archivo config.yaml. Por ejemplo:

config.yaml

workerPoolSpecs:
  machineSpec:
    machineType: MACHINE_TYPE
  diskSpec:
    bootDiskType: DISK_TYPE
    bootDiskSizeGb: DISK_SIZE
  replicaCount: REPLICA_COUNT
  containerSpec:
    imageUri: CUSTOM_CONTAINER_IMAGE_URI

Luego, ejecuta un comando como el siguiente:

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --config=config.yaml

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

¿Qué sigue?