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

Ce document explique comment créer des jobs qui s'exécutent sur des ressources réservées.

Les réservations sont une fonctionnalité de Compute Engine. Une réservation offre un niveau d'assurance très élevé quant à l'obtention de capacité pour une ou plusieurs VM avec la configuration matérielle spécifiée. Une réservation de VM entraîne les coûts de cette VM à compter de sa création et jusqu'à sa suppression. Toutefois, même si vous consommez cette VM, le coût total équivaut à celui d'une VM sans réservation.

En règle générale, 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 des ressources. Pour Batch, envisagez d'utiliser des réservations dédiées afin de réduire le temps de planification des tâches, ou essayez d'utiliser des réservations existantes lorsqu'elles ne sont pas utilisées. Si vous avez des réservations sous-utilisées, telles que les réservations requises pour les remises sur engagement d'utilisation, vous pouvez configurer des tâches pour tenter de les consommer lorsqu'elles ne sont pas utilisées, afin d'optimiser les coûts encourus.

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

Avant de commencer

Restrictions

Outre les restrictions générales pour les réservations, Batch impose également les restrictions suivantes:

  • Les VM d'un job ne peuvent pas utiliser les réservations partagées.
  • Les VM d'une tâche ne peuvent pas utiliser les réservations si vous spécifiez une stratégie d'emplacement compact.

Conditions requises

Cette section récapitule les exigences pour que les VM d'un job utilisent 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, ainsi que la procédure de planification de la configuration plus loin dans ce document.

  • Pour que les VM d'une tâche soient généralement capables de consommer une réservation, toutes les conditions suivantes doivent être remplies:

    • La tâche et la réservation doivent spécifier des propriétés de VM correspondant exactement.

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

  • Pour que chacune des VM d'une tâche puisse consommer une réservation, la réservation doit disposer d'une capacité inutilisée disponible 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 et le nombre de VM qui la consomment actuellement. Les VM tentent de consommer les réservations chaque fois que vous disposez d'une capacité de réservation inutilisée. Une VM peut ainsi commencer à consommer une réservation lors de sa création ou ultérieurement au cours de son exécution. Une VM n'arrête de consommer une réservation que lorsqu'elle cesse de fonctionner ou que la réservation n'est pas supprimée.

    Selon votre capacité totale de réservation inutilisée, aucune, une partie ou la totalité des VM d'un job peut consommer des réservations, et le nombre de VM réservées peut varier au cours de 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 tâche 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 réservation. En raison des restrictions, le type de partage doit être single-project (Projet unique), ce 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é ou consommé automatiquement) détermine quelles VM peuvent utiliser la réservation.

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

    2. Déterminez les propriétés de VM du job et de la réservation. En raison de ces restrictions, ni la tâche, 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 tâches. Déterminez les valeurs que vous souhaitez utiliser pour les propriétés de VM suivantes, qui doivent correspondre exactement à la réservation et à la tâche:

      • Projet
      • Zone*
      • Type de machine
      • Configuration minimale de la plate-forme de 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 la tâche doivent se trouver dans la même zone que les VM réservées. Vous devez inclure cette zone dans le champ allowedLocations[] de la tâche ou, si vous omettez le champ allowedLocations[], définissez l'emplacement de la tâche sur la région qui contient cette zone.

      La tâche 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 de l'autre. Définissez ou omettez le champ facultatif pour la réservation et la tâche. Si la tâche 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 de la tâche, que vous devez spécifier dans la tâche comme suit:

  2. Préparez la réservation. Si vous ne l'avez pas déjà fait, créez la réservation que les VM de la tâche doivent utiliser. Assurez-vous que la réservation inclut les propriétés que vous avez planifiées.

  3. Créez et exécutez la tâche. 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 de la tâche et définit les sous-champs de 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 une tâche de script de base qui utilise les VM 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 la tâche utilise en spécifiant les sous-champs instances[] que vous avez planifiés lors des étapes précédentes.

      Par exemple, partez de 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 respectivement les champs installGpuDrivers et volumes[] de la tâche. Sinon, ignorez les modifications restantes.

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

      2. La réservation inclut-elle une configuration minimale de plate-forme de processeur ?

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

        • Non:supprimez le champ minCpuPlatform.

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

        • Oui:remplacez INSTALL_GPU_DRIVERS, GPU_TYPE et GPU_COUNT pour correspondre à la réservation. 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[] à la tâche. Consultez l'exemple de code pour utiliser des disques 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 consommée automatiquement pour les VM n2-standard-32, qui ne spécifie aucune configuration minimale de plate-forme de processeur, GPU ou 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 la tâche, 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 de la tâche.

      • LOCATION: lieu de la tâche. À moins que le job ne spécifie le champ allowedLocations[], il doit s'agir de la région qui contient la zone de la réservation.

      • JSON_CONFIGURATION_FILE: chemin d'accès à un fichier JSON contenant les détails de configuration de la tâche.

    API

    Envoyez une requête POST à la méthode jobs.create qui définit les sous-champs de 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 une tâche de script de base qui utilise les VM d'une réservation, exécutez 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 votre projet.

    • LOCATION: lieu de la tâche. À moins que le job ne spécifie le champ allowedLocations[], il doit s'agir de la région qui contient la zone de la réservation.

    • JOB_NAME: nom de la tâche.

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

      Par exemple, partez de 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 respectivement les champs installGpuDrivers et volumes[] de la tâche. Sinon, ignorez les modifications restantes.

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

      2. La réservation inclut-elle une configuration minimale de plate-forme de processeur ?

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

        • Non:supprimez le champ minCpuPlatform.

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

        • Oui:remplacez INSTALL_GPU_DRIVERS, GPU_TYPE et GPU_COUNT pour correspondre à la réservation. 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[] à la tâche. Consultez l'exemple de code pour utiliser des disques 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 consommée automatiquement pour les VM n2-standard-32, qui ne spécifie aucune configuration minimale de plate-forme de processeur, GPU ou 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"
      }
      

Étapes suivantes