Utiliser des réservations avec l'inférence par lot

Ce document explique comment utiliser les réservations Compute Engine pour vous assurer que vos jobs d'inférence par lot disposent des ressources de machines virtuelles (VM) nécessaires à leur exécution.

Les réservations sont une fonctionnalité de Compute Engine. Elles vous permettent de vous assurer que vous disposez des ressources nécessaires pour créer des VM avec le même matériel (mémoire et processeurs virtuels) et les mêmes ressources facultatives (processeurs, GPU, TPU et disques SSD locaux) chaque fois que vous en avez besoin.

Lorsque vous créez une réservation, Compute Engine vérifie que la capacité demandée est disponible dans la zone spécifiée. Si c'est le cas, Compute Engine réserve les ressources et crée la réservation. Les événements suivants se produisent alors :

  • Vous pouvez consommer immédiatement les ressources réservées. Elles restent disponibles jusqu'à ce que vous supprimiez la réservation.
  • Les ressources réservées vous sont facturées au même tarif à la demande que les VM en cours d'exécution, y compris les remises applicables, jusqu'à ce que la réservation soit supprimée. Une VM qui consomme une réservation n'entraîne pas de frais distincts. Vous n'êtes facturé que pour les ressources en dehors de la réservation, telles que les disques ou les adresses IP. Pour en savoir plus, consultez les tarifs des réservations.

Limites et exigences

Lorsque vous utilisez des réservations Compute Engine avec Vertex AI, tenez compte des limites et des exigences suivantes :

  • Vertex AI ne peut utiliser les réservations que pour les CPU, les VM GPU ou les TPU (preview).
  • Vertex AI ne peut pas utiliser les réservations de VM auxquelles des disques SSD locaux sont associés manuellement.
  • L'utilisation de réservations Compute Engine avec Vertex AI n'est possible que pour l'entraînement et l'inférence personnalisés, ainsi que pour Vertex AI Workbench (preview).
  • Pour utiliser une réservation, les propriétés de VM de la réservation doivent correspondre exactement à celles de votre charge de travail Vertex AI. Par exemple, si une réservation spécifie un type de machine a2-ultragpu-8g, la charge de travail Vertex AI ne peut utiliser la réservation que si elle utilise également un type de machine a2-ultragpu-8g. Consultez les conditions requises.
  • Pour utiliser une réservation partagée de VM GPU ou de TPU, vous devez l'utiliser avec son projet propriétaire ou un projet client avec lequel la réservation est partagée. Consultez la section Fonctionnement des réservations partagées.
  • Pour utiliser une réservation SPECIFIC_RESERVATION, accordez le rôle IAM Lecteur Compute au compte de service Vertex AI dans le projet qui possède les réservations (service-${PROJECT_NUMBER}@gcp-sa-aiplatform.iam.gserviceaccount.com, où PROJECT_NUMBER est le numéro du projet qui utilise la réservation).
  • Les services et fonctionnalités suivants ne sont pas compatibles avec l'utilisation de réservations Compute Engine avec l'inférence par lot Vertex AI :

    • Conformité au Federal Risk and Authorization Management Program (FedRAMP)

Facturation

Lorsque vous utilisez des réservations Compute Engine, vous êtes facturé pour les éléments suivants :

  • Tarifs Compute Engine pour les ressources Compute Engine, y compris les remises sur engagement d'utilisation applicables. Consultez la page Tarifs de Compute Engine.
  • Des frais de gestion de l'inférence par lot Vertex AI s'ajoutent à votre utilisation de l'infrastructure. Consultez la page Tarifs des prédictions.

Avant de commencer

Autoriser l'utilisation d'une réservation

Avant de consommer une réservation de CPU, de VM avec GPU ou de TPU, vous devez définir sa règle de partage pour autoriser Vertex AI à consommer la réservation. Pour ce faire, utilisez l'une des méthodes suivantes :

Autoriser la consommation lors de la création d'une réservation

Lorsque vous créez une réservation à projet unique ou partagée de VM avec GPU, vous pouvez autoriser Vertex AI à utiliser la réservation comme suit :

  • Si vous utilisez la console Google Cloud , sélectionnez Partager la réservation dans la section Services Google Cloud.
  • Si vous utilisez Google Cloud CLI, incluez l'option --reservation-sharing-policy définie sur ALLOW_ALL.
  • Si vous utilisez l'API REST, incluez le champ serviceShareType défini sur ALLOW_ALL dans le corps de la requête.

Autoriser la consommation dans une réservation existante

Vous ne pouvez modifier une réservation créée automatiquement de VM avec GPU ou de TPU pour une réservation future qu'après l'heure de début de la réservation.

Pour autoriser Vertex AI à utiliser une réservation existante, utilisez l'une des méthodes suivantes :

Vérifier qu'une réservation est utilisée

Pour vérifier que la réservation est utilisée, consultez la section Vérifier la consommation des réservations dans la documentation Compute Engine.

