Gerar previsões de ML usando o emulador do Spanner

Nesta página, descrevemos como gerar previsões de ML usando o Spanner emulador.

A integração da Vertex AI com o Spanner pode ser usada com o emulador do Spanner para gerar previsões usando as APIs do GoogleSQL ou do PostgreSQL ML . O emulador é um binário que imita um servidor do Spanner. e também pode ser usado em testes de unidade e integração. É possível usar o emulador como um projeto de código aberto ou localmente usando a CLI do Google Cloud. Para saber mais sobre o funções de previsão de ML, consulte Como funciona a integração da Vertex AI com o Spanner?.

Você pode usar qualquer modelo com o emulador para gerar previsões. Também é possível usar um modelo do Vertex AI Model Garden ou um modelo implantado no endpoint da Vertex AI. Como o emulador não se conecta à Vertex AI, o emulador não pode verificar o modelo ou o esquema dele para qualquer modelo usado Model Garden da Vertex AI ou implantados na Vertex AI endpoints.

Por padrão, quando você usa uma função de previsão com o emulador, a função produz um valor aleatório com base nas entradas do modelo fornecido e o esquema de saída do modelo. É possível usar uma função de callback para modificar o modelo entrada e saída e gerar resultados de previsão com base em comportamentos específicos.

Antes de começar

Instalar o emulador do Spanner

Você pode instalar o emulador localmente. ou configure-o usando o repositório do GitHub.

Selecione um modelo

Quando você usa a ML.PREDICT (para GoogleSQL) ou o ML_PREDICT_ROW (para PostgreSQL), você precisa especificar o local do modelo de ML. Você pode usar qualquer modelo treinado. Se você selecionar um modelo em execução no Vertex AI Model Garden ou um modelo que esteja implantados no endpoint da Vertex AI, você precisa fornecer os valores input e output para esses modelos.

Para saber mais sobre a integração da Vertex AI com o Spanner, consulte Como funciona a integração da Vertex AI com o Spanner?

gere previsões

Você pode usar o emulador para gerar previsões usando a Funções de previsão do Spanner ML.

Comportamento padrão

Você pode usar qualquer modelo implantado em um endpoint com o emulador do Spanner para gerar previsões. O exemplo a seguir usa um modelo chamado FraudDetection para gerar um resultado.

GoogleSQL

Para saber mais sobre como usar a função ML.PREDICT para gerar previsões, consulte Gerar previsões de ML usando SQL.

Registrar o modelo

Antes de poder usar um modelo com ML.PREDICT é preciso registrar o modelo usando a função CRIAR MODELO e forneça os valores input e 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'
);

Substitua:

  • PROJECT_ID: o ID do projeto do Google Cloud em que o modelo está localizado

  • REGION_ID: o ID da região do Google Cloud que o modelo está localizado em, por exemplo, us-central1

  • ENDPOINT_ID: o ID do endpoint do modelo

Executar a previsão

Use o ML.PREDICT Função GoogleSQL para gerar sua previsão.

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

A saída esperada desta consulta é TRUE.

PostgreSQL

Para saber mais sobre como usar a função spanner.ML_PREDICT_ROW para gerar previsões, consulte Gerar previsões de ML usando SQL.

Executar a previsão

Use a função spanner.ML_PREDICT_ROW do PostgreSQL para gerar sua previsão.

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

Substitua:

  • PROJECT_ID: o ID do projeto do Google Cloud em que o modelo está localizado

  • REGION_ID: o ID da região do Google Cloud que o modelo está localizado em, por exemplo, us-central1

  • ENDPOINT_ID: o ID do endpoint do modelo

A saída esperada desta consulta é TRUE.

Callback personalizado

É possível usar uma função de callback personalizada para implementar comportamentos de modelo selecionados e transformar entradas de modelo específicas em saídas. O seguinte usa o modelo gemini-pro do Model Garden da Vertex AI e o emulador do Spanner para gerar previsões usando um callback personalizado.

Ao usar um callback personalizado para um modelo, é necessário criar um fork do repositório do emulador do Spanner, criar e implantar. Para mais informações sobre como criar e implantar o emulador do Spanner, consulte a Guia de início rápido do emulador do Spanner.

GoogleSQL

Registrar o modelo

Antes de usar um modelo com a função ML.PREDICT, é necessário registrá-lo usando a instrução 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
);

Como o emulador não se conecta à Vertex AI, forneça os valores input e output.

Substitua:

  • PROJECT_ID: o ID do projeto do Google Cloud que o modelo está localizado

  • REGION_ID: o ID da região do Google Cloud em que o modelo está localizado, por exemplo, us-central1

Callback

Use um callback para adicionar lógica personalizada ao modelo 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);
}

Executar a previsão

Use a função ML.PREDICT do GoogleSQL para gerar a previsão.

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

A saída esperada desta consulta é "YES".

PostgreSQL

Use a função spanner.ML_PREDICT_ROW do PostgreSQL para gerar sua previsão.

Callback (link em inglês)

Use um callback para adicionar lógica personalizada ao modelo 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);
}

Executar a previsão


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

Substitua:

  • PROJECT_ID: o ID do projeto do Google Cloud em que o modelo está localizado

  • REGION_ID: o ID da região do Google Cloud que o modelo está localizado em, por exemplo, us-central1

A saída esperada dessa consulta é "YES".

A seguir