Garantiza la disponibilidad de los recursos mediante reservas de VM

En este documento, se explica cómo crear trabajos que se ejecutan en recursos reservados.

Las reservas son una característica de Compute Engine. Una reserva proporciona un nivel de garantía muy alto en cuanto a la obtención de capacidad para una o más VM con la configuración de hardware especificada. Una reserva para una VM genera los costos de esa VM desde el momento en que se crea y hasta que la borras. Sin embargo, mientras consumes esa VM, el costo total equivale a una VM sin reserva.

Por lo general, las reservas son útiles cuando la disponibilidad de la capacidad es de importancia crítica o para evitar errores en la obtención de recursos. En el caso específico de Batch, considera usar reservas dedicadas para minimizar el tiempo de programación de trabajos o intenta usar las reservas existentes mientras no se usan. Si tienes reservas con poco uso, como reservas requeridas para descuentos por compromiso de uso, puedes configurar trabajos a fin de que intenten consumirlos mientras no se usan para optimizar los costos generados.

Si quieres obtener más información sobre las reservas, consulta la documentación de Compute Engine para las reservas.

Antes de comenzar

Restricciones

Además de las restricciones generales para las reservas, Batch también tiene las siguientes restricciones:

  • Las VMs de un trabajo no pueden consumir reservas compartidas.
  • Las VM de un trabajo no pueden consumir reservas si se especifica una política de posición compacta.

Requisitos

En esta sección, se resumen los requisitos para que las VM de un trabajo consuman una reserva. Si deseas obtener más información sobre todos los requisitos, consulta los requisitos generales para las reservas en la documentación de Compute Engine y el procedimiento para planificar la configuración que aparece más adelante en este documento.

  • Para que las VM de un trabajo sean generalmente capaces de consumir una reserva, se deben cumplir todas las condiciones siguientes:

    • El trabajo y la reserva deben especificar las propiedades de VM que coinciden con exactitud.

    • Debes cumplir con todas las restricciones de este documento y todos los demás requisitos generales de las reservas.

  • Para que cada una de las VM de un trabajo consuma una reserva de manera correcta, la reserva debe tener capacidad sin usar disponible durante el tiempo de ejecución de la VM.

    La capacidad sin usar de una reserva es la diferencia entre su recuento de VM y la cantidad de VM que la consumen. Las VMs intentan consumir reservas cuando tienes capacidad de reserva sin usar. Por lo tanto, una VM puede comenzar a consumir una reserva cuando se crea o más adelante en el tiempo de ejecución. Una VM no deja de consumir una reserva hasta que la VM deja de ejecutarse o la reserva se borra.

    Según la capacidad de reserva total sin usar, ninguna, parte o la totalidad de las VM de un trabajo pueden consumir reservas, y la cantidad de VM reservadas puede variar durante el tiempo de ejecución del trabajo.