Obtenir des inférences par lot à l'aide d'une réservation

Pour créer une requête d'inférence par lot qui consomme une réservation Compute Engine de VM GPU, vous pouvez utiliser l'API REST et choisir Cloud Storage ou BigQuery pour la source et la destination.

Cloud Storage

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

  • LOCATION_ID : région où le modèle est stocké et où la tâche de prédiction par lot est exécutée. Exemple :us-central1

  • PROJECT_ID : projet dans lequel la réservation a été créée. Pour utiliser une réservation partagée provenant d'un autre projet, vous devez partager la réservation avec ce projet. Pour en savoir plus, consultez Modifier les projets clients dans une réservation partagée.

  • BATCH_JOB_NAME : nom à afficher du job de prédiction par lot.

  • MODEL_ID : ID du modèle à utiliser pour effectuer des prédictions.

  • INPUT_FORMAT : format des données d'entrée : jsonl, csv, tf-record, tf-record-gzip ou file-list.

  • INPUT_URI : URI Cloud Storage de vos données d'entrée. Peut contenir des caractères génériques.

  • OUTPUT_DIRECTORY : URI Cloud Storage d'un répertoire dans lequel vous souhaitez que Vertex AI enregistre la sortie.

  • MACHINE_TYPE : ressources de machine à utiliser pour ce job de prédiction par lots.

  • ACCELERATOR_TYPE : type d'accélérateur à associer à la machine. Pour en savoir plus sur le type de GPU compatible avec chaque type de machine, consultez GPU pour les charges de travail de calcul.

  • ACCELERATOR_COUNT : nombre d'accélérateurs à associer à la machine.

  • RESERVATION_AFFINITY_TYPE : La valeur doit être ANY, SPECIFIC_RESERVATION ou NONE.

    • ANY signifie que les VM de votre customJob peuvent automatiquement utiliser toute réservation avec des propriétés correspondantes.
    • SPECIFIC_RESERVATION signifie que les VM de votre customJob ne peuvent consommer qu'une réservation que les VM ciblent spécifiquement par son nom.
    • NONE signifie que les VM de votre customJob ne peuvent utiliser aucune réservation. Spécifier NONE a le même effet que d'omettre une spécification d'affinité de réservation.
  • BATCH_SIZE : nombre d'instances à envoyer dans chaque requête de prédiction. La valeur par défaut est 64. L'augmentation de la taille du lot peut entraîner un débit plus élevé, mais elle peut également provoquer l'expiration des requêtes.

  • STARTING_REPLICA_COUNT : nombre de nœuds pour cette tâche de prédiction par lot.

Méthode HTTP et URL :

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs

Corps JSON de la requête :

{
  "displayName": "BATCH_JOB_NAME",
  "model": "projects/PROJECT_ID/locations/LOCATION_ID/models/MODEL_ID",
  "inputConfig": {
    "instancesFormat": "INPUT_FORMAT",
    "gcsSource": {
      "uris": ["INPUT_URI"],
    },
  },
  "outputConfig": {
    "predictionsFormat": "jsonl",
    "gcsDestination": {
      "outputUriPrefix": "OUTPUT_DIRECTORY",
    },
  },
  "dedicatedResources" : {
    "machineSpec" : {
      "machineType": MACHINE_TYPE,
      "acceleratorType": "ACCELERATOR_TYPE",
      "acceleratorCount": ACCELERATOR_COUNT,
      "reservationAffinity": {
        "reservationAffinityType": "RESERVATION_AFFINITY_TYPE",
        "key": "compute.googleapis.com/reservation-name",
        "values": [
          "projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME"
        ]
      }
    },
    "startingReplicaCount": STARTING_REPLICA_COUNT
  },
  "manualBatchTuningParameters": {
    "batch_size": BATCH_SIZE,
  }
}

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_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs"

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_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs" | Select-Object -Expand Content

Vous devriez recevoir une réponse JSON de ce type :

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION_ID/batchPredictionJobs/BATCH_JOB_ID",
  "displayName": "BATCH_JOB_NAME 202005291958",
  "model": "projects/PROJECT_ID/locations/LOCATION_ID/models/MODEL_ID",
  "inputConfig": {
    "instancesFormat": "jsonl",
    "gcsSource": {
      "uris": [
        "INPUT_URI"
      ]
    }
  },
  "outputConfig": {
    "predictionsFormat": "jsonl",
    "gcsDestination": {
      "outputUriPrefix": "OUTPUT_DIRECTORY"
    }
  },
  "state": "JOB_STATE_PENDING",
  "createTime": "2020-05-30T02:58:44.341643Z",
  "updateTime": "2020-05-30T02:58:44.341643Z",
}

