Usar VMs spot com o treinamento

Visão geral

É possível reduzir o custo de execução dos jobs de treinamento personalizado usando VMs spot. As VMs spot são instâncias de máquina virtual (VM) que excedem a capacidade do Compute Engine. Elas têm descontos significativos, mas o Compute Engine pode forçar a interrupção (preempção) ou excluir essas VMs para recuperar a capacidade a qualquer momento.

Para saber mais, consulte VMs spot.

Limitações e requisitos

Considere as seguintes limitações e requisitos ao usar VMs spot com a Vertex AI:

  • Todas as limitações de VMs spot se aplicam ao usar VMs spot com a Vertex AI.
  • O uso de VMs spot com a Vertex AI é permitido apenas para treinamento e previsão personalizados.
  • Não é possível usar VMs spot com pods de TPU.
  • O treinamento da Vertex AI só pode usar VMs spot com as seguintes séries de máquinas:

    • A2
    • A3
  • Não é possível enviar o job pelo console do Google Cloud.

Faturamento

Se as cargas de trabalho forem tolerantes a falhas e resistentes a possíveis preempções de VMs, as VMs spot poderão reduzir significativamente os custos de computação. Quando algumas dessas VMs são interrompidas durante o processamento, o job fica lento, mas não para por completo. As VMs spot concluem as tarefas de processamento em lote sem colocar carga extra nas VMs atuais e sem exigir que você pague o preço total de VMs padrão adicionais. Consulte Como lidar com a preempção.

Ao usar VMs spot, você recebe uma cobrança pela duração do job e pelo tipo de máquina. Você não paga pelo tempo em que o job está na fila ou está interrompido à força.

Como lidar com preempções

As VMs spot podem ser recuperadas pelo Compute Engine a qualquer momento. Portanto, o job de treinamento personalizado precisa ser tolerante a falhas para aproveitar ao máximo as VMs spot. Quando as VMs spot são interrompidas à força, o job de treinamento personalizado falha com um erro STOCKOUT e o Compute Engine tenta reiniciá-lo até seis vezes. Para saber como aproveitar ao máximo as VMs spot, consulte Práticas recomendadas para VMs spot.

Confira alguns métodos que podem ser usados para tornar o job de treinamento personalizado tolerante a falhas:

  • Crie checkpoints para salvar o progresso. Ao armazenar periodicamente o progresso do modelo, é possível garantir que um job de treinamento personalizado encerrado possa ser retomado a partir do último checkpoint armazenado, em vez de começar do zero.
  • Use o Elastic Horovod. O treinamento elástico permite que o Horovod dimensione os recursos de computação sem precisar reiniciar ou retomar os checkpoints. Para saber mais, consulte Elastic Horovod.
  • Use um script de encerramento. Quando o Compute Engine interrompe à força uma VM spot, é possível usar um script de encerramento para tentar executar ações de limpeza antes da interrupção da VM. Para saber mais, consulte Como lidar com a preempção com um script de encerramento.

Antes de começar

Prepare o app de treinamento personalizado:

Configurar o job de treinamento para usar VMs spot

É possível configurar o job de treinamento personalizado para usar VMs spot especificando uma estratégia SPOT na configuração de programação.

REST

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • LOCATION: a região em que o contêiner ou o pacote Python será executado.
  • PROJECT_ID: o ID do projeto.
  • JOB_NAME: obrigatório. Um nome de exibição para CustomJob.
  • Defina o job de treinamento personalizado:
    • MACHINE_TYPE: o tipo da máquina. Consulte os tipos de máquina disponíveis para treinamento.
    • REPLICA_COUNT: o número de réplicas de worker a serem usadas. Na maioria dos casos, defina esse valor como 1 para o primeiro pool de workers.
    • Se o aplicativo de treinamento for executado em um contêiner personalizado, especifique o seguinte:
      • CUSTOM_CONTAINER_IMAGE_URI: o URI de uma imagem de contêiner do Docker com o código de treinamento. Saiba como criar uma imagem de contêiner personalizada.
      • CUSTOM_CONTAINER_COMMAND: opcional. O comando que será invocado quando o contêiner for iniciado. Esse comando substitui o ponto de entrada padrão do contêiner.
      • CUSTOM_CONTAINER_ARGS: opcional. Argumentos a serem passados ao iniciar o contêiner.
    • Se o aplicativo de treinamento for um pacote Python executado em um contêiner pré-criado, especifique o seguinte:
      • EXECUTOR_IMAGE_URI: o URI da imagem do contêiner que executa o código fornecido; Consulte os contêineres pré-criados disponíveis para treinamento.
      • PYTHON_PACKAGE_URIS: lista separada por vírgulas de URIs do Cloud Storage que especificam os arquivos de pacote do Python que são o programa de treinamento e os pacotes dependentes. O número máximo de URIs de pacote é 100.
      • PYTHON_MODULE: o nome do módulo Python que será executado após a instalação dos pacotes.
      • PYTHON_PACKAGE_ARGS: opcional. Argumentos da linha de comando a serem passados para o módulo Python.

Método HTTP e URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs

Corpo JSON da solicitação:

{
  "displayName": "JOB_NAME",
  "jobSpec": {
    "workerPoolSpecs": [
      {
        "machineSpec": {
          "machineType": "MACHINE_TYPE"
          }
        },
        "replicaCount": REPLICA_COUNT,

        // Union field task can be only one of the following:
        "containerSpec": {
          "imageUri": CUSTOM_CONTAINER_IMAGE_URI,
          "command": [
            CUSTOM_CONTAINER_COMMAND
          ],
          "args": [
            CUSTOM_CONTAINER_ARGS
          ]
        },
        "pythonPackageSpec": {
          "executorImageUri": EXECUTOR_IMAGE_URI,
          "packageUris": [
            PYTHON_PACKAGE_URIS
          ],
          "pythonModule": PYTHON_MODULE,
          "args": [
            PYTHON_PACKAGE_ARGS
          ]
        }
        // End of list of possible types for union field task.
      }
      // Specify one workerPoolSpec for single replica training, or multiple workerPoolSpecs
      // for distributed training.
    ],
    "scheduling": {
      "strategy": "SPOT"
    }
  }
}

Para enviar a solicitação, escolha uma destas opções:

curl

Salve o corpo da solicitação em um arquivo com o nome request.json e execute o comando a seguir:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs"

PowerShell

Salve o corpo da solicitação em um arquivo com o nome request.json e execute o comando a seguir:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs" | Select-Object -Expand Content

A resposta contém informações sobre especificações, bem como o TRAININGPIPELINE_ID.

Python

Para saber como instalar ou atualizar o SDK da Vertex AI para Python, consulte Instalar o SDK da Vertex AI para Python. Saiba mais na documentação de referência da API do SDK da Vertex AI para Python.

customJob = aiplatform.CustomJob(
    display_name=TEST_CASE_NAME,
    worker_pool_specs=worker_pool_spec,
    staging_bucket=OUTPUT_DIRECTORY
)

customJob.run( scheduling_strategy=aiplatform.compat.types.custom_job.Scheduling.Strategy.SPOT )

A seguir