Assurer la disponibilité des ressources à l'aide de réservations de VM

Ce document explique comment créer des jobs qui s'exécutent sur des ressources réservées et comment empêcher les jobs d'utiliser des réservations.

Les réservations sont une fonctionnalité de Compute Engine. Une réservation offre un niveau très élevé d'assurance pour l'obtention de la capacité d'une ou plusieurs VM avec la configuration matérielle spécifiée. Une réservation pour une VM entraîne les coûts de cette VM à partir du moment où vous créez la réservation jusqu'à ce que vous la supprimiez. Toutefois, lorsque vous utilisez cette VM, le coût total est équivalent à celui d'une VM sans réservation.

En général, les réservations sont utiles lorsque la disponibilité de la capacité est d'une importance capitale ou pour éviter les erreurs lors de l'obtention de ressources. Pour Batch en particulier, envisagez d'utiliser des réservations dédiées pour réduire le temps de planification des jobs ou essayez d'utiliser les réservations existantes lorsqu'elles ne sont pas utilisées. Si vous avez des réservations sous-utilisées (par exemple, des réservations requises pour les remises sur engagement d'utilisation), vous pouvez configurer des jobs pour qu'ils tentent de les consommer lorsqu'elles ne sont pas utilisées, afin d'optimiser vos coûts encourus. Si vous souhaitez plutôt donner la priorité à la disponibilité des ressources pour d'autres charges de travail dans votre projet, vous pouvez bloquer explicitement une tâche pour qu'elle ne consomme pas de réservations.

Pour en savoir plus sur les réservations, consultez la documentation Compute Engine sur les réservations.

Avant de commencer

  1. Si vous n'avez jamais utilisé Batch, consultez Premiers pas avec Batch et activez Batch en remplissant les conditions préalables pour les projets et les utilisateurs.
  2. Assurez-vous de disposer des autorisations nécessaires pour créer une réservation ou afficher une réservation existante que les VM d'un job doivent utiliser selon les besoins.
  3. Pour obtenir les autorisations nécessaires pour créer un job, demandez à votre administrateur de vous accorder les rôles IAM suivants :

    Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

    Vous pouvez également obtenir les autorisations requises avec des rôles personnalisés ou d'autres rôles prédéfinis.

Restrictions

En plus des restrictions générales concernant les réservations, Batch présente également les restrictions suivantes :

  • Les VM d'un job ne peuvent pas consommer de réservations partagées.
  • Les VM d'un job ne peuvent pas utiliser de réservations si l'une ou l'autre spécifie une stratégie d'emplacement compact.
  • Si vous créez un job à l'aide de la console Google Cloud , ses VM utilisent automatiquement les réservations correspondantes. Pour consommer une réservation spécifique ou empêcher les VM de consommer des réservations, vous devez définir le champ reservation lorsque vous créez un job à l'aide de gcloud CLI ou de l'API Batch.

Conditions requises

Cette section résume les conditions requises pour que les VM d'un job consomment une réservation. Pour en savoir plus sur toutes les exigences, consultez les exigences générales concernant les réservations dans la documentation Compute Engine et la procédure de planification de votre configuration plus loin dans ce document.

  • Pour que les VM d'un job puissent généralement consommer une réservation, toutes les conditions suivantes doivent être remplies :

    • Le job et la réservation doivent spécifier des propriétés de VM qui correspondent exactement.

    • Vous devez respecter toutes les restrictions de ce document et toutes les autres exigences générales concernant les réservations.

  • Pour que chacune des VM d'un job puisse consommer une réservation, celle-ci doit disposer d'une capacité inutilisée pendant la durée d'exécution de la VM.

    La capacité inutilisée d'une réservation correspond à la différence entre le nombre de VM qu'elle contient et le nombre de VM qui l'utilisent actuellement. Les VM tentent de consommer des réservations chaque fois que vous disposez d'une capacité de réservation inutilisée. Une VM peut donc commencer à consommer une réservation lors de sa création ou plus tard pendant son exécution. Une VM ne cesse de consommer une réservation que lorsqu'elle arrête de s'exécuter ou que la réservation est supprimée.

    En fonction de la capacité de réservation totale inutilisée, aucune, certaines ou toutes les VM d'un job peuvent utiliser des réservations. La quantité de VM réservées peut varier pendant la durée d'exécution du job.