BigQuery

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

  • LOCATION_ID : région où le modèle est stocké et où la tâche de prédiction par lot est exécutée. Exemple :us-central1

  • PROJECT_ID : projet dans lequel la réservation a été créée. Pour utiliser une réservation partagée provenant d'un autre projet, vous devez partager la réservation avec ce projet. Pour en savoir plus, consultez Modifier les projets clients dans une réservation partagée.

  • BATCH_JOB_NAME : nom à afficher du job de prédiction par lot.

  • MODEL_ID : ID du modèle à utiliser pour effectuer des prédictions.

  • INPUT_PROJECT_ID : ID du projet Google Cloud à partir duquel vous souhaitez obtenir les données.

  • INPUT_DATASET_NAME : nom de l'ensemble de données BigQuery à partir duquel vous souhaitez obtenir les données.

  • INPUT_TABLE_NAME : nom de la table BigQuery à partir de laquelle vous souhaitez récupérer les données.

  • OUTPUT_PROJECT_ID : ID du projet Google Cloud dans lequel vous souhaitez enregistrer le résultat.

  • OUTPUT_DATASET_NAME : nom de l'ensemble de données BigQuery de destination dans lequel vous souhaitez enregistrer le résultat.

  • OUTPUT_TABLE_NAME : nom de la table BigQuery de destination dans laquelle vous souhaitez enregistrer la sortie.

  • MACHINE_TYPE : ressources de machine à utiliser pour ce job de prédiction par lots.

  • ACCELERATOR_TYPE : type d'accélérateur à associer à la machine. Pour en savoir plus sur le type de GPU compatible avec chaque type de machine, consultez GPU pour les charges de travail de calcul.

  • ACCELERATOR_COUNT : nombre d'accélérateurs à associer à la machine.

  • RESERVATION_AFFINITY_TYPE : La valeur doit être ANY, SPECIFIC_RESERVATION ou NONE.

    • ANY signifie que les VM de votre customJob peuvent automatiquement utiliser toute réservation avec des propriétés correspondantes.
    • SPECIFIC_RESERVATION signifie que les VM de votre customJob ne peuvent consommer qu'une réservation que les VM ciblent spécifiquement par son nom.
    • NONE signifie que les VM de votre customJob ne peuvent utiliser aucune réservation. Spécifier NONE a le même effet que d'omettre une spécification d'affinité de réservation.
  • BATCH_SIZE : nombre d'instances à envoyer dans chaque requête de prédiction. La valeur par défaut est 64. L'augmentation de la taille du lot peut entraîner un débit plus élevé, mais elle peut également provoquer l'expiration des requêtes.

  • STARTING_REPLICA_COUNT : nombre de nœuds pour cette tâche de prédiction par lot.

Méthode HTTP et URL :

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs

Corps JSON de la requête :

{
  "displayName": "BATCH_JOB_NAME",
  "model": "projects/PROJECT_ID/locations/LOCATION_ID/models/MODEL_ID",
  "inputConfig": {
    "instancesFormat": "bigquery",
    "bigquerySource": {
      "inputUri": "bq://INPUT_PROJECT_ID.INPUT_DATASET_NAME.INPUT_TABLE_NAME"
    },
  },
  "outputConfig": {
    "predictionsFormat":"bigquery",
    "bigqueryDestination":{
      "outputUri": "bq://OUTPUT_PROJECT_ID.OUTPUT_DATASET_NAME.OUTPUT_TABLE_NAME"
    }
  },
  "dedicatedResources" : {
    "machineSpec" : {
      "machineType": MACHINE_TYPE,
      "acceleratorType": "ACCELERATOR_TYPE",
      "acceleratorCount": ACCELERATOR_COUNT,
      "reservationAffinity": {
        "reservationAffinityType": "RESERVATION_AFFINITY_TYPE",
        "key": "compute.googleapis.com/reservation-name",
        "values": [
          "projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME"
        ]
      }
    },
    "startingReplicaCount": STARTING_REPLICA_COUNT
  },
  "manualBatchTuningParameters": {
    "batch_size": BATCH_SIZE,
  }
}

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_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs"

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_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs" | Select-Object -Expand Content

Vous devriez recevoir une réponse JSON de ce type :

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION_ID/batchPredictionJobs/BATCH_JOB_ID",
  "displayName": "BATCH_JOB_NAME 202005291958",
  "model": "projects/PROJECT_ID/locations/LOCATION_ID/models/MODEL_ID",
  "inputConfig": {
    "instancesFormat": "jsonl",
    "bigquerySource": {
      "uris": [
        "INPUT_URI"
      ]
    }
  },
  "outputConfig": {
    "predictionsFormat": "jsonl",
    "bigqueryDestination": {
      "outputUri": "OUTPUT_URI"
    }
  },
  "state": "JOB_STATE_PENDING",
  "createTime": "2020-05-30T02:58:44.341643Z",
  "updateTime": "2020-05-30T02:58:44.341643Z",
}

Récupérer les résultats de l'inférence par lot

Lorsqu'une tâche d'inférence par lot est terminée, le résultat de l'inférence est stocké dans le bucket Cloud Storage ou l'emplacement BigQuery que vous avez spécifié dans votre requête.

Étapes suivantes