
Gemini Enterprise Agent Platform의 Model Registry에서 Endpoint로 배포 시도하기
요약
Gemini Enterprise Agent Platform의 Model Registry를 활용하여 scikit-learn 모델을 등록하고 Endpoint로 배포하는 과정을 다룹니다. Terraform을 이용한 인프라 생성부터 모델 등록, 온라인 추론 실행까지의 전체 워크플로우를 설명합니다.
핵심 포인트
- Terraform을 사용하여 Vertex AI Endpoint 생성
- ExperimentModel을 Model Registry에 등록하여 추론 컨테이너 자동 선택
- 학습 환경과 추론 환경의 라이브러리 버전 일치 필요성 강조
- 온라인 추론 시 데이터 형식(NumPy 배열 등) 처리 주의사항
서론
Fusic의 레오나입니다.
이번에는 Custom Training으로 생성한 scikit-learn의 ExperimentModel을 Gemini Enterprise Agent Platform의 Model Registry에 등록하고, Endpoint로 배포하여 온라인 추론을 실행해 보겠습니다.
ExperimentModel은 ML Metadata 상의 Artifact입니다. Endpoint에서 추론에 이용하려면, Model Registry의 Model로 등록하고 Endpoint로 배포해야 합니다.[1]
학습과 모델 선정에 대해서는 지난 블로그에서 다루었습니다.
본 블로그에서는 다음 흐름을 확인합니다.
- Terraform으로 Endpoint를 생성하기
- ExperimentModel을 Model Registry에 등록하기
- Model을 Endpoint로 배포하기
- 온라인 추론 실행하기
검증 환경
| 항목 | 값 |
|---|---|
| 리전 | us-central1 |
| ... |
1. Terraform으로 Endpoint를 생성하기
Endpoint는 Terraform으로 생성합니다. 본 검증에서 사용한 Google Provider 7.41.0에서는, google_vertex_ai_endpoint의 name이 필수였습니다. name에는 맨 앞에 0을 붙이지 않은 10자리 이하의 숫자를 지정합니다.
resource "google_vertex_ai_endpoint" "census_income" {
project = var.project_id
location = var.region
...
project_id, region, endpoint_id는 Terraform 변수로 외부에서 전달합니다.
2. ExperimentModel을 Model Registry에 등록하기
ExperimentModel을 가져와서 register_model로 Model Registry에 등록합니다. register_model은 ExperimentModel에 기록된 프레임워크와 버전을 기반으로 추론 컨테이너를 선택합니다.[2]
import os
from google.cloud import aiplatform
PROJECT_ID = os.environ["GOOGLE_CLOUD_PROJECT"]
...
scikit-learn의 Artifact 디렉토리에는 model.pkl 또는 model.joblib 중 어느 한 가지만 배치합니다. 이번에는 Experiments가 생성한 model.pkl을 그대로 사용했습니다.[3]
또한, 본 검증에서는 scikit-learn 1.5.2로 저장된 모델에 대해 SDK가 scikit-learn 1.6의 추론 컨테이너를 선택했습니다. 다른 버전 간의 pickle 모델 로드는 지원되지 않기 때문에, 운영 환경에서는 학습 환경과 추론 환경의 버전을 맞추거나 커스텀 컨테이너를 사용합니다.[4]
3. Model을 Endpoint로 배포하기
Terraform으로 생성한 Endpoint를 가져와서 등록한 Model을 배포합니다.
ENDPOINT_ID = os.environ["VERTEX_AI_ENDPOINT_ID"]
endpoint = aiplatform.Endpoint(
endpoint_name=(
...
traffic_split의 `
등의 열 이름(column name)으로 지정했었습니다. 하지만 이번에 리스트의 리스트(list of lists) 형식으로 전달한 instances는 모델 측에서 DataFrame이 아닌 배열(array)로 처리되어, 다음과 같은 에러가 발생했습니다.
ValueError:
Specifying the columns using strings is only supported for dataframes.
그래서 학습 데이터를 NumPy 배열로 변환하고, ColumnTransformer의 대상 열을 위치(index)로 지정했습니다.
FEATURES = [
"age",
"education_num",
...
수정된 ExperimentModel은 기존 Model의 Version 2로 등록합니다.
ONLINE_EXPERIMENT_MODEL_ARTIFACT_ID = os.environ[
"ONLINE_EXPERIMENT_MODEL_ARTIFACT_ID"
]
...
이어서 Version 2를 동일한 Endpoint에 배포하고, 트래픽(traffic)을 전환합니다.
serving_model.deploy(
endpoint=endpoint,
deployed_model_display_name="census-income-v2",
...
Version 2에서는 동일한 입력에 대한 추론(inference)이 30회 모두 성공했습니다. Model Registry에서는 동일한 Model ID를 유지하면서 버전을 추가할 수 있으며, serving이나 default와 같은 에일리어스(alias)를 통해 참조 대상을 관리할 수 있습니다.
트래픽을 0%로 설정하더라도 오래된 DeployedModel은 자동으로 Undeploy되지 않습니다. 검증 후에는 불필요한 DeployedModel을 삭제합니다.
리소스 삭제하기
endpoint.undeploy_all(sync=True)
model.delete(sync=True)
Endpoint는 Terraform으로 생성했으므로, 마지막에 terraform destroy를 실행합니다.
마치며
ExperimentModel을 Model Registry에 등록하고, Endpoint에 배포하여 온라인 추론을 실행할 수 있었습니다.
한편, 배포와 상태 확인(Health Check)이 성공했다고 해서 모델이 온라인 추론의 입력 형식을 처리할 수 있다는 것을 보장하지는 않습니다. 이번 사례에서는 DataFrame의 열 이름을 전제로 한 전처리 과정을 배열에 맞게 수정하고, Version 2로 다시 등록함으로써 추론에 성공했습니다.
Google Cloud, Introduction to Model Registry ↩︎
Google Cloud, Log models to an experiment run ↩︎
Google Cloud, Import models into Model Registry ↩︎
scikit-learn, Model persistence ↩︎
Google Cloud, Deploy a model to an endpoint ↩︎
Google Cloud, Get online inferences from custom-trained models ↩︎
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기