Utiliser des VM Spot pour l'entraînement

Présentation

Vous pouvez réduire le coût d'exécution de vos jobs d'entraînement personnalisé à l'aide des VM Spot. Les VM spot sont des instances de machine virtuelle (VM) qui dépassent la capacité de Compute Engine. Des remises importantes sont accordées sur les VM Spot. Toutefois, Compute Engine peut à tout moment arrêter ou supprimer (de manière préemptive) des VM Spot, afin de récupérer de la capacité.

Pour en savoir plus, consultez VM Spot.

Limites et exigences

Tenez compte des limites et des exigences suivantes lorsque vous utilisez des VM Spot avec Vertex AI :

  • Toutes les limites des VM Spot s'appliquent lorsque vous utilisez des VM Spot avec Vertex AI.
  • L'utilisation de VM Spot avec Vertex AI n'est possible que pour l'entraînement et la prédiction personnalisés.
  • L'utilisation de VM Spot avec des pods TPU n'est pas possible.
  • L'entraînement Vertex AI ne peut utiliser que des VM Spot avec les séries de machines suivantes :

    • A2
    • A3
  • L'envoi de votre job via la console Google Cloud n'est pas possible.

Facturation

Si vos charges de travail sont tolérantes aux pannes et peuvent résister à de possibles préemptions de VM, les VM Spot peuvent réduire considérablement les coûts liés aux coûts de calcul. Si certaines de vos VM s'arrêtent pendant le traitement, le job se poursuit malgré tout, mais plus lentement. Les VM Spot effectuent vos tâches de traitement par lot sans imposer de charge supplémentaire à vos VM existantes et sans vous obliger à payer le prix fort pour des VM standards supplémentaires. Consultez Gestion de la préemption.

Lorsque vous utilisez des VM Spot, vous êtes facturé en fonction de la durée du job et du type de machine. Vous ne payez pas pour le temps pendant lequel le job est en attente ou préempté.

Gestion de la préemption

Compute Engine peut récupérer des VM Spot à tout moment. Par conséquent, votre job d'entraînement personnalisé doit être tolérant aux pannes pour tirer le meilleur parti des VM Spot. Lorsque les VM Spot sont préemptées, le job d'entraînement personnalisé échoue avec une erreur STOCKOUT, et Compute Engine tente de redémarrer le job jusqu'à six fois. Pour découvrir comment exploiter vos VM Spot de manière optimale, consultez les bonnes pratiques concernant les VM Spot.

Voici quelques-unes des méthodes que vous pouvez utiliser pour rendre votre job d'entraînement personnalisé tolérant aux pannes :

  • Créer des points de contrôle pour enregistrer la progression En stockant régulièrement la progression de votre modèle, vous pouvez vous assurer qu'un job d'entraînement personnalisé terminé peut reprendre à partir du dernier point de contrôle stocké, au lieu de recommencer depuis le début.
  • Utilisez Elastic Horovod. L'entraînement Elastic permet à Horovod d'adapter vos ressources de calcul sans avoir à redémarrer ni à reprendre à partir de points de contrôle. Pour en savoir plus, consultez Elastic Horovod.
  • Utilisez un script d'arrêt. Lorsque Compute Engine préempte une VM Spot, vous pouvez utiliser un script d'arrêt qui tente d'effectuer des actions de nettoyage avant que la VM ne soit préemptée. Pour en savoir plus, consultez Gérer la préemption avec un script d'arrêt.

Avant de commencer

Préparez votre application d'entraînement personnalisé :

Configurer votre job d'entraînement pour utiliser des VM Spot

Vous pouvez configurer votre job d'entraînement personnalisé pour utiliser des VM Spot en spécifiant une stratégie SPOT dans votre configuration de planification.

REST

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • LOCATION : région où le conteneur ou le package Python sera exécuté.
  • PROJECT_ID : l'ID de votre projet.
  • JOB_NAME : valeur obligatoire. nom à afficher pour CustomJob.
  • Définissez la tâche d'entraînement personnalisée :
    • MACHINE_TYPE : type de la machine. Consultez la section Types de machines disponibles pour l'entraînement.
    • REPLICA_COUNT : nombre d'instances dupliquées de nœuds de calcul à utiliser. Dans la plupart des cas, définissez cette valeur sur 1 pour votre premier pool de nœuds de calcul.
    • Si votre application d'entraînement s'exécute dans un conteneur personnalisé, spécifiez les éléments suivants :
      • CUSTOM_CONTAINER_IMAGE_URI : URI d'une image de conteneur Docker avec votre code d'entraînement. Apprenez à créer une image de conteneur personnalisé.
      • CUSTOM_CONTAINER_COMMAND : facultatif. Commande à appeler au démarrage du conteneur. Cette commande ignore le point d'entrée par défaut du conteneur.
      • CUSTOM_CONTAINER_ARGS : facultatif. Arguments à transmettre lors du démarrage du conteneur.
    • Si votre application d'entraînement est un package Python qui s'exécute dans un conteneur prédéfini, spécifiez les éléments suivants :
      • EXECUTOR_IMAGE_URI : URI de l'image de conteneur qui exécute le code fourni. Pour en savoir plus, consultez la liste des conteneurs prédéfinis disponibles pour l'entraînement.
      • PYTHON_PACKAGE_URIS : liste d'URI Cloud Storage séparés par une virgule spécifiant les fichiers de package Python correspondant au programme d'entraînement et ses packages dépendants. Le nombre maximal d'URI de package est de 100.
      • PYTHON_MODULE : nom du module Python à exécuter après l'installation des packages.
      • PYTHON_PACKAGE_ARGS : facultatif. Arguments de ligne de commande à transmettre au module Python.

Méthode HTTP et URL :

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs

Corps JSON de la requête :

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

Pour envoyer votre requête, choisissez l'une des options suivantes :

curl

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

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

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

$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 réponse contient des informations sur les spécifications, ainsi que sur TRAININGPIPELINE_ID.

Python

Pour savoir comment installer ou mettre à jour le SDK Vertex AI pour Python, consultez la section Installer le SDK Vertex AI pour Python. Pour en savoir plus, consultez la documentation de référence de l'API SDK Vertex AI pour 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 )

Étape suivante