Créer et exécuter un job pouvant consommer des VM réservées

  1. Planifiez votre configuration. Pour vous assurer que votre job et votre réservation sont compatibles, procédez comme suit.

    Si vous souhaitez utiliser une réservation existante, vous devez créer un job avec une configuration correspondante. Sinon, si vous prévoyez de créer une réservation, sélectionnez les options de configuration de votre choix.

    1. Déterminez les propriétés de la réservation. En raison de ces restrictions, le type de partage doit être à projet unique, qui est l'option par défaut pour une réservation. Déterminez les valeurs que vous souhaitez utiliser pour les propriétés de réservation suivantes :

      • Type de consommation*
      • Nombre de VM

      * Le type de consommation de la réservation (spécifiquement ciblée ou automatiquement consommée) détermine les VM qui peuvent utiliser la réservation.

       Le nombre de VM représente la capacité totale d'une réservation. Lorsque vous choisissez cette valeur, tenez compte du nombre de VM du job.

    2. Déterminez les propriétés de la VM pour le job et la réservation. En raison de ces restrictions, ni le job ni la réservation ne peuvent spécifier de stratégie d'emplacement compact, qui est l'option par défaut pour les réservations et les jobs. Déterminez les valeurs que vous souhaitez utiliser pour les propriétés de VM suivantes, qui doivent correspondre exactement à celles de la réservation et du job :

      • Projet
      • Zone*
      • Type de machine
      • Configuration minimale de la plate-forme du processeur (le cas échéant)
      • Type et nombre de GPU (le cas échéant)
      • Type et nombre de disques SSD locaux (le cas échéant)
      • Affinité de réservation#

      * Les VM de job doivent se trouver dans la même zone que les VM réservées. Vous devez inclure cette zone dans le champ allowedLocations[] du job ou, si vous omettez le champ allowedLocations[], définir l'emplacement du job sur la région qui contient cette zone.

       Le job doit définir toutes ces propriétés à l'aide des sous-champs policy ou d'un modèle d'instance de VM. Une tâche ne peut pas spécifier une combinaison de sous-champs policy et d'un modèle.

       Un champ facultatif ne peut pas être défini pour une ressource et omis pour l'autre. Définissez ou omettez le champ facultatif pour la réservation et le job. Si le job spécifie un modèle d'instance de VM, cela s'applique également aux champs du modèle spécifié.

      # Le type de consommation de la réservation détermine l'affinité de réservation requise pour les VM du job, que vous devez spécifier dans le job comme suit :

  2. Préparez la réservation. Si vous ne l'avez pas déjà fait, créez la réservation que vous souhaitez que les VM du job utilisent. Assurez-vous que la réservation possède les propriétés que vous avez prévues.

  3. Créez et exécutez le job. Vous pouvez créer et exécuter un job qui consomme des VM à partir de la réservation préparée à l'aide de gcloud CLI ou de l'API Batch :

    gcloud

    1. Créez un fichier JSON qui spécifie les détails de configuration du job et définit les sous-champs de la ressource d'instance de VM (instances[]) pour qu'ils correspondent exactement aux propriétés de VM d'une réservation.

      Par exemple, pour créer un job de script de base qui utilise des VM à partir d'une réservation, créez un fichier JSON avec le contenu suivant :

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

      Remplacez VM_RESOURCES par les ressources de VM correspondant à la réservation que vous souhaitez que le job consomme en spécifiant les sous-champs instances[] que vous avez planifiés lors des étapes précédentes.

      Par exemple, commencez par la valeur suivante pour 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"
      }
      

      Pour utiliser cette valeur, apportez toutes les modifications suivantes :

      1. Voulez-vous utiliser un modèle d'instance ?

        • Oui : remplacez le champ policy par le champ instanceTemplate et spécifiez un modèle d'instance de VM existant correspondant à la réservation. Par exemple, consultez l'exemple de code pour utiliser un modèle d'instance de VM. Si la réservation utilise des GPU ou des SSD locaux, vous devez également configurer les champs installGpuDrivers et volumes[] de la tâche, respectivement. Sinon, ignorez les autres modifications.

        • Non : remplacez MACHINE_TYPE par le même type de machine que celui de la réservation.

      2. La réservation inclut-elle une plate-forme CPU minimale ?

        • Oui : remplacez MIN_CPU_PLATFORM par la même plate-forme de processeur minimale.

        • Non : supprimez le champ minCpuPlatform.

      3. La réservation inclut-elle des GPU ?

        • Oui : remplacez INSTALL_GPU_DRIVERS, GPU_TYPE et GPU_COUNT pour qu'ils correspondent à la réservation. Par exemple, consultez l'exemple de code pour utiliser des GPU.

        • Non : supprimez les champs installGpuDrivers et accelerators[].

      4. La réservation inclut-elle des disques SSD locaux ?

        • Oui : remplacez LOCAL_SSD_SIZE et LOCAL_SSD_NAME pour qu'ils correspondent à la réservation, puis installez les disques SSD locaux en ajoutant le champ volumes[] au job. Par exemple, consultez l'exemple de code pour utiliser des SSD locaux.

        • Non : supprimez le champ disks[].

      5. La réservation utilise-t-elle le type de consommation spécifiquement ciblé ?

        • Oui : remplacez SPECIFIC_RESERVATION_NAME par le nom de la réservation.

        • Non : supprimez le champ reservation.

      Par exemple, supposons que vous utilisiez une réservation à consommation automatique pour n2-standard-32 VM qui ne spécifie aucune configuration minimale de plate-forme de processeur, ni aucun GPU ni SSD local. De plus, vous ne souhaitez pas spécifier de modèle d'instance de VM. Dans ce cas, vous devez remplacer VM_RESOURCES par la valeur suivante :

      "policy": {
        "machineType": "n2-standard-32"
      }
      
    2. Pour créer et exécuter le job, utilisez la commande gcloud batch jobs submit :

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

      Remplacez les éléments suivants :

      • JOB_NAME : nom du job.

      • LOCATION : emplacement du job. Sauf si le job spécifie le champ allowedLocations[], il doit s'agir de la région contenant la zone de la réservation.

      • JSON_CONFIGURATION_FILE : chemin d'accès à un fichier JSON contenant les détails de configuration du job.

    API

    Envoyez une requête POST à la méthode jobs.create qui définit les sous-champs de la ressource d'instance de VM (instances[]) pour qu'ils correspondent exactement aux propriétés de VM d'une réservation.

    Par exemple, pour créer un job de script de base qui utilise des VM à partir d'une réservation, envoyez la requête suivante :

    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"
      }
    }
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de projet de votre projet.

    • LOCATION : emplacement du job. Sauf si le job spécifie le champ allowedLocations[], il doit s'agir de la région contenant la zone de la réservation.

    • JOB_NAME : nom du job.

    • VM_RESOURCES : ressources de VM correspondant à la réservation que vous souhaitez que le job utilise en spécifiant les sous-champs instances[] que vous avez planifiés lors des étapes précédentes.

      Par exemple, commencez par la valeur suivante pour 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"
      }

      Pour utiliser cette valeur, apportez toutes les modifications suivantes :

      1. Voulez-vous utiliser un modèle d'instance ?

        • Oui : remplacez le champ policy par le champ instanceTemplate et spécifiez un modèle d'instance de VM existant correspondant à la réservation. Par exemple, consultez l'exemple de code pour utiliser un modèle d'instance de VM. Si la réservation utilise des GPU ou des SSD locaux, vous devez également configurer les champs installGpuDrivers et volumes[] de la tâche, respectivement. Sinon, ignorez les autres modifications.

        • Non : remplacez MACHINE_TYPE par le même type de machine que celui de la réservation.

      2. La réservation inclut-elle une plate-forme CPU minimale ?

        • Oui : remplacez MIN_CPU_PLATFORM par la même plate-forme de processeur minimale.

        • Non : supprimez le champ minCpuPlatform.

      3. La réservation inclut-elle des GPU ?

        • Oui : remplacez INSTALL_GPU_DRIVERS, GPU_TYPE et GPU_COUNT pour qu'ils correspondent à la réservation. Par exemple, consultez l'exemple de code pour utiliser des GPU.

        • Non : supprimez les champs installGpuDrivers et accelerators[].

      4. La réservation inclut-elle des disques SSD locaux ?

        • Oui : remplacez LOCAL_SSD_SIZE et LOCAL_SSD_NAME pour qu'ils correspondent à la réservation, puis installez les disques SSD locaux en ajoutant le champ volumes[] au job. Par exemple, consultez l'exemple de code pour utiliser des SSD locaux.

        • Non : supprimez le champ disks[].

      5. La réservation utilise-t-elle le type de consommation spécifiquement ciblé ?

        • Oui : remplacez SPECIFIC_RESERVATION_NAME par le nom de la réservation.

        • Non : supprimez le champ reservation.

      Par exemple, supposons que vous utilisiez une réservation à consommation automatique pour n2-standard-32 VM qui ne spécifie aucune configuration minimale de plate-forme de processeur, ni aucun GPU ni SSD local. De plus, vous ne souhaitez pas spécifier de modèle d'instance de VM. Dans ce cas, vous devez remplacer VM_RESOURCES par la valeur suivante :

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

