Configurar recursos de computação para treinamento personalizado

Ao fazer o treinamento personalizado, o código de treinamento é executado em uma ou mais instâncias de máquina virtual (VM). Configurar os tipos de VM que serão usados no treinamento: usar VMs com mais recursos de computação pode acelerar o treinamento e permitir que você trabalhe com conjuntos de dados maiores, mas eles também podem gerar maiscustos de treinamento.

Em alguns casos, você também pode usar GPUs para acelerar o treinamento. As GPUs geram outros custos.

Também é possível personalizar o tipo e o tamanho dos discos de inicialização das suas VMs de treinamento.

Este documento descreve os diferentes recursos de computação que podem ser usados no treinamento personalizado e como configurá-los.

Onde especificar recursos de computação

Especifique os detalhes de configuração em um WorkerPoolSpec. Dependendo de como você realiza o treinamento personalizado, coloque esse WorkerPoolSpec em um dos seguintes campos da API:

Se você estiver realizando o treinamento distribuído, use configurações diferentes para cada pool de workers.

Tipos de máquina

Em WorkerPoolSpec, é preciso especificar um dos seguintes tipos de máquina no campo machineSpec.machineType. Cada réplica no pool de workers é executada em uma VM separada que tem o 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 saber mais sobre as especificações técnicas de cada tipo de máquina, leia a documentação do Compute Engine sobre tipos de máquinas. Para saber mais sobre o custo de uso de cada tipo de máquina para treinamento personalizado, leia Preços.

Os exemplos a seguir destacam onde você especifica um tipo de máquina ao criar um CustomJob:

Console

No Console do Google Cloud, não é possível criar um CustomJob diretamente. No entanto, é possível criar um TrainingPipeline que crie um CustomJob. Ao criar um TrainingPipeline no Console do Cloud, especifique um tipo de máquina para cada pool de workers na etapa Compute and price, no Machine type.

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 mais contexto, leia o guia para criar um CustomJob.

GPUs

Se você escrever seu código de treinamento para usar GPUs, poderá configurar o pool de workers para usar uma ou mais GPUs em cada VM. Para usar GPUs, você precisa usar um tipo de máquina A2 ou N1.

O Vertex AI é compatível com os seguintes tipos de GPU para treinamento personalizado:

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

Para saber mais sobre a especificação técnica para cada tipo de GPU, leia a documentação breve do Compute Engine sobre GPUs para cargas de trabalho de computação. Para saber mais sobre o custo de usar cada tipo de máquina para treinamento personalizado, leia Preços.

Em WorkerPoolSpec, especifique o tipo de GPU que você quer usar no campo machineSpec.acceleratorType e o número de GPUs que você quer que cada VM no pool de workers para usar no campo machineSpec.acceleratorCount. No entanto, suas escolhas para esses campos precisam atender às seguintes restrições:

  • O tipo de GPU escolhido precisa estar disponível no local em que você está executando o treinamento personalizado. Nem todos os tipos de GPU estão disponíveis em todas as regiões. Saiba mais sobre a disponibilidade regional.

  • Só é possível usar determinados números de GPUs na configuração. Por exemplo, é possível usar duas ou quatro GPUs NVIDIA_TESLA_T4 em uma VM, mas não 3. Para ver quais valores acceleratorCount são válidos para cada tipo de GPU, consulte a tabela de compatibilidade a seguir.

  • Verifique se a configuração da GPU fornece CPUs virtuais e memória suficientes para o tipo de máquina com que você a usa. Por exemplo, se você usar o tipo de máquina n1-standard-32 no seu pool de workers, cada VM terá 32 CPUs virtuais e 120 GB de memória. Como cada GPU NVIDIA_TESLA_V100 pode fornecer até 12 CPUs virtuais e 76 GB de memória, é preciso usar pelo menos quatro GPUs para cada VM n1-standard-32 a fim de atender aos requisitos. Duas GPUs fornecem recursos insuficientes, e não é possível especificar três GPUs.

    A tabela de compatibilidade a seguir leva em conta esse requisito.

    Observe as outras limitações a seguir sobre o uso de GPUs para treinamento personalizado que difere do uso de GPUs com o Compute Engine:

    • Uma configuração com 8 GPUs NVIDIA_TESLA_K80 oferece até 208 GB de memória em todas as regiões e zonas.
    • Uma configuração com quatro GPUs NVIDIA_TESLA_P100 oferece até 64 CPUs virtuais e até 208 GB de memória em todas as regiões e zonas.

A tabela de compatibilidade a seguir lista os valores válidos para machineSpec.acceleratorCount dependendo das suas escolhas para machineSpec.machineType e machineSpec.acceleratorType:

Números válidos de GPUs 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

Os exemplos a seguir destacam onde você pode especificar GPUs ao criar um CustomJob:

Console

No Console do Cloud, não é possível criar um CustomJob diretamente. No entanto, é possível criar um TrainingPipeline que crie um CustomJob. Ao criar um TrainingPipeline no Console do Cloud, é possível especificar GPUs para cada pool de workers na etapa Compute e preços Primeiro, especifique um Tipo de máquina. Em seguida, é possível especificar detalhes da GPU nos campos Tipo de acelerador e Contagem de aceleradores.

gcloud

Para especificar GPUs usando a ferramenta de linha de comando gcloud, você precisa usar um arquivo config.yaml. Exemplo:

config.yaml

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

Em seguida, execute um comando como este:

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 mais contexto, leia o guia para criar um CustomJob.

Opções de disco de inicialização

Opcionalmente, é possível personalizar os discos de inicialização das VMs de treinamento. Todas as VMs em um pool de workers usam o mesmo tipo e tamanho do disco de inicialização.

  • Para personalizar o tipo de disco de inicialização que cada VM de treinamento usa, especifique o campo diskSpec.bootDiskType no WorkerPoolSpec.

    Defina esse campo como pd-standard para usar um disco permanente padrão com suporte de um disco rígido padrão ou configure-o como pd-ssd para usar um disco permanente SSD com suporte. unidade de estado sólido O valor padrão é pd-ssd.

    O uso de pd-ssd pode melhorar o desempenho se o código de treinamento for lido e gravado no disco. Saiba mais sobre tipos de disco.

  • Para personalizar o tamanho (em GB) do disco de inicialização que cada VM de treinamento usa, especifique adiskSpec.bootDiskSizeGb campo no seuWorkerPoolSpec para criar um anexo da VLAN de monitoramento.

    Você pode definir esse campo como um número inteiro entre 100 e 64.000. O valor padrão é 100.

    É recomendável aumentar o tamanho do disco de inicialização se o código de treinamento gravar muitos dados temporários no disco. Observe que os dados gravados no disco de inicialização são temporários, e não é possível recuperá-los após a conclusão do treinamento.

Alterar o tipo e o tamanho dos discos de inicialização afeta os preços de treinamento personalizados.

Os exemplos a seguir destacam onde você pode especificar opções de disco de inicialização ao criar um CustomJob:

Console

No Console do Cloud, não é possível criar um CustomJob diretamente. No entanto, é possível criar um TrainingPipeline que crie um CustomJob. Ao criar um TrainingPipeline no Console do Cloud, é possível especificar opções de disco de inicialização para cada pool de workers noComputação e preços, naTipo de disco na lista suspensa e no campoTamanho do disco (GB) campo.

gcloud

Para especificar opções de disco de inicialização usando a ferramenta de linha de comando gcloud, use um arquivo config.yaml. Exemplo:

config.yaml

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

Em seguida, execute um comando como este:

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

Para mais contexto, leia o guia para criar um CustomJob.

A seguir