SQL을 사용하여 ML 예측 생성

목표

이 튜토리얼에서는 다음과 같은 방법을 알아봅니다.

  • Vertex AI 서비스에서 호스팅되는 모델을 DDL 문을 사용하여 Cloud Spanner 스키마에 등록합니다.
  • Cloud Spanner에 저장된 데이터를 통해 예측을 생성하려면 SQL 쿼리에서 이 모델을 참조합니다.

비용

이 튜토리얼에서는 다음과 같은 비용이 청구될 수 있는 Google Cloud 구성요소를 사용합니다.

  • Cloud Spanner
  • Vertex AI

Cloud Spanner 비용에 대한 자세한 내용은 Cloud Spanner 가격 책정 페이지를 참조하세요.

Vertex AI 비용에 대한 자세한 내용은 Vertex AI 가격 책정 페이지를 참조하세요.

시작하기 전에

모델이 이미 학습되었고 Vertex AI 엔드포인트에 배포되었는지 확인합니다.

이 튜토리얼에서는 분류 및 회귀 개요에 설명된 단계에 따라 Vertex AI에 배포된 분류 및 회귀 모델을 사용합니다.

ML 모델 학습 및 배포에 대한 일반적인 정보는 Vertex AI 테이블 형식 데이터 개요를 참조하세요. 하지만 Spanner Vertex AI 통합과 함께 사용하려면 Vertex AI를 사용하여 모델을 학습시킬 필요가 없고 Vertex AI 엔드포인트에만 배포하면 됩니다. 자체 ML 학습 인프라, BigQuery ML 또는 타사 ML 학습 서비스를 포함하여 모든 ML 학습 프레임워크 또는 서비스를 사용하여 모델을 학습시킬 수 있습니다. 데이터가 Cloud Spanner에 저장된 경우 통합 쿼리를 사용할 수 있습니다. 또한 TensorFlow Hub와 같은 공개 모델 저장소에 있는 사전 학습된 ML 모델을 배포할 수 있습니다.

Vertex AI 엔드포인트에 대한 Spanner Vertex AI 통합의 액세스 구성

Cloud Spanner는 Cloud Spanner가 첫 번째 MODEL DDL 문을 실행할 때 자동으로 서비스 에이전트를 만들고 필요한 권한을 부여합니다. Cloud Spanner 데이터베이스와 Vertex AI 엔드포인트가 모두 동일한 프로젝트에 있는 경우 추가 설정이 필요하지 않습니다.

Cloud Spanner 프로젝트에 Cloud Spanner 서비스 에이전트 계정이 없는 경우 다음 명령어를 실행하여 만듭니다.