Crea y ejecuta un trabajo que pueda consumir VMs reservadas

  1. Planifica la configuración. Para asegurarte de que tu trabajo y tu reserva sean compatibles, completa los siguientes pasos.

    Si deseas consumir una reserva que ya existe, debes crear un trabajo con una configuración correspondiente. De lo contrario, si planeas crear una reserva nueva, selecciona las opciones de configuración que prefieras.

    1. Determina las propiedades de la reserva. Debido a las restricciones, el tipo de uso compartido debe ser de single-project, que es la opción predeterminada para una reserva. Determina los valores que quieres usar para las siguientes propiedades de reserva:

      • Tipo de consumo*
      • VM VMs

      * El tipo de consumo de la reserva (orientado específicamente o consumido de forma automática) determina qué VM pueden consumir la reserva.

      El recuento de VM representa la capacidad total de una reserva. Cuando decidas este valor, considera la cantidad de VM del trabajo.

    2. Determina las propiedades de la VM para el trabajo y la reserva. Debido a las restricciones, ni el trabajo ni la reserva pueden especificar una política de posición compacta, que es la opción predeterminada para las reservas y los trabajos. Determina los valores que quieres usar para las siguientes propiedades de VM, que deben coincidir exactamente con la reserva y el trabajo:

      • Proyecto
      • Zona*
      • Tipo de máquina
      • Plataforma de CPU mínima (si corresponde)
      • Tipo y cantidad de GPU (si corresponde)
      • Tipo y cantidad de SSD locales (si corresponde)
      • Afinidad de reserva#

      * Las VM del trabajo deben estar ubicadas en la misma zona que las VM reservadas. Debes incluir esta zona en el campo allowedLocations[] del trabajo o, si omites el campo allowedLocations[], establecer la ubicación del trabajo en la región que contiene esta zona.

      El trabajo debe definir todas estas propiedades mediante los subcampos policy o una plantilla de instancias de VM. Un trabajo no puede especificar una combinación de subcampos policy y una plantilla.

      Un campo opcional no se puede definir para un recurso y omitirse del otro. Omite o define el campo opcional para la reserva y el trabajo. Si el trabajo especifica una plantilla de instancias de VM, esto también se aplica a los campos de la plantilla especificada.

      #El tipo de consumo de la reserva determina la afinidad de reserva necesaria para las VM del trabajo, que debes especificar en el trabajo de la siguiente manera:

      • Si el trabajo usa una plantilla de instancias de VM, esta debe configurar la afinidad de reserva como se explica en la documentación de reservas.
      • Si el trabajo no usa una plantilla y la reserva tiene un objetivo específico, especifica el nombre de la reserva en el campo reservation del trabajo.
      • De lo contrario, si el trabajo no usa una plantilla y la reserva se consume de forma automática, omite el campo reservation del trabajo.
  2. Prepara la reserva. Si aún no lo hiciste, crea la reserva que deseas que consuman las VM del trabajo. Asegúrate de que la reserva tenga las propiedades que planeaste.

  3. Crea y ejecuta el trabajo. Puedes crear y ejecutar un trabajo que consuma VM de la reserva preparada con gcloud CLI o la API de Batch:

    gcloud

    1. Crea un archivo JSON que especifique los detalles de configuración del trabajo que establezca los subcampos de recurso de instancia de VM (instances[]) para que coincidan de manera exacta con las propiedades de VM de una reserva.

      Por ejemplo, para crear un trabajo de secuencia de comandos básico que consuma VM de una reserva, crea un archivo JSON con el siguiente contenido:

      {
        "taskGroups": [
          {
            "taskSpec": {
              "runnables": [
                {
                  "script": {
                    "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                  }
                }
              ]
            },
            "taskCount": 3
          }
        ],
        "allocationPolicy": {
          "instances": [
            {
              VM_RESOURCES
            }
          ],
        },
        "logsPolicy": {
          "destination": "CLOUD_LOGGING"
        }
      }
      

      Reemplaza VM_RESOURCES por los recursos de VM que coinciden con la reserva que deseas que consuma el trabajo. Para ello, especifica los subcampos instances[] que planificaste en los pasos anteriores.

      Por ejemplo, comienza con el siguiente valor de VM_RESOURCES:

      "installGpuDrivers": INSTALL_GPU_DRIVERS,
      "policy": {
        "machineType": "MACHINE_TYPE",
        "minCpuPlatform": "MIN_CPU_PLATFORM",
        "accelerators": [
          {
            "type": "GPU_TYPE",
            "count": GPU_COUNT
          }
        ],
        "disks": [
          {
            "newDisk": {
              "sizeGb": LOCAL_SSD_SIZE,
              "type": "local-ssd"
            },
            "deviceName": "LOCAL_SSD_NAME"
          }
        ],
        "reservation": "SPECIFIC_RESERVATION_NAME"
      }
      

      Para usar este valor, realiza los siguientes cambios:

      1. ¿Quieres usar una plantilla de instancias?

        • Sí: Reemplaza el campo policy por el campo instanceTemplate y especifica una plantilla de instancias de VM existente que coincida con la reserva. Por ejemplo, consulta la muestra de código para usar una plantilla de instancias de VM. Si la reserva usa GPU o SSD locales, también debes configurar los campos installGpuDrivers y volumes[] del trabajo, respectivamente. De lo contrario, omite los cambios restantes.

        • No: Reemplaza MACHINE_TYPE por el mismo tipo de máquina que la reserva.

      2. ¿La reserva incluye una plataforma de CPU mínima?

        • Sí: Reemplaza MIN_CPU_PLATFORM por la misma plataforma de CPU mínima.

        • No: Quita el campo minCpuPlatform.

      3. ¿La reserva incluye GPU?

        • Sí: Reemplaza INSTALL_GPU_DRIVERS, GPU_TYPE y GPU_COUNT para que coincidan con la reserva. Por ejemplo, consulta la muestra de código para usar GPU.

        • No: Quita los campos installGpuDrivers y accelerators[].

      4. ¿La reserva incluye SSD locales?

        • Sí: Reemplaza LOCAL_SSD_SIZE y LOCAL_SSD_NAME para que coincidan con la reserva y activa los SSD locales. Para ello, agrega el campo volumes[] al trabajo. Por ejemplo, consulta la muestra de código para usar SSD locales.

        • No: Quita el campo disks[].

      5. ¿La reserva usa el tipo de consumo segmentado de forma específica?

        • Sí: Reemplaza SPECIFIC_RESERVATION_NAME por el nombre de la reserva.

        • No: Quita el campo reservation.

      Por ejemplo, supongamos que usas una reserva consumida automáticamente para las VM n2-standard-32 que no especifica ninguna plataforma de CPU mínima, GPU ni SSD locales. Además, no es recomendable especificar una plantilla de instancias de VM. En ese caso, debes reemplazar VM_RESOURCES por el siguiente valor:

      "policy": {
        "machineType": "n2-standard-32"
      }
      
    2. Para crear y ejecutar el trabajo, usa el comando gcloud batch jobs submit:

      gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE
      

      Reemplaza lo siguiente:

      • JOB_NAME: Es el nombre del trabajo.

      • LOCATION: Es la ubicación del trabajo. A menos que el trabajo especifique el campo allowedLocations[], esta debe ser la región que contiene la zona de la reserva.

      • JSON_CONFIGURATION_FILE: Es la ruta de acceso a un archivo JSON con los detalles de configuración del trabajo.

    API

    Realiza una solicitud POST al método jobs.create que configura los subcampos de recursos de instancia de VM (instances[]) para que coincidan de manera exacta con las propiedades de VM de una reserva.

    Por ejemplo, para crear un trabajo de secuencia de comandos básico que consuma VM de una reserva, realiza la siguiente solicitud:

    POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            VM_RESOURCES
          }
        ],
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID del proyecto.

    • LOCATION: Es la ubicación del trabajo. A menos que el trabajo especifique el campo allowedLocations[], esta debe ser la región que contiene la zona de la reserva.

    • JOB_NAME: Es el nombre del trabajo.

    • VM_RESOURCES: Los recursos de VM que coinciden con la reserva que deseas que consuma el trabajo mediante la especificación de los subcampos instances[] que planificaste en los pasos anteriores.

      Por ejemplo, comienza con el siguiente valor de VM_RESOURCES:

      "installGpuDrivers": INSTALL_GPU_DRIVERS,
      "policy": {
        "machineType": "MACHINE_TYPE",
        "minCpuPlatform": "MIN_CPU_PLATFORM",
        "accelerators": [
          {
            "type": "GPU_TYPE",
            "count": GPU_COUNT
          }
        ],
        "disks": [
          {
            "newDisk": {
              "sizeGb": LOCAL_SSD_SIZE,
              "type": "local-ssd"
            },
            "deviceName": "LOCAL_SSD_NAME"
          }
        ],
        "reservation": "SPECIFIC_RESERVATION_NAME"
      }
      

      Para usar este valor, realiza los siguientes cambios:

      1. ¿Quieres usar una plantilla de instancias?

        • Sí: Reemplaza el campo policy por el campo instanceTemplate y especifica una plantilla de instancias de VM existente que coincida con la reserva. Por ejemplo, consulta la muestra de código para usar una plantilla de instancias de VM. Si la reserva usa GPU o SSD locales, también debes configurar los campos installGpuDrivers y volumes[] del trabajo, respectivamente. De lo contrario, omite los cambios restantes.

        • No: Reemplaza MACHINE_TYPE por el mismo tipo de máquina que la reserva.

      2. ¿La reserva incluye una plataforma de CPU mínima?

        • Sí: Reemplaza MIN_CPU_PLATFORM por la misma plataforma de CPU mínima.

        • No: Quita el campo minCpuPlatform.

      3. ¿La reserva incluye GPU?

        • Sí: Reemplaza INSTALL_GPU_DRIVERS, GPU_TYPE y GPU_COUNT para que coincidan con la reserva. Por ejemplo, consulta la muestra de código para usar GPU.

        • No: Quita los campos installGpuDrivers y accelerators[].

      4. ¿La reserva incluye SSD locales?

        • Sí: Reemplaza LOCAL_SSD_SIZE y LOCAL_SSD_NAME para que coincidan con la reserva y activa los SSD locales. Para ello, agrega el campo volumes[] al trabajo. Por ejemplo, consulta la muestra de código para usar SSD locales.

        • No: Quita el campo disks[].

      5. ¿La reserva usa el tipo de consumo segmentado de forma específica?

        • Sí: Reemplaza SPECIFIC_RESERVATION_NAME por el nombre de la reserva.

        • No: Quita el campo reservation.

      Por ejemplo, supongamos que usas una reserva consumida automáticamente para las VM n2-standard-32 que no especifica ninguna plataforma de CPU mínima, GPU ni SSD locales. Además, no es recomendable especificar una plantilla de instancias de VM. En ese caso, debes reemplazar VM_RESOURCES por el siguiente valor:

      "policy": {
        "machineType": "n2-standard-32"
      }
      

¿Qué sigue?