Générer des prédictions de ML à l'aide de l'émulateur Spanner

Cette page explique comment générer des prédictions de ML à l'aide de l'émulateur Spanner.

L'intégration de Vertex AI dans Spanner peut être utilisée avec l'émulateur Spanner pour générer des prédictions à l'aide des fonctions de prédiction de ML GoogleSQL ou PostgreSQL. L'émulateur est un binaire qui imite un serveur Spanner et peut également être utilisé dans les tests unitaires et d'intégration. Vous pouvez utiliser l'émulateur en tant que projet Open Source ou localement à l'aide de la Google Cloud CLI. Pour en savoir plus sur les fonctions de prédiction du ML, consultez la section Comment fonctionne l'intégration de Vertex AI dans Spanner ?.

Vous pouvez utiliser n'importe quel modèle avec l'émulateur pour générer des prédictions. Vous pouvez également utiliser un modèle provenant de Vertex AI Model Garden ou un modèle déployé sur votre point de terminaison Vertex AI. Étant donné que l'émulateur ne se connecte pas à Vertex AI, il ne peut pas valider le modèle ni son schéma pour les modèles utilisés depuis Vertex AI Model Garden ou déployés sur les points de terminaison Vertex AI.

Par défaut, lorsque vous utilisez une fonction de prédiction avec l'émulateur, la fonction génère une valeur aléatoire basée sur les entrées de modèle et le schéma de sortie du modèle fournis. Vous pouvez utiliser une fonction de rappel pour modifier les entrées et les sorties du modèle, et générer des résultats de prédiction en fonction de comportements spécifiques.

Avant de commencer

Installer l'émulateur Spanner

Vous pouvez installer l'émulateur localement ou le configurer à l'aide du dépôt GitHub.

Sélectionnez un modèle

Lorsque vous utilisez la fonction ML.PREDICT (pour GoogleSQL) ou ML_PREDICT_ROW (pour PostgreSQL), vous devez spécifier l'emplacement du modèle de ML. Vous pouvez utiliser n'importe quel modèle entraîné. Si vous sélectionnez un modèle qui s'exécute dans Vertex AI Model Garden ou un modèle déployé sur votre point de terminaison Vertex AI, vous devez fournir les valeurs input et output de ces modèles.

Pour en savoir plus sur l'intégration de Vertex AI dans Spanner, consultez la page Comment fonctionne l'intégration de Vertex AI dans Spanner ?.

Générer des prédictions

Vous pouvez utiliser l'émulateur pour générer des prédictions à l'aide des fonctions de prédiction ML de Spanner.

Comportement par défaut

Vous pouvez utiliser n'importe quel modèle déployé sur un point de terminaison avec l'émulateur Spanner pour générer des prédictions. L'exemple suivant utilise un modèle appelé FraudDetection pour générer un résultat.

GoogleSQL

Pour en savoir plus sur l'utilisation de la fonction ML.PREDICT pour générer des prédictions, consultez la page Générer des prédictions de ML à l'aide de SQL.

Enregistrer le modèle

Avant de pouvoir utiliser un modèle avec la fonction ML.PREDICT, vous devez l'enregistrer à l'aide de l'instruction CREATE MODEL, et fournir les valeurs input et output:

CREATE MODEL FraudDetection
INPUT (Amount INT64, Name STRING(MAX))
OUTPUT (Outcome BOOL)
REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/PROJECT_ID/locations/REGION_ID/endpoints/ENDPOINT_ID'
);

Remplacez les éléments suivants :

  • PROJECT_ID: ID du projet Google Cloud dans lequel se trouve le modèle

  • REGION_ID: ID de la région Google Cloud dans laquelle se trouve le modèle (par exemple, us-central1)

  • ENDPOINT_ID: ID du point de terminaison du modèle

Exécuter la prédiction

Utilisez la fonction GoogleSQL ML.PREDICT pour générer votre prédiction.

SELECT Outcome
FROM ML.PREDICT(
    MODEL FraudDetection,
    (SELECT 1000 AS Amount, "John Smith" AS Name))

Le résultat attendu de cette requête est TRUE.

PostgreSQL

Pour en savoir plus sur l'utilisation de la fonction spanner.ML_PREDICT_ROW pour générer des prédictions, consultez la page Générer des prédictions de ML à l'aide de SQL.

Exécuter la prédiction

Utilisez la fonction PostgreSQL spanner.ML_PREDICT_ROW pour générer votre prédiction.

SELECT (spanner.ml_predict_row(
'projects/`MODEL_ID`/locations/`REGION_ID`/endpoints/`ENDPOINT_ID`',
'{"instances": [{"Amount": "1000", "Name": "John Smith"}]}'
)->'predictions'->0->'Outcome')::boolean

Remplacez les éléments suivants :

  • PROJECT_ID: ID du projet Google Cloud dans lequel se trouve le modèle

  • REGION_ID: ID de la région Google Cloud dans laquelle se trouve le modèle (par exemple, us-central1)

  • ENDPOINT_ID: ID du point de terminaison du modèle