gcloud beta services identity create --service=spanner.googleapis.com --project={PROJECT}`

단일 역할 부여에 설명된 단계에 따라 Vertex AI 프로젝트의 Cloud Spanner 서비스 에이전트 계정인 service-{PROJECT}@gcp-sa-spanner.iam.gserviceaccount.comCloud Spanner API Service Agent 역할을 부여합니다.

Cloud Spanner 스키마에 원격 모델 등록

Cloud Spanner 스키마에 모델을 등록한 후 Cloud Spanner SQL 쿼리에서 참조할 수 있습니다. 위에서 언급한 튜토리얼을 사용하여 학습되고 배포된 Vertex AI 분류 모델 엔드포인트에 대한 참조를 만들려면 다음 DDL 실행합니다.

CREATE MODEL MyClassificationModel
REMOTE
OPTIONS (
  endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/endpoints/ENDPOINT_ID'
)

여기에서 PROJECT, LOCATION, ENDPOINT_ID는 프로젝트 ID, Vertex AI를 사용하는 리전, Vertex AI 엔드포인트의 ID에 해당합니다. 모델 배포 중에 지정한 값과 동일해야 합니다.

명시적 모델 열

모델의 입력 열과 출력 열은 Vertex AI 인스턴스 및 예측 스키마 파일에서 자동으로 검색됩니다. 대부분의 모델 유형은 스키마 파일을 자동으로 만듭니다. 커스텀 모델의 경우 이러한 파일은 선택사항이며 직접 제공해야 합니다. 모델에 스키마 파일이 없으면 Cloud Spanner 스키마에 명시적으로 열을 지정할 수 있습니다.

CREATE MODEL MyClassificationModel
INPUT (
  length FLOAT64,
  material STRING(MAX),
  tag_array ARRAY<STRING(MAX)>
)
OUTPUT (
  scores ARRAY<FLOAT64>,
  classes ARRAY<STRING(MAX)>
)
REMOTE
OPTIONS (
  endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/endpoints/ENDPOINT_ID'
)

length, material, tag_array 열은 튜토리얼에서 사용된 샘플 분류 모델의 입력 열(특성)에 해당합니다. scoresclasses 열은 AutoML을 사용하여 학습된 모든 분류 모델에서 생성되는 표준 출력 열입니다.

튜토리얼에서 배포된 회귀 모델에 대한 참조를 만들려면 다음 DDL 문을 사용합니다.

CREATE MODEL MyRegressionModel
INPUT (
  age FLOAT64,
  sq_ft INT64,
  code STRING(MAX)
)
OUTPUT (
  value FLOAT64,
  lower_bound FLOAT64,
  upper_bound FLOAT64
)
REMOTE
OPTIONS (
  endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/endpoints/ENDPOINT_ID'
)

여기에서 value, lower_bound, upper_boundAutoML로 학습된 모든 회귀 모델에서 생성되는 표준 열입니다.

장애 조치 모델

모델을 만들 때 여러 Vertex AI 엔드포인트를 제공할 수 있습니다. 이렇게 하면 Cloud Spanner가 목록의 각 엔드포인트로 장애 조치하므로 ML 쿼리의 가용성이 향상됩니다.

CREATE MODEL MyClassificationModel
REMOTE
OPTIONS (
  endpoints = [
    '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/endpoints/ENDPOINT_ID',
    '//aiplatform.googleapis.com/projects/PROJECT_2/locations/LOCATION_2/endpoints/ENDPOINT_ID_2',
    '//aiplatform.googleapis.com/projects/PROJECT_3/locations/LOCATION_3/endpoints/ENDPOINT_ID_3'
  ]
)

각 엔드포인트를 별도의 리전에 배치하여 리전 장애를 완화하는 것이 좋습니다. 또한 각 엔드포인트를 별도의 프로젝트에 배치하여 프로젝트 구성, 권한, 할당량 문제를 완화하는 것이 좋습니다.

사용된 엔드포인트는 동일한 모델을 배포하거나 동일한 스키마를 가질 필요가 없습니다. Cloud Spanner는 지정된 순서대로 장애 조치를 수행하므로 선호되는 엔드포인트를 목록에서 맨 위에 배치하고, 확장성이 높으며 단순화된 소규모 대체 엔드포인트를 그 아래에 배치하여 부하 버스트를 흡수할 수 있습니다.

ML.PREDICT를 사용하여 ML 제공

DQL/DML 쿼리에서 등록된 모델을 사용하여 예측을 생성하려면 ML.PREDICT 함수를 사용합니다.

예를 들어 온라인 예측 및 설명 가져오기에 나와 있는 Vertex AI API에 대한 요청과 유사한 분류 모델 예측 요청을 생성하려면 다음 SQL 쿼리를 사용하면 됩니다.

SELECT scores, classes
FROM ML.PREDICT(
  MODEL MyClassificationModel,
  (SELECT
    3.6 AS length,
    'cotton' AS material,
    ['abc','def'] AS tag_array
  ));

+---------------------------------------------+---------+
| scores                                      | classes |
+---------------------------------------------+---------+
| [0.96771615743637085, 0.032283786684274673] | [0, 1]  |
+---------------------------------------------+---------+

Vertex AI 튜토리얼에 설명된 API 요청과 유사한 회귀 모델에서 예측을 생성하려면 다음 쿼리를 사용합니다.

SELECT value, lower_bound, upper_bound
FROM ML.PREDICT(
  MODEL MyRegressionModel,
  (SELECT
    3.6 AS age,
    5392 AS sq_ft,
    '90331' AS code
  ));

+----------+-------------+-------------+
| value    | lower_bound | upper_bound |
+----------+-------------+-------------+
| 65.14233 | 4.6572      | 164.0279    |
+----------+-------------+-------------+

ML.PREDICT 함수를 사용하려면 대상 모델의 모든 입력 열이 입력 관계에 포함되어야 합니다. 동시에 이 관계에 다른 열이 포함될 수 있습니다. 이 경우 출력 관계로 전달됩니다.

이렇게 하면 커스텀 식별자(예측 프로세스 자체에는 의미가 없음)를 예측 인스턴스와 연결하는 데 도움이 됩니다. 예를 들어 아래 예시에서는 입력 관계에 id 열을 추가합니다. id 열의 값은 예측 인스턴스를 고유하게 식별하며, 생성된 예측 출력 행을 예측 입력 행과 연결하는 데 사용할 수 있습니다(입력 관계에 행이 여러 개 있는 경우). 일반적으로 age 열에 표시된 대로 입력 관계의 모든 열을 출력 관계에 포함할 수 있습니다.

SELECT id, value, age
FROM ML.PREDICT(
  MODEL MyRegressionModel,
  (SELECT
    1 AS id,
    3.6 AS age,
    5392 AS sq_ft,
    '90331' AS code
  ));

+----+----------+-----+
| id | value    | age |
+----+----------+-----+
| 1  | 65.14233 | 3.6 |
+----+----------+-----+