Spanner 에뮬레이터를 사용하여 ML 예측 생성

이 페이지에서는 Spanner 에뮬레이터를 사용하여 ML 예측을 생성하는 방법을 설명합니다.

Spanner Vertex AI 통합을 Spanner 에뮬레이터와 함께 사용하여 GoogleSQL 또는 PostgreSQL ML 예측 함수로 예측을 생성할 수 있습니다. 이 에뮬레이터는 Spanner 서버를 모방하는 바이너리로서 단위 및 통합 테스트에도 사용할 수 있습니다. 에뮬레이터를 오픈소스 프로젝트로 사용하거나 Google Cloud CLI를 사용해 로컬에서 사용할 수 있습니다. ML 예측 함수에 대한 자세한 내용은 Spanner Vertex AI 통합 작동 방식을 참조하세요.

에뮬레이터와 함께 모든 모델을 사용하여 예측을 생성할 수 있습니다. Vertex AI Model Garden의 모델 또는 Vertex AI 엔드포인트에 배포된 모델을 사용할 수도 있습니다. 에뮬레이터는 Vertex AI에 연결되지 않으므로 에뮬레이터가 모델 또는 Vertex AI Model Garden에서 사용되거나 Vertex AI 엔드포인트에 배포된 모델의 스키마를 확인할 수 없습니다.

기본적으로 에뮬레이터에서 예측 함수를 사용하면 이 함수는 제공된 모델 입력과 모델 출력 스키마를 기반으로 임의의 값을 생성합니다. 콜백 함수를 사용하여 모델 입력과 출력을 수정하고 특정 동작을 기반으로 예측 결과를 생성할 수 있습니다.

시작하기 전에

Spanner 에뮬레이터 설치

에뮬레이터를 로컬로 설치하거나 GitHub 저장소를 사용하여 설정할 수 있습니다.

모델 선택

ML.PREDICT(GoogleSQL의 경우) 또는 ML_PREDICT_ROW(PostgreSQL의 경우) 함수를 사용할 때 ML 모델의 위치를 지정해야 합니다. 모든 학습된 모델을 사용할 수 있습니다. Vertex AI Model Garden에서 실행 중인 모델이나 Vertex AI 엔드포인트에 배포된 모델을 선택하면 이러한 모델에 대한 inputoutput 값을 제공해야 합니다.

Spanner Vertex AI 통합에 대한 자세한 내용은 Spanner Vertex AI 통합 작동 방식을 참조하세요.

예측 생성하기

에뮬레이터를 사용하여 Spanner ML 예측 함수로 예측을 생성할 수 있습니다.

기본 동작

Spanner 에뮬레이터를 사용하여 엔드포인트에 배포된 모든 모델을 사용하여 예측을 생성할 수 있습니다. 다음 예시에서는 FraudDetection이라는 모델을 사용하여 결과를 생성합니다.

GoogleSQL

ML.PREDICT 함수를 사용하여 예측을 생성하는 방법에 대한 자세한 내용은 SQL을 사용하여 ML 예측 생성을 참조하세요.

모델 등록

모델을 ML.PREDICT 함수와 함께 사용하려면 먼저 CREATE MODEL 문을 사용하고 inputoutput 값을 제공하여 모델을 등록해야 합니다.

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'
);

다음을 바꿉니다.

  • PROJECT_ID: 모델이 있는 Google Cloud 프로젝트의 ID

  • REGION_ID: 모델이 있는 Google Cloud 리전의 ID(예: us-central1)

  • ENDPOINT_ID: 모델 엔드포인트의 ID

예측 실행

ML.PREDICT GoogleSQL 함수를 사용하여 예측을 생성합니다.

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

이 쿼리의 예상 출력은 TRUE입니다.

PostgreSQL

spanner.ML_PREDICT_ROW 함수를 사용하여 예측을 생성하는 방법에 대한 자세한 내용은 SQL을 사용하여 ML 예측 생성을 참조하세요.

예측 실행

spanner.ML_PREDICT_ROW PostgreSQL 함수를 사용하여 예측을 생성합니다.

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

다음을 바꿉니다.

  • PROJECT_ID: 모델이 있는 Google Cloud 프로젝트의 ID

  • REGION_ID: 모델이 있는 Google Cloud 리전의 ID(예: us-central1)

  • ENDPOINT_ID: 모델 엔드포인트의 ID

이 쿼리의 예상 출력은 TRUE입니다.

커스텀 콜백

커스텀 콜백 함수를 사용하여 선택한 모델 동작을 구현하고 특정 모델 입력을 출력으로 변환할 수 있습니다. 다음 예시에서는 Vertex AI Model Garden의 gemini-pro 모델과 Spanner 에뮬레이터를 사용하여 커스텀 콜백을 통해 예측을 생성합니다.

모델에 커스텀 콜백을 사용할 때는 Spanner 에뮬레이터 저장소포크한 다음 빌드하고 배포해야 합니다. Spanner 에뮬레이터를 빌드하고 배포하는 방법에 대한 자세한 내용은 Spanner 에뮬레이터 빠른 시작을 참조하세요.

GoogleSQL

모델 등록

모델을 ML.PREDICT 함수와 함께 사용하려면 먼저 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
);

에뮬레이터가 Vertex AI에 연결되지 않으므로 inputoutput 값을 제공해야 합니다.

다음을 바꿉니다.

  • PROJECT_ID: 모델이 있는 Google Cloud 프로젝트의 ID

  • REGION_ID: 모델이 있는 Google Cloud 리전의 ID(예: us-central1)

콜백

콜백을 사용하여 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);
}

예측 실행

ML.PREDICT GoogleSQL 함수를 사용하여 예측을 생성합니다.

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

이 쿼리의 예상 출력은 "YES"입니다.

PostgreSQL

spanner.ML_PREDICT_ROW PostgreSQL 함수를 사용하여 예측을 생성합니다.

콜백

콜백을 사용하여 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);
}

예측 실행


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

다음을 바꿉니다.

  • PROJECT_ID: 모델이 있는 Google Cloud 프로젝트의 ID

  • REGION_ID: 모델이 있는 Google Cloud 리전의 ID(예: us-central1)

이 쿼리의 예상 출력은 "YES"입니다.

다음 단계