Le résultat attendu de cette requête est TRUE.

Rappel personnalisé

Vous pouvez utiliser une fonction de rappel personnalisée pour implémenter les comportements de modèle sélectionnés et transformer des entrées de modèle spécifiques en sorties. L'exemple suivant utilise le modèle gemini-pro de Vertex AI Model Garden et l'émulateur Spanner pour générer des prédictions à l'aide d'un rappel personnalisé.

Lorsque vous utilisez un rappel personnalisé pour un modèle, vous devez dupliquer le dépôt de l'émulateur Spanner, puis le créer et le déployer. Pour en savoir plus sur la création et le déploiement de l'émulateur Spanner, consultez le guide de démarrage rapide de l'émulateur Spanner.

GoogleSQL

Enregistrer le modèle

Avant de pouvoir utiliser un modèle avec la fonction ML.PREDICT, vous devez l'enregistrer à l'aide de l'instruction CREATE MODEL:

CREATE MODEL GeminiPro
INPUT (prompt STRING(MAX))
OUTPUT (content STRING(MAX))
REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/PROJECT_ID/locations/REGION_ID/publishers/google/models/gemini-pro',
default_batch_size = 1
);

Comme l'émulateur ne se connecte pas à Vertex AI, vous devez fournir les valeurs input et output.

Remplacez les éléments suivants :

  • PROJECT_ID: ID du projet Google Cloud dans lequel se trouve le modèle

  • REGION_ID: ID de la région Google Cloud dans laquelle se trouve le modèle (par exemple, us-central1)

Rappel

Utilisez un rappel pour ajouter une logique personnalisée au modèle GeminiPro.

absl::Status ModelEvaluator::Predict(
    const googlesql::Model* model,
    const CaseInsensitiveStringMap<const ModelColumn>& model_inputs,
    CaseInsensitiveStringMap<ModelColumn>& model_outputs) {
  // Custom logic for GeminiPro.
  if (model->Name() == "GeminiPro") {
    RET_CHECK(model_inputs.contains("prompt"));
    RET_CHECK(model_inputs.find("prompt")->second.value->type()->IsString());
    RET_CHECK(model_outputs.contains("content"));
    std::string content;

    // Process prompts used in tests.
    int64_t number;
    static LazyRE2 is_prime_prompt = {R"(Is (\d+) a prime number\?)"};
    if (RE2::FullMatch(
            model_inputs.find("prompt")->second.value->string_value(),
            *is_prime_prompt, &number)) {
        content = IsPrime(number) ? "Yes" : "No";
    } else {
        // Default response.
        content = "Sorry, I don't understand";
    }
    *model_outputs["content"].value = googlesql::values::String(content);
    return absl::OkStatus();
  }
  // Custom model prediction logic can be added here.
  return DefaultPredict(model, model_inputs, model_outputs);
}

Exécuter la prédiction

Utilisez la fonction GoogleSQL ML.PREDICT pour générer votre prédiction.

SELECT content
    FROM ML.PREDICT(MODEL GeminiPro, (SELECT "Is 7 a prime number?" AS prompt))

Le résultat attendu de cette requête est "YES".

PostgreSQL

Utilisez la fonction PostgreSQL spanner.ML_PREDICT_ROW pour générer votre prédiction.

Rappel

Utilisez un rappel pour ajouter une logique personnalisée au modèle GeminiPro.

absl::Status ModelEvaluator::PgPredict(
    absl::string_view endpoint, const googlesql::JSONValueConstRef& instance,
    const googlesql::JSONValueConstRef& parameters,
    lesql::JSONValueRef prediction) {
  if (endpoint.ends_with("publishers/google/models/gemini-pro")) {
    RET_CHECK(instance.IsObject());
    RET_CHECK(instance.HasMember("prompt"));
    std::string content;

    // Process prompts used in tests.
    int64_t number;
    static LazyRE2 is_prime_prompt = {R"(Is (\d+) a prime number\?)"};
    if (RE2::FullMatch(instance.GetMember("prompt").GetString(),
                        *is_prime_prompt, &number)) {
        content = IsPrime(number) ? "Yes" : "No";
    } else {
        // Default response.
        content = "Sorry, I don't understand";
    }
    prediction.SetToEmptyObject();
    prediction.GetMember("content").SetString(content);
    return absl::OkStatus();
  }

  // Custom model prediction logic can be added here.
  return DefaultPgPredict(endpoint, instance, parameters, prediction);
}

Exécuter la prédiction


SELECT (spanner.ml_predict_row(
'projects/`PROJECT_ID`/locations/`REGION_ID`/publishers/google/models/gemini-pro',
'{"instances": [{"prompt": "Is 7 a prime number?"}]}'
)->'predictions'->0->'content')::text

Remplacez les éléments suivants :

  • PROJECT_ID: ID du projet Google Cloud dans lequel se trouve le modèle

  • REGION_ID: ID de la région Google Cloud dans laquelle se trouve le modèle (par exemple, us-central1)

Le résultat attendu de cette requête est "YES".

Étape suivante