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

Ce document explique comment créer des tâches exécutées sur des ressources réservées et comment empêcher les tâches d'utiliser des réservations.

Les réservations sont une fonctionnalité de Compute Engine. Une réservation offre un niveau d'assurance très élevé pour obtenir de la capacité pour une ou plusieurs VM avec la la configuration matérielle spécifiée. Une réservation pour une VM entraîne entre la création et la suppression de la réservation. Toutefois, lorsque vous utilisez cette VM, le coût total est équivalent à 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 cruciale ou pour éviter les erreurs lors de l'obtention de ressources. Pour Batch en particulier, envisagez d'utiliser des réservations dédiées réduire le temps de planification des jobs, ou essayer d'utiliser des des réservations lorsqu'elles ne sont pas utilisées. Si vous avez des réservations sous-utilisées, telles que les réservations requises pour remises sur engagement d'utilisation, peuvent configurer des jobs pour tenter de les utiliser alors qu'ils ne sont pas utilisés essayez d'optimiser les coûts engendrés. Si vous souhaitez prioriser la disponibilité des ressources pour d'autres charges de travail de votre projet, vous pouvez empêcher explicitement une tâche de consommer des 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 auparavant, consultez Premiers pas avec Batch et activez Batch en suivant la 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'une tâche doivent utiliser si nécessaire.
  3. Pour obtenir les autorisations nécessaires à la création d'un job, demandez à votre administrateur de vous accorder le rôles IAM suivants:

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

    Vous pouvez également obtenir les autorisations requises via 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, les lots sont également soumis aux 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 consommer de réservations si elles spécifient une stratégie d'emplacement compact.

Conditions requises

Cette section résume les exigences à respecter pour que les VM d'une tâche consomment une réservation. Pour en savoir plus sur toutes les conditions requises, consultez la conditions générales pour les réservations dans la documentation Compute Engine pour planifier votre configuration plus loin dans ce document.

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

    • L'ordre 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, la réservation doit disposer de capacité inutilisée le temps d'exécution de la VM.

    La capacité inutilisée d'une réservation correspond à la différence entre ses Nombre de VM et nombre de VM qui les utilisent actuellement. Les VM tentent de consommer les réservations chaque fois que vous disposez d'une capacité de réservation inutilisée. Ainsi, une VM peut commencer à consommer soit lors de la création de la VM, soit ultérieurement lors de son exécution. Une VM ne cesse pas de consommer une réservation tant qu'elle n'est pas arrêtée ou que la réservation n'est pas supprimée.

    Selon votre capacité de réservation totale inutilisée, aucune, une partie ou l'intégralité d'une les VM du job peuvent consommer des réservations, et la quantité de VM réservées peut varient tout au long de l'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 qui existe déjà, vous devez créer un avec une configuration correspondante. Sinon, si vous envisagez de créer nouvelle réservation, sélectionnez les options de configuration de votre choix.

    1. Déterminer les propriétés de la réservation En raison des 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 (ciblé spécifiquement ou consommé automatiquement) détermine les VM pouvant utiliser la réservation.

      Le nombre de VM représente la capacité totale d'une réservation. Tenez compte de cette valeur le nombre de VM du job.

    2. Déterminez les propriétés de VM pour le job et la réservation. En raison des restrictions, ni le job ni la réservation ne peuvent spécifier une stratégie d'emplacement compact (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 pour 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 SSD locaux (le cas échéant)
      • Affinité de réservation#

      * Les VM associées à des jobs doivent être situées dans la même zone que des VM réservées. Vous devez inclure cette zone dans le champ allowedLocations[] ou, en cas d'omission du champ Champ allowedLocations[], définissez le lieu du job à la région qui contient cette zone.

      La tâche doit définir toutes ces propriétés à l'aide de l'une des deux méthodes suivantes : les sous-champs policy ou 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.

      Vous ne pouvez pas définir un champ facultatif pour une ressource et l'omettre de l'autre. Définissez ou omettez le champ facultatif pour la réservation et la tâche. 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 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 vous souhaitez que les VM de la tâche utilisent. Assurez-vous que la réservation possède que vous aviez prévues.

  3. Créez et exécutez le job. Vous pouvez créer et exécuter une tâche qui consomme des VM à partir de la réservation préparée à l'aide de la CLI gcloud 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 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 les VM d'un 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 la VM. correspondant à la réservation que le job doit utiliser spécifiant les sous-champs instances[] que vous avez planifiés dans le les é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 policy. avec le champ instanceTemplate et spécifiez modèle d'instance de VM correspondant à la réservation. Par exemple : consultez l'exemple de code à l'aide d'un modèle d'instance de VM. Si la réservation utilise des GPU ou des SSD locaux, vous devez également configurer le champ installGpuDrivers du job et volumes[] respectivement. Sinon, ignorez les étapes restantes des modifications.

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

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

        • 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. Consultez par exemple l'exemple de code pour utiliser des GPU.

        • Non : supprimez le champ installGpuDrivers et le champ accelerators[].

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

        • Oui : remplacez LOCAL_SSD_SIZE et LOCAL_SSD_NAME pour correspondre à la réservation, puis montez les SSD locaux en ajoutant le champ volumes[] à la tâche. 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 ciblé spécifiquement ?

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

        • Non : supprimez le champ reservation.

      Par exemple, supposons que vous utilisiez automatiquement pour n2-standard-32 VM qui n'en spécifie aucune configuration minimale de la 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: emplacement du travail. À moins que le job ne spécifie 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 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 une tâche de script de base qui consomme 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 de la tâche. À moins que le job ne spécifie 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 : les ressources de VM correspondant à la réservation que vous souhaitez que la tâche consomme en spécifiant les sous-champs instances[] que vous avez planifiés aux é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 policy. avec le champ instanceTemplate et spécifiez modèle d'instance de VM correspondant à la réservation. Par exemple : consultez l'exemple de code à l'aide d'un modèle d'instance de VM. Si la réservation utilise des GPU ou des SSD locaux, vous devez également configurer le champ installGpuDrivers du job et volumes[] respectivement. 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 minimum de la plate-forme de processeur ?

        • 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:remplacer INSTALL_GPU_DRIVERS, GPU_TYPE et GPU_COUNT pour faire correspondre la réservation. Par exemple, consultez l'exemple de code pour à l'aide de GPU.

        • Non : supprimez le champ installGpuDrivers et le champ accelerators[].

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

        • Oui : remplacez LOCAL_SSD_SIZE et LOCAL_SSD_NAME pour correspondre à la réservation, puis montez les SSD locaux en ajoutant le champ volumes[] à la tâche. 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 ciblé spécifiquement ?

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

        • Non : supprimez le champ reservation.

      Par exemple, supposons que vous utilisiez automatiquement pour n2-standard-32 VM qui n'en spécifie aucune configuration minimale de la 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"
      }

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 à NO_RESERVATION. Pour savoir comment empêcher la réservation de consommation, voir Créer des VM sans consommer de réservation dans la documentation Compute Engine.

Vous pouvez créer et exécuter un job ne pouvant pas utiliser de VM réservées à l'aide de la classe gcloud CLI ou 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 le champ reservation sur NO_RESERVATION.

    Par exemple, pour créer une tâche de script de base qui ne peut pas consommer de réservations, créez un fichier JSON contenant les éléments suivants :

    {
      "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 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: emplacement du travail.

    • 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 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, 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 :

Étape suivante