Usa VMs Spot con entrenamiento

Descripción general

Puedes reducir el costo de ejecutar tus trabajos de entrenamiento personalizados con las VMs Spot. Las VMs Spot son instancias de máquina virtual (VM) que son un excedente de capacidad de Compute Engine. Las VMs Spot tienen descuentos significativos, pero Compute Engine podría detener o borrar (interrumpir) las VMs Spot de forma preventiva para recuperar la capacidad en cualquier momento.

Para obtener más información, consulta VMs Spot.

Limitaciones y requisitos

Ten en cuenta las siguientes limitaciones y requisitos cuando uses VMs Spot con Vertex AI:

  • Todas las limitaciones de las VMs Spot se aplican cuando se usan VMs Spot con Vertex AI.
  • El uso de VMs Spot con Vertex AI solo se admite para el entrenamiento y la predicción personalizados.
  • No se admite el uso de VMs Spot con Pods de TPU.
  • El entrenamiento de Vertex AI solo puede usar VMs Spot con las siguientes series de máquinas:

    • A2
    • A3
  • No se admite el envío de trabajos a través de la consola de Google Cloud.

Facturación

Si tus cargas de trabajo son tolerantes a errores y pueden admitir una posible interrupción de la VM, las VMs Spot pueden reducir los costos de procesamiento de manera significativa. Si algunas de tus VMs se detienen durante el procesamiento, el trabajo se ralentiza, pero no se detiene por completo. Las VMs Spot completan tus tareas de procesamiento por lotes sin incorporar carga adicional en tus VMs existentes y sin que debas pagar el precio total por las VMs estándar adicionales. Consulta Manejo de interrupciones.

Cuando usas VMs Spot, se te factura según la duración del trabajo y el tipo de máquina. No pagarás por el tiempo que el trabajo esté en una fila o se haya reemplazado.

Manejo de interrupciones

Compute Engine puede reclamar las VMs Spot en cualquier momento. Por lo tanto, tu trabajo de entrenamiento personalizado debe ser tolerante a errores para obtener el mayor beneficio de las VMs Spot. Cuando se interrumpen las VMs Spot, el trabajo de entrenamiento personalizado falla con un error STOCKOUT y Compute Engine intenta reiniciar el trabajo hasta seis veces. Para obtener información sobre cómo aprovechar al máximo tus VMs Spot, consulta las prácticas recomendadas para las VMs Spot.

Los siguientes son algunos de los métodos que puedes usar para que tu trabajo de entrenamiento personalizado sea tolerante a fallas:

  • Crea puntos de control para guardar el progreso. Si almacenas el progreso de tu modelo de forma periódica, puedes asegurarte de que un trabajo de entrenamiento personalizado finalizado pueda reanudarse desde el último punto de control almacenado, en lugar de comenzar de nuevo desde el principio.
  • Usa Elastic Horovod. El entrenamiento elástico permite que Horovod escale tus recursos de procesamiento sin necesidad de reiniciarse ni reanudarse desde puntos de control. Para obtener más información, consulta Elastic Horovod.
  • Usa una secuencia de comandos de apagado. Cuando Compute Engine interrumpe una VM Spot, puedes usar una secuencia de comandos de apagado que intente realizar acciones de limpieza antes de que se interrumpa la VM. Para obtener más información, consulta Controla la interrupción con una secuencia de comandos de apagado.

Antes de comenzar

Prepara tu aplicación de entrenamiento personalizado:

Configura tu trabajo de entrenamiento para usar VMs Spot

Puedes configurar tu trabajo de entrenamiento personalizado para que use VMs Spot si especificas una estrategia SPOT en la configuración de programación.

REST

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • LOCATION: es la región en la que se ejecutará el contenedor o el paquete de Python.
  • PROJECT_ID: El ID del proyecto.
  • JOB_NAME: Obligatorio. Es un nombre visible para CustomJob.
  • Define el trabajo de entrenamiento personalizado:
    • MACHINE_TYPE: El tipo de máquina. Consulta los tipos de máquinas disponibles para el entrenamiento.
    • REPLICA_COUNT: La cantidad de réplicas de trabajadores que se deben usar. En la mayoría de los casos, debes configurar esta opción como 1 para el primer grupo de trabajadores.
    • Si tu aplicación de entrenamiento se ejecuta en un contenedor personalizado, especifica lo siguiente:
      • CUSTOM_CONTAINER_IMAGE_URI: Es el URI de una imagen de contenedor de Docker con el código de entrenamiento. Obtén más información sobre cómo crear una imagen de contenedor personalizada.
      • CUSTOM_CONTAINER_COMMAND: Opcional El comando que se invocará cuando se inicie el contenedor. Este comando anula el punto de entrada predeterminado del contenedor.
      • CUSTOM_CONTAINER_ARGS: Opcional son los argumentos que se transmitirán cuando se inicia el contenedor (opcional).
    • Si tu aplicación de entrenamiento es un paquete de Python que se ejecuta en un contenedor compilado previamente, especifica lo siguiente:
      • EXECUTOR_IMAGE_URI: Es el URI de la imagen de contenedor que ejecuta el código proporcionado. Consulta los contenedores compilados previamente disponibles para el entrenamiento.
      • PYTHON_PACKAGE_URIS: es una lista separada por comas de URI de Cloud Storage que especifican los archivos de paquete de Python que son el programa de entrenamiento y sus paquetes dependientes. La cantidad máxima de URI de paquete es 100.
      • PYTHON_MODULE: es el nombre del módulo de Python que se ejecutará después de instalar los paquetes.
      • PYTHON_PACKAGE_ARGS: Opcional son los argumentos de la línea de comandos que se pasarán al módulo de Python.

Método HTTP y URL:

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

Cuerpo JSON de la solicitud:

{
  "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 tu solicitud, elige una de estas opciones:

curl

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

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

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

$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

La respuesta contiene información sobre las especificaciones y los TRAININGPIPELINE_ID.

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 del SDK de 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 )

¿Qué sigue?