Créer et exécuter un job qui ne peut pas consommer de VM réservées

Pour empêcher une tâche de consommer des réservations, définissez le champ reservation sur NO_RESERVATION. Pour savoir comment empêcher la consommation de réservations, consultez Empêcher les instances de calcul de consommer des réservations dans la documentation Compute Engine.

Vous pouvez créer et exécuter un job qui ne peut consommer aucune VM réservée à l'aide de gcloud CLI ou de l'API Batch.

gcloud

  1. Créez un fichier JSON qui spécifie les détails de configuration du job et définit le champ reservation sur NO_RESERVATION.

    Par exemple, pour créer un job de script de base qui ne peut pas consommer de réservations, créez un fichier JSON avec le contenu suivant :

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            "policy": {
              "reservation": "NO_RESERVATION"
            }
          }
        ],
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    
  2. Pour créer et exécuter le job, utilisez la commande gcloud batch jobs submit :

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

    Remplacez les éléments suivants :

    • JOB_NAME : nom du job.

    • LOCATION : emplacement du job.

    • JSON_CONFIGURATION_FILE : chemin d'accès à un fichier JSON contenant les détails de configuration du job.

API

Envoyez une requête POST à la méthode jobs.create qui définit le champ reservation sur NO_RESERVATION.

Par exemple, pour créer un job de script de base qui ne peut pas utiliser de réservations, envoyez la requête suivante :

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": [
      {
        "policy": {
          "reservation": "NO_RESERVATION"
        }
      }
    ],
  },
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

Remplacez les éléments suivants :

Étapes suivantes