Usar máquinas virtuales de Spot con el entrenamiento

Información general

Puedes reducir el coste de ejecutar tus trabajos de entrenamiento personalizados usando VMs de acceso puntual. Las VMs de aprovisionamiento esporádico son instancias de máquina virtual (VM) que representan el exceso de capacidad de Compute Engine. Las Spot VMs tienen descuentos significativos, pero Compute Engine puede detener o eliminar (interrumpir) de forma preventiva las Spot VMs para recuperar la capacidad en cualquier momento.

Para obtener más información, consulta Máquinas virtuales de acceso puntual.

Limitaciones y requisitos

Ten en cuenta las siguientes limitaciones y requisitos al usar máquinas virtuales de Spot con Vertex AI:

  • Todas las limitaciones de las VMs de Spot se aplican al usar VMs de Spot con Vertex AI.
  • Las VMs de Spot solo se pueden usar con Vertex AI para el entrenamiento y la inferencia personalizados.
  • No se pueden usar máquinas virtuales de acceso puntual con pods de TPU.
  • No se admite el envío de trabajos a través de la consola Google Cloud .

Facturación

Si tus cargas de trabajo son tolerantes a fallos y pueden soportar posibles interrupciones de las VMs, las VMs de acceso puntual pueden reducir significativamente tus costes de computación. Si algunas de tus máquinas virtuales se detienen durante el procesamiento, el trabajo se ralentizará, pero no se detendrá por completo. Las VMs de acceso puntual completan tus tareas de procesamiento por lotes sin añadir carga adicional a tus VMs y sin que tengas que pagar el precio completo de las VMs estándar adicionales. Consulta Gestión de la preferencia.

Cuando usas máquinas virtuales de acceso puntual, se te factura según la duración de la tarea y el tipo de máquina. No se te cobra por el tiempo que la tarea esté en una cola o se haya adelantado.

Gestión de interrupciones

Compute Engine puede reclamar las máquinas virtuales de acceso puntual en cualquier momento. Por lo tanto, tu trabajo de entrenamiento personalizado debe ser tolerante a fallos para sacar el máximo partido a las máquinas virtuales de acceso puntual. Cuando se interrumpen las máquinas virtuales Spot, el trabajo de entrenamiento personalizado falla con un error STOCKOUT y Compute Engine intenta reiniciar el trabajo hasta seis veces. Para saber cómo sacar el máximo partido a tus VMs de acceso puntual, consulta las prácticas recomendadas para VMs de acceso puntual.

Estos son algunos de los métodos que puedes usar para que tu trabajo de entrenamiento personalizado sea tolerante a fallos:

  • Crea puntos de control para guardar el progreso. Si almacenas periódicamente el progreso de tu modelo, puedes asegurarte de que un trabajo de entrenamiento personalizado que se haya terminado pueda reanudarse desde el último punto de control almacenado, en lugar de empezar de nuevo.
  • Usa Elastic Horovod. El entrenamiento elástico permite a Horovod escalar tus recursos de computación sin necesidad de reiniciar ni reanudar desde puntos de control. Para obtener más información, consulta Elastic Horovod.
  • Usa una secuencia de comandos de apagado. Cuando Compute Engine interrumpe temporalmente una VM de acceso puntual, puedes usar una secuencia de comandos de cierre que intente realizar acciones de limpieza antes de que se interrumpa temporalmente la VM. Para obtener más información, consulta Gestionar la preferencia con una secuencia de comandos de cierre.

Antes de empezar

Prepara tu aplicación de entrenamiento personalizado:

Configurar un trabajo de entrenamiento para usar máquinas virtuales de acceso puntual

Puedes configurar tu trabajo de entrenamiento personalizado para que use máquinas virtuales de acceso puntual especificando una estrategia SPOT en la configuración de la programación.

REST

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • LOCATION: la región en la que se ejecutará el contenedor o el paquete de Python.
  • PROJECT_ID: tu ID de proyecto.
  • JOB_NAME: obligatorio. Nombre visible de la 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: número de réplicas de trabajadores que se deben usar. En la mayoría de los casos, asigna el valor 1 a tu primer grupo de trabajadores.
    • Si tu aplicación de entrenamiento se ejecuta en un contenedor personalizado, especifica lo siguiente:
      • CUSTOM_CONTAINER_IMAGE_URI: el URI de una imagen de contenedor Docker con tu código de entrenamiento. Consulta cómo crear una imagen de contenedor personalizada.
      • CUSTOM_CONTAINER_COMMAND: opcional. El comando que se invoca cuando se inicia el contenedor. Este comando anula el punto de entrada predeterminado del contenedor.
      • CUSTOM_CONTAINER_ARGS: opcional. Los argumentos que se deben transferir al iniciar el contenedor.
    • Si tu aplicación de entrenamiento es un paquete de Python que se ejecuta en un contenedor prediseñado, especifica lo siguiente:
      • EXECUTOR_IMAGE_URI: el URI de la imagen del contenedor que ejecuta el código proporcionado. Consulta los contenedores precompilados disponibles para el entrenamiento.
      • PYTHON_PACKAGE_URIS: lista separada por comas de URIs de Cloud Storage que especifican los archivos del paquete de Python que son el programa de entrenamiento y sus paquetes dependientes. El número máximo de URIs de paquetes es 100.
      • PYTHON_MODULE: nombre del módulo de Python que se va a ejecutar después de instalar los paquetes.
      • PYTHON_PACKAGE_ARGS: opcional. Argumentos de línea de comandos que se van a transferir 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, así como el elemento JOB_ID.

Python

Para saber cómo instalar o actualizar el SDK de Vertex AI para Python, consulta el artículo Instalar el SDK de Vertex AI para Python. Para 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
)

Siguientes